Beim Kompilieren meiner Klasse erhalte ich eine Fehlermeldung:
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 machen. Was mache ich falsch? Und warum lass ich das nicht?
Ein const
Objekt ist immer static
.
Aus der C # -Sprachspezifikation (PDF-Seite 287 - oder 300. Seite der PDF):
Auch wenn Konstanten als statische Elemente betrachtet werden, erfordert oder erlaubt eine Konstantendeklaration keinen statischen Modifikator.
Ein const-Member wird vom Compiler als statisch angesehen und impliziert eine Konstantenwertsemantik. Dies bedeutet, dass Verweise auf die Konstante anstelle eines Verweises auf das Member als Wert des constant-Members in den using-Code kompiliert werden können.
Mit anderen Worten, ein const-Member, der den Wert 10 enthält, wird möglicherweise in Code kompiliert, der ihn anstelle eines Verweises auf das const-Member als Zahl 10 verwendet.
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, könnte er beide als Werte in den Zielcode kompilieren.
C # 's const
ist genau das gleiche wie Javas final
, außer dass es absolut immer static
ist. Meiner Meinung nach ist es nicht unbedingt erforderlich, dass eine const
-Variable nicht static
ist, aber wenn Sie auf eine const
-Variable zugreifen müssen, die nicht static
ist -nur können Sie tun:
class MyClass
{
private const int myLowercase_Private_Const_Int = 0;
public const int MyUppercase_Public_Const_Int = 0;
/*
You can have the `private const int` lowercase
and the `public int` Uppercase:
*/
public int MyLowercase_Private_Const_Int
{
get
{
return MyClass.myLowercase_Private_Const_Int;
}
}
/*
Or you can have the `public const int` uppercase
and the `public int` slighly altered
(i.e. an underscore preceding the name):
*/
public int _MyUppercase_Public_Const_Int
{
get
{
return MyClass.MyUppercase_Public_Const_Int;
}
}
/*
Or you can have the `public const int` uppercase
and get the `public int` with a 'Get' method:
*/
public int Get_MyUppercase_Public_Const_Int()
{
return MyClass.MyUppercase_Public_Const_Int;
}
}
Nun, jetzt ist mir klar, dass diese Frage vor 4 Jahren gestellt wurde, aber da ich ungefähr 2 Stunden Arbeit in diese Antwort gesteckt habe, die darin besteht, alle möglichen Arten der Beantwortung und Code-Formatierung auszuprobieren, poste ich sie immer noch. :)
Aber fürs Protokoll, ich fühle mich immer noch irgendwie albern.
Von MSDN: http://msdn.Microsoft.com/en-us/library/acdd6hb7.aspx
... Auch wenn ein const-Feld eine Konstante zur Kompilierungszeit ist , kann das readonly-Feld für Laufzeitkonstanten verwendet werden ...
Die Verwendung von static in const-Feldern ist also wie der Versuch, ein definiertes (mit #define) static in C/C++ zu machen. .
const ist statisch ähnlich. Wir können auf beide Variablen mit dem Klassennamen zugreifen, diff ist jedoch statisch und const nicht.