it-swarm.com.de

Warum kann ich in meiner Klasse keine "public static const string S =" stuff "haben?

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?

287
jjnguy

Ein const Objekt ist immer static.

527
Joel Coehoorn

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.

90
splattne

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.

6
Meowmaritus

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. .

5
uriel

const ist statisch ähnlich. Wir können auf beide Variablen mit dem Klassennamen zugreifen, diff ist jedoch statisch und const nicht.

2
soujanya