Beim Versuch, meine Klasse zu kompilieren, wird folgende Fehlermeldung angezeigt:
Die Konstante
'NamespaceName.ClassName.CONST_NAME'
kann nicht als statisch markiert werden.
an der Linie:
public static const string CONST_NAME = "blah";
Ich könnte das die ganze Zeit in Java tun. Was mache ich falsch? Und warum lässt es mich das nicht tun?
Aus der C # -Sprachspezifikation (PDF-Seite 287 - oder 300. Seite des PDF):
quelle
Ein const-Element wird vom Compiler als statisch betrachtet und impliziert eine Konstantwertsemantik. Dies bedeutet, dass Verweise auf die Konstante anstelle eines Verweises auf das Element in den using-Code als Wert des konstanten Elements kompiliert werden können.
Mit anderen Worten, ein const-Element, das den Wert 10 enthält, wird möglicherweise in Code kompiliert, der ihn als Nummer 10 verwendet, anstatt auf das const-Element zu verweisen.
Dies unterscheidet sich von einem statischen schreibgeschützten Feld, das immer als Referenz auf das Feld kompiliert wird.
Beachten Sie, dass dies Pre-JIT ist. Wenn der JIT'ter ins Spiel kommt, kompiliert er möglicherweise beide als Werte in den Zielcode.
quelle
C #
const
ist genau das gleiche wie Javafinal
, außer dass es absolut immer iststatic
. Meiner Meinung nach muss eineconst
Variable nicht unbedingt nicht seinstatic
, aber wenn Sie nicht nur auf eineconst
Variablestatic
zugreifen müssen, können Sie Folgendes tun:Nun, jetzt ist mir klar, dass diese Frage vor 4 Jahren gestellt wurde, aber da ich ungefähr 2 Stunden Arbeit, bestehend aus dem Ausprobieren aller möglichen Arten der Beantwortung und Code-Formatierung, in diese Antwort gesteckt habe, poste ich sie immer noch. :) :)
Aber fürs Protokoll, ich fühle mich immer noch irgendwie albern.
quelle
final
verhält sich Java genau wie C #readonly
und überhaupt nicht wieconst
.Von MSDN: http://msdn.microsoft.com/en-us/library/acdd6hb7.aspx
... Während ein const-Feld eine Konstante zur Kompilierungszeit ist, kann das schreibgeschützte Feld auch für Laufzeitkonstanten verwendet werden ...
Die Verwendung von static in const-Feldern ist also wie der Versuch, eine definierte (mit #define) static in C / C ++ zu erstellen ... Da sie in der Kompilierungszeit durch ihren Wert ersetzt wird, wird sie natürlich einmal für alle Instanzen initiiert (= static). .
quelle
const ist ähnlich wie static. Wir können auf beide Variablen mit dem Klassennamen zugreifen, aber diff ist statisch. Variablen können geändert werden und const nicht.
quelle