public static const int

port29

deus.Server
Hallo Leute,

ich würde gerne in einer Klasse eine statische Variable erstellen, die nicht geändert werden kann. Aber irgendwie funktioniert es bei mir nicht wirklich. Weder die erste Version noch die zweite funktioniert bei mir. Kann mir bitte jemand sagen, wieso das so ist?

Code:
public static const int MAX_SIZE = 100;

        public virtual static int MAX_SIZE
        {
            get {
                return 100;
            }
        }

Java scheint damit kein Problem zu haben, es akzeptiert folgendes anstandslos:

Code:
final public static int bla = 5;
 
Also soweit ich das sehe, macht das doch keinen Sinn, eine Konstante statisch zu machen?
So funktioniert das bei mir:

Code:
    class Program
    {
        static void Main(string[] args)
        {
            //Test.Zahl = 20;    // Hier gibts einen Fehler, weil Konstante

            Console.Write(Test.Zahl);
            Console.ReadKey();
        }
    }

    class Test
    {
        public const int Zahl = 100;
    }
 
Wieso macht es denn keinen Sinn? Noch viel mehr verstehe ich nicht, wieso deine Lösung funktioniert.

Um auf eine Variable über den Klassennamen zugreifen zu können, muss diese Variable statisch sein. Und wenn ich Änderungen an einer Variable verhindern will, dann muss ich diese als const deklarieren.

Zusammengesetzt ergibt sich die "public static const int" Deklaration bei mir.
 
Kommst du aus dem C++-Bereich? ;)
Eine Konstante braucht man in C# nicht statisch machen, da sie niemals ihren Wert ändern kann, d.h. für alle Instanzen auf alle Fälle gleich ist. Ich vermute, der Compiler ersetzt solche "const"s direkt durch die jeweiligen Inhalte. Auf alle Fälle: Warum solltest du eine Instanz der Klasse benötigen, um auf Inhalte zuzugreifen, die schon allein durch die Definition von const quasi statisch sein müssen?
Machs einfach so, wie ichs dir gezeigt hab, und zerbrich dir nicht den Kopf über MS... :p
 
Ich glaub, ich sehe schon, wo das Problem liegt. Eine Konstante ist in C# offensichtlich nicht das gleiche, wie in C++ (ja, du hast recht, ich komme ursprünglich aus der C++ Welt) oder Java.

Für mich war eine Konstante immer eine Variable, deren Wert ich ein einziges Mal schreiben darf. Unter C# scheint man die Variable aber schon gleich während der Initialisierung belegen zu müssen. Da hast du dann recht, dass es dann keinen Sinn macht, das Ding als static zu deklarieren. C# lässt eine Deklaration der Variable ohne einen Wert auch nicht zu:

Code:
public const int abc;
// => A const field requires a value to be provided
 
Hi,

was mich jetzt allerdings zusätzlich etwas verwirrt, ist, wieso das in C++ funktioniert, in C aber nicht:

C++:
#include <iostream>

using namespace std;

class Anything
{
public:
    const int x; // Kein Fehler, obwohl nicht initialisierte Konstante
};

int main()
{
    const int y; // Fehler, weil nicht initialisierte Konstante

    Anything *any = new Anything();
    cout << any->x; // Ausgabe: 0

    return 0;
}

Für mich war eine Konstante immer eine Variable, deren Wert ich ein einziges Mal schreiben darf. Unter C# scheint man die Variable aber schon gleich während der Initialisierung belegen zu müssen.
Eine Konstante ist eben keine Variable (sagt ja eigentlich schon der Name ;)), sondern unveränderlicher Wert. Und als solcher sollte eine Konstante meinem Verständnis nach (unabhängig von der Programmiersprache) nie ohne den entsprechenden Wert deklariert werden.

Grüße, D.

P.S.: Was mich auch noch interessieren würde ist: Wie wird in C# der Wert einer Konstante im Speicher abgelegt? Existiert der Wert für jede Objektinstanz oder liegt in den Objektinstanzen nur ein Pointer auf einen zentralen (quasi-statischen) Wert?
 
Eine mit const definierte Konstante ist in C# automatisch statisch!

Hingegen ist eine Konstante in C#, die mit readonly definiert worden ist, ein Instanzmember und muss daher nicht unbedingt sofort, sondern kann auch im Konstruktor zugewiesen werden.
 
Zurück