Warum unterstützt C # const nicht auf Klassen- / Methodenebene?

Ich habe mich eine Weile gefragt, warum C # nicht unterstütztconst auf Klassen- oder Methodenebene. Ich weiß, dass Jon Skeet seit langem Unterstützung für Unveränderlichkeit wünscht, und ich erinnere mich, dass die Verwendung der C ++ - Syntax der Funktion const dabei helfen könnte. Durch Hinzufügen eines const-Schlüsselworts auf Klassenebene hätten wir vollständige Unterstützung.

Meine Frage ist nun, warum das C # -Team diese Art von Unterstützung nicht entwickelt hat.

Ich würde mir vorstellen, dass alles mit einer Überprüfung zur Kompilierungszeit oder über Attribute erstellt werden kann, ohne dass die CLR geändert werden muss. Ich habe nichts dagegen, dass Code das const-Verhalten durch Reflektion überschreibt.

Stell dir das vor:

<code>const class NumberContainer
{
    public int Number { get; }
}
</code>

.. Solch eine Klasse konnte nur zur Konstruktionszeit gefüllt werden, also bräuchten wir einen Konstruktor, um einen Int zu erfassen.

Ein weiteres Beispiel ist const auf Methodenebene:

<code>public int AddNumbers(NumberContainer n1, NumberContainer n2) const
{
   return n1.Number + n2.Number;
}
</code>

Const-Level-Methoden sollten nicht in der Lage sein, den Status in ihrer eigenen Klasse oder an sie übergebene Instanzen von Referenztypen zu ändern. Außerdem konnten Funktionen auf Konstantenebene nur andere Funktionen auf Konstantenebene aufrufen, während sie sich in ihrem Gültigkeitsbereich befanden.

Ich bin mir nicht sicher, ob Lambdas und Delegierte alles zu schwierig (oder unmöglich) machen würden, aber ich bin mir sicher, dass jemand mit mehr Erfahrung in Sprache und Compiler-Design es mir sagen könnte.

Wie Steve B in den Kommentaren hervorhob, war die Existenz vonreadonly macht die Dinge etwas komplexer, als const undreadonly sind in der Nähe der gleichen währendruntime, aberreadonly Werte können während der Kompilierung nicht ermittelt werden. Ich denke, wir könnten habenconst undreadonly Niveau, aber das könnte zu verwirrend sein?

Was ist der Grund, warum dies nicht implementiert wird? Usability-Bedenken (Verständnis von Konstanz in C ++ ist für neue Benutzer normalerweise recht schwierig), Bedenken hinsichtlich des Sprachdesigns (nicht möglich) oder einfach Prioritätsbedenken (die Tage der Unveränderlichkeit sind vorbei).

Antworten auf die Frage(6)

Ihre Antwort auf die Frage