Warum ist es möglich, den Wert eines Readonly-Feldes, aber nicht eines Const mit Reflektion zu ändern?

8

Warum ist es möglich, den Wert eines readonly -Feldes durch Reflexion zu ändern, aber nicht den Wert eines const ?

%Vor%

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:

%Vor%

später schreiben

%Vor%

entspricht dem Schreiben

%Vor%

In der Tat mein Code

%Vor%

wird in IL durch

ersetzt %Vor%     
Guillaume 17.03.2013, 07:57
quelle

2 Antworten

9

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.

    
ColinE 17.03.2013, 08:00
quelle
2

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.

    
PSL 17.03.2013 08:03
quelle

Tags und Links