Per qualche motivo, ho sempre pensato che ai campi readonly
fosse associato un sovraccarico, che ho pensato mentre il CLR tiene traccia del fatto che un campo readonly
è stato inizializzato o meno. Il sovraccarico qui sarebbe un po 'di memoria extra per tenere traccia dello stato e un controllo quando si assegna un valore.Esiste un sovraccarico di runtime in sola lettura?
Forse ho assunto questo perché non sapevo un campo readonly
poteva essere inizializzato solo all'interno di un costruttore o all'interno della dichiarazione campo stesso e senza un controllo in fase di esecuzione, non sarebbe in grado di garantire che non è essere assegnato a più volte in vari modi. Ma ora lo so, potrebbe facilmente essere controllato staticamente dal compilatore C#, giusto? Quindi è così?
Un altro motivo è che ho letto che l'utilizzo di readonly
ha un impatto "lieve" sulle prestazioni, ma non sono mai entrati in questa affermazione e non riesco a trovare informazioni su questo argomento, quindi la mia domanda. Non so quale altro impatto sulle prestazioni potrebbe esserci a parte i controlli di runtime.
Una terza ragione è che ho visto che readonly
è conservato nel IL compilato come initonly
, quindi qual è la ragione di queste informazioni per essere in IL, se readonly
non è altro che una garanzia da parte del compilatore C# che il campo non viene mai assegnato all'esterno di un costruttore o dichiarazione?
D'altra parte, ho scoperto che è possibile impostare il valore di un readonly int
tramite riflessione senza il CLR generando un'eccezione, che non dovrebbe essere possibile se readonly
era un controllo di runtime.
Quindi la mia ipotesi è: il 'readonlyness' è solo una funzione di compilazione del tempo, qualcuno può confermare/negare questo? E se lo è, qual è la ragione per cui queste informazioni devono essere incluse nell'IL?
Whoops, hai trovato la stessa analisi delle prestazioni che ho fatto. Quindi +1 a te e ho cancellato la mia risposta (meno dettagliata). – Eddie
Ha perfettamente senso, grazie :) – JulianR