Warum ist es möglich, den Wert eines readonly
-Feldes durch Reflexion zu ändern, aber nicht den Wert eines const
?
Ich habe diese Antwort gelesen, also verstehe ich, dass es erlaubt ist, die Regeln für readonly
zu brechen, aber warum nicht für const
in diesem Fall? Ich bin sicher, es gibt einen guten Grund, aber ich kann nicht herausfinden, was es sein könnte.
- Bearbeiten -
Wenn ich mir den obigen Code mit ildasm anschaue, wird der Wert des Feldes readonly
zur Kompilierzeit gesetzt. Nicht auf dem Feld selbst, anders als bei const
, sondern im Konstruktor der Klasse. Ich bin also nicht sicher, warum man "überschrieben" werden kann, aber nicht der andere.
Was ich meine ist, auch wenn der Wert von const
im Binärcode "hart-codiert" ist, ist der Grund dafür, dass es nicht möglich ist, eine technische Einschränkung im Framework selbst zu ändern, weil "es bereits gesetzt ist". oder nur eine Designentscheidung. Ich sehe keinen Grund, warum es irgendwo eine "Magie" geben könnte, die den const
so verändert, wie er es für readonly
macht.
- Bearbeiten 2 -
Um die akzeptierte Antwort hinzuzufügen, gibt es auch diese andere Antwort , die ziemlich interessant ist. Was ich bei dieser Frage als erstes nicht bekommen habe, ist, dass der Wert hinter dem const
wirklich überall dort ersetzt wird, wo er im Code verwendet wird. Mit dieser Erklärung:
später schreiben
%Vor%entspricht dem Schreiben
%Vor%In der Tat mein Code
%Vor%wird in IL durch
ersetzt %Vor% Weil const
-Felder zur Kompilierzeit 'gesetzt' sind, d. h. der Compiler ersetzt die const
mit dem gegebenen Wert während der Kompilierung. Als Ergebnis der Funktionsweise von const
-Werten werden ihre Werte in jede Assembly kopiert, die sie verwendet. Während readonly
-Felder zur Laufzeit ausgewertet werden.
Grund ist, dass die Konstanten während der Kompilierzeit selbst durch den Wert ersetzt werden. Aber readonly Felder sind nicht. Sie können einen Wert für schreibgeschützte Felder entweder in deklaraiotn und / oder im Konstruktor dieser Klasse festlegen. Ich hoffe, dies beantwortet Ihre Frage.
Tags und Links c# reflection