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