Oltre alle altre buone risposte, aggiungerò ancora un altro motivo per non mettere la costanza in stile C in C #. Tu hai detto:
contrassegniamo il parametro come const per essere sicuri che il suo stato non verrà modificato nel metodo.
Se const lo facesse davvero, sarebbe fantastico. Const non lo fa. La const è una bugia!
Const non fornisce alcuna garanzia che io possa effettivamente utilizzare. Supponi di avere un metodo che accetta una cosa const. Sono disponibili due autori del codice: la persona che scrive il chiamante e la persona che scrive il chiamato . L'autore del chiamato ha fatto prendere al metodo una const. Cosa possono presumere i due autori sia invariante rispetto all'oggetto?
Niente. Il chiamato è libero di eliminare const e mutare l'oggetto, quindi il chiamante non ha alcuna garanzia che chiamare un metodo che accetta un const in realtà non lo muterà. Allo stesso modo, il chiamato non può presumere che il contenuto dell'oggetto non cambierà durante l'azione del chiamato; il chiamato potrebbe chiamare qualche metodo mutante su un alias non const dell'oggetto const, e ora il cosiddetto oggetto const è cambiato .
La const in stile C non fornisce alcuna garanzia che l'oggetto non cambierà e quindi è rotto. Ora, C ha già un sistema di tipi deboli in cui puoi reinterpretare il cast di un double in un int, se lo vuoi davvero, quindi non dovrebbe sorprendere che abbia un sistema di tipi debole rispetto a const. Ma C # è stato progettato per avere un buon sistema di tipi, un sistema di tipi in cui quando dici "questa variabile contiene una stringa", la variabile contiene effettivamente un riferimento a una stringa (o null). Non vogliamo assolutamente inserire un modificatore "const" in stile C nel sistema dei tipi perché non vogliamo che il sistema dei tipi sia una bugia . Vogliamo che il sistema di tipi sia forte in modo che tu possa ragionare correttamente sul tuo codice.
Cost in C è una linea guida ; in pratica significa "puoi fidarti di me per non provare a mutare questa cosa". Non dovrebbe essere nel sistema dei tipi ; le cose nel sistema di tipi dovrebbero essere un fatto sull'oggetto su cui puoi ragionare, non una linea guida al suo utilizzo.
Ora, non fraintendermi; solo perché const in C è profondamente rotto non significa che l'intero concetto sia inutile. Quello che mi piacerebbe vedere è una forma effettivamente corretta e utile di annotazione "const" in C #, un'annotazione che sia gli umani che i compilatori potrebbero usare per aiutarli a comprendere il codice e che il runtime potrebbe usare per fare cose come la paralellizzazione automatica e altre ottimizzazioni avanzate.
Ad esempio, immagina di poter "disegnare una scatola" attorno a un pezzo di codice e dire " Garantisco che questo pezzo di codice non esegue mutazioni a nessun campo di questa classe" in un modo che potrebbe essere controllato dal compilatore. Oppure disegna una scatola che dice "questo metodo puro muta lo stato interno dell'oggetto ma non in alcun modo che sia osservabile fuori dalla scatola". Un oggetto del genere non può essere automaticamente multi-thread in modo sicuro, ma può essere memorizzato automaticamente . Ci sono tutti i tipi di annotazioni interessanti che potremmo inserire nel codice che consentirebbero ottimizzazioni complete e una comprensione più approfondita. Possiamo fare molto meglio della debole annotazione const in stile C.
Tuttavia, sottolineo che questa è solo una speculazione . Non abbiamo piani fissi per inserire questo tipo di funzionalità in qualsiasi ipotetica versione futura di C #, se ce n'è una, che non abbiamo annunciato in un modo o nell'altro. È qualcosa che mi piacerebbe vedere e qualcosa che potrebbe richiedere l'imminente enfasi sull'elaborazione multi-core, ma niente di tutto ciò dovrebbe essere in alcun modo interpretato come una previsione o una garanzia di qualsiasi caratteristica particolare o direzione futura per C #.
Ora, se quello che vuoi è semplicemente un'annotazione sulla variabile locale che è un parametro che dice "il valore di questo parametro non cambia in tutto il metodo", allora, certo, sarebbe facile. Potremmo supportare locals "readonly" e parametri che sarebbero inizializzati una volta, e un errore in fase di compilazione da modificare nel metodo. La variabile dichiarata dall'istruzione "using" è già di questo tipo locale; potremmo aggiungere un'annotazione opzionale a tutti i locali e parametri per farli agire come variabili "usando". Non è mai stata una funzionalità con priorità molto alta, quindi non è mai stata implementata.