Sono sorpreso che sembra esserci un tale consenso qui che il non virtuale per impostazione predefinita è il modo giusto di fare le cose. Scenderò dall'altra parte - penso pragmatica - del recinto.
La maggior parte delle giustificazioni mi si legge come il vecchio argomento "Se ti diamo il potere potresti farti del male". Dai programmatori ?!
Mi sembra che il programmatore che non sapeva abbastanza (o ha avuto abbastanza tempo) per progettare la propria libreria per ereditarietà e / o estensibilità sia il programmatore che ha prodotto esattamente la libreria che probabilmente dovrò aggiustare o modificare - esattamente il libreria in cui la possibilità di sovrascrivere sarebbe più utile.
Il numero di volte in cui ho dovuto scrivere codice brutto e disperato (o abbandonare l'uso e lanciare la mia soluzione alternativa) perché non posso scavalcare di gran lunga, supera di gran lunga il numero di volte in cui sono stato morso ( ad esempio in Java) sovrascrivendo dove il progettista potrebbe non aver considerato che avrei potuto.
Non virtuale per impostazione predefinita mi rende la vita più difficile.
AGGIORNAMENTO: È stato sottolineato [abbastanza correttamente] che in realtà non ho risposto alla domanda. Quindi, e scusandomi per il ritardo ...
Volevo essere in grado di scrivere qualcosa di conciso come "C # implementa metodi come non virtuali per impostazione predefinita perché è stata presa una decisione sbagliata che apprezzava i programmi più dei programmatori". (Penso che potrebbe essere in qualche modo giustificato in base ad alcune delle altre risposte a questa domanda, come le prestazioni (ottimizzazione prematura, chiunque?) O la garanzia del comportamento delle classi.)
Tuttavia, mi rendo conto che sto solo affermando la mia opinione e non quella risposta definitiva che Stack Overflow desidera. Sicuramente, ho pensato, al livello più alto la risposta definitiva (ma inutile) è:
Per impostazione predefinita, non sono virtuali perché i progettisti del linguaggio avevano una decisione da prendere ed è quello che hanno scelto.
Ora immagino che il motivo esatto per cui hanno preso quella decisione non lo faremo mai ... oh, aspetta! La trascrizione di una conversazione!
Quindi sembrerebbe che le risposte e i commenti qui sui pericoli dell'override delle API e sulla necessità di progettare esplicitamente per l'ereditarietà siano sulla strada giusta, ma mancano tutti di un importante aspetto temporale: la preoccupazione principale di Anders era mantenere l'implicito di una classe o API contratto tra le versioni . E penso che in realtà sia più preoccupato di consentire alla piattaforma .Net / C # di cambiare sotto il codice piuttosto che preoccuparsi della modifica del codice utente sulla piattaforma. (E il suo punto di vista "pragmatico" è l'esatto opposto del mio perché guarda dall'altra parte.)
(Ma non potevano semplicemente aver scelto virtual-by-default e poi pepato "finale" attraverso il codice base? Forse non è proprio la stessa cosa .. e Anders è chiaramente più intelligente di me, quindi lascerò mentire.)
this
riferimento è null. Vedi qui per maggiori informazioni.