Schlüsselwort static



  • Hallo liebe C#-ler.

    Ich komme aus der C++-Ecke und programmiere schon seit langem C++. Nun möchte ich mich auch mit C# befassen und arbeite mit dem Buch Visual C# 2010.
    Nun zu meinem Verständnisproblem:
    laut Erklärung ist das Schlüsselwort static nicht an ein bestimmtes Objekt gebunden, sondern gehören dem Gültigkeitsbereich der Klasse an.

    static int count_circles;
    public static int get_counter()...
    

    Das verstehe ich ja noch, aber ich finde keine Erklärung für diese Konstrukte:

    public static double GetCircumference(double r)
    {
    return 2*Math.PI*r;
    
    public static class MathDefinition{
    //warum statische Klasse
    

    und statischer Konstruktor?

    Danke im Voraus



  • GetCircumference ist wie get_counter eine statische Klassenmethode, die solltest du aus C++ in genau dieser Form kennen.

    "static class" heißt, dass eine Klasse nur statische Member enthalten darf. Soetwas würde man in C++ wohl nicht bauen sondern Funktionen in einem entsprechendem Namespace anlegen, da es in C++ aber keine freien Funktionen gibt legt man stattdessen eine static class an.

    MfG SideWinder



  • @SideWinder, wahrscheinlich meintest Du ..da es in C# aber keine freien Funktionen gibt..



  • Jap, korrekt. In C++ gibt es natürlich freie Funktionen 🙂

    MfG SideWinder



  • static schrieb:

    und statischer Konstruktor?

    static Methoden und Felder sollten Dir von C++ her bekannt sein.
    C# unterstützt außerdem Member Initialization für Felder, deren Wert zur Compilezeit bekannt ist:

    class Foo
    {
     int bar = 3;
     static int baz = 23;
    }
    

    Ansonsten werden Felder im Konstruktor initialisiert:

    class Foo
    {
     int bar;
     static int baz;
    
     public Foo(int parameter)
     {
      bar = parameter;
      baz = valueFromDatabase();
     }
    }
    

    Das Problem dabei: Jedes neue Foo-Objekt setzt das static Feld erneut. Das ist aber eventuell garnicht gewünscht.
    Dafür gibt es den statischen Konstruktor:

    class Foo
    {
     int bar;
     static int baz;
    
     public Foo(int parameter)
     {
      bar = parameter;
     }
    
     static Foo()
     {
      baz = valueFromDatabase();
     }
    }
    

    Dabei gelten folgende Besonderheiten:

    • Eine Klasse darf nur maximal einen statischen Konstruktor (SK) haben.
    • Ein SK hat keinen Modifier (public, protected, private) und kann keine Argumente annehmen.
    • Ein SK wird exakt einmal ausgeführt (maximal), unabhängig davon, wieviele Foo-Objekte erstellt werden.
    • Sobald das erste Foo-Objekt angelegt wird, oder der erste Zugriff auf ein statisches Feld oder eine statische Methode stattfindet, wird der SK ausgeführt.
    • Der SK wird vor jedem anderen Konstruktor ausgeführt.
    • Der SK ist nicht an ein Objekt gebunden und darf demnach nicht auf nicht-statischen Felder oder Methoden zugreifen.

    Ich habe in 3 Jahren einmal einen SK benötigt. Insgesamt ein völlig überflüssiges Sprachmittel 😉


Log in to reply