Pour une raison quelconque, j'ai toujours supposé que les champs readonly
étaient associés à un surcoût, ce que je considérais comme le suivi par CLR si un champ readonly
avait été initialisé ou non. L'overhead ici serait une utilisation supplémentaire de la mémoire pour garder une trace de l'état et une vérification lors de l'attribution d'une valeur. Peut-être que j'ai supposé cela parce que je ne savais pas qu'un champ readonly
pouvait seulement être initialisé à l'intérieur d'un constructeur ou dans la déclaration de champ lui-même et sans une vérification d'exécution, vous ne seriez pas en mesure de garantir qu'il n'est pas assigné à plusieurs reprises dans diverses méthodes. Mais maintenant je sais cela, il pourrait facilement être vérifié statiquement par le compilateur C#, non? Alors est-ce le cas? Une autre raison est que j'ai lu que l'utilisation de readonly
a un impact «léger» sur les performances, mais ils ne sont jamais allés dans cette affirmation et je ne trouve pas d'informations sur ce sujet, d'où ma question. Je ne sais pas quel autre impact sur les performances il pourrait y avoir en dehors des chèques d'exécution.Y a-t-il un surcoût d'exécution en lecture seule?
Une troisième raison est que j'ai vu que readonly
est conservée dans la compilation IL comme initonly
, alors quelle est la raison de cette information est dans l'IL si readonly
est rien de plus qu'une garantie par le compilateur C# que le champ n'est jamais assigné à l'extérieur d'un constructeur ou d'une déclaration? D'autre part, j'ai découvert que vous pouvez définir la valeur d'un readonly int
par réflexion sans que le CLR ne lève une exception, ce qui ne devrait pas être possible si readonly
était un contrôle d'exécution.
Donc, ma conjecture est la suivante: la 'readonlyness' est seulement une fonctionnalité de compilation, quelqu'un peut-il confirmer/infirmer cela? Et si c'est le cas, quelle est la raison pour laquelle cette information doit être incluse dans l'IL?
Oups, vous avez trouvé la même analyse de performance que j'ai faite. Donc +1 pour vous et j'ai supprimé ma réponse (moins détaillée). – Eddie
Donne un sens parfait, merci :) – JulianR