Das static
Schlüsselwort kann für Neulinge etwas schwer zu fassen sein. Der primäre Zweck besteht darin, ein Klassenmitglied als nicht zu einer einzelnen Instanz der Klasse gehörend, sondern zur Klasse selbst zu identifizieren.
Ohne zu sehr ins Detail zu gehen, setzen C # (und Java) das objektorientierte Ideal, dass alle Codes und Daten zu einem Objekt gehören müssen, rigoros durch und sind daher in Umfang, Sichtbarkeit und Lebensdauer begrenzt. Dies ist im Allgemeinen die beste Vorgehensweise, wenn der grundlegende Grundsatz eines Objekts, das eine reale Sache darstellt, zutrifft. Dies ist jedoch nicht immer der Fall. Manchmal benötigen Sie eine Funktion oder Variable, auf die Sie von einer beliebigen Stelle im Code zugreifen können , ohne dass Sie einen Verweis auf ein Objekt weitergeben müssen, und mit der Garantie, dass die Daten, die Sie anzeigen oder ändern, genau das sind , was alle tun else befasst sich mit und nicht mit einer Kopie davon, die zu einer anderen Instanz eines Objekts gehört.
Ein solches Verhalten war in C und C ++ in Form der "globalen" Funktion oder Variable verfügbar, die nicht in ein Objekt eingekapselt war. Als Kompromiss unterstützen C # und Java den "statischen Bereich", einen Punkt zwischen wirklich globalem Code ohne übergeordnetes Objekt und Instanzmitgliedern mit eingeschränktem Bereich.
Jedes "Codemitglied" (Funktion, Eigenschaft, Feld), das als " static
Geltungsbereich" deklariert wurde, wird ab der ersten Zeile der Programmfunktion in den Geltungsbereich aufgenommen main()
und verlässt das Programm erst, wenn die main()
Funktion beendet wird. Im Klartext ist ein statischer Member vorhanden und kann verwendet werden, solange das Programm ausgeführt wird. Darüber hinaus werden statische Member aufgerufen, indem sie als Member des Typs selbst aufgerufen werden, nicht als Member einer Instanz dieses Typs:
public class Foo
{
public int MyInt {get;set;} //this is an "instance member"
public static int MyStaticInt {get;set;} //this is a "static member"
}
...
var myFoo = new Foo();
myFoo.MyInt = 5; //valid
myFoo.MyStaticInt = 5; //invalid; MyStaticInt doesn't belong to any one Foo
Foo.MyInt = 5; //invalid; MyInt only has meaning in the context of an instance
Foo.MyStaticInt = 2; //valid
Dadurch werden statische Member für jeden Code sichtbar, der über Kenntnisse des Typs verfügt, unabhängig davon, ob sie eine einzelne Instanz davon kennen oder nicht.
Um Ihre Frage zu beantworten, besteht der Hauptvorteil der Kennzeichnung als statisch darin, dass sie überall dort sichtbar wird, wo der Typ selbst bekannt ist, unabhängig davon, ob der konsumierende Code eine Instanz des enthaltenen Objekts hat oder erhalten kann. Es gibt auch einen leichten Leistungsvorteil; Da sich die Methode im statischen Bereich befindet, kann sie nur auf andere statische Member (derselben oder anderer Klassen) und auf alle als Parameter übergebenen Elemente zugreifen. Daher muss die Laufzeit keinen Verweis auf die aktuelle Instanz des enthaltenden Objekts auflösen, wie dies normalerweise für eine Instanzmethode der Fall wäre, um kontextspezifische Statusinformationen bereitzustellen.
Ganze Klassen können auch als statisch markiert werden. Auf diese Weise teilen Sie dem Compiler mit, dass die Klassendeklaration nur aus statischen Elementen besteht und daher nicht instanziiert werden kann. Auf diese Weise können Sie auf einfache Weise sicherstellen, dass sich nur eine einzige Kopie eines Objekts im Speicher befindet. mach die Klasse und alles darin statisch. Es ist jedoch sehr selten, dass dies die beste Lösung für einen solchen Bedarf ist. In einer Situation, in der genau eine Kopie eines Datensatzes erforderlich ist, wird stattdessen in der Regel der "Singleton" empfohlen. Dies ist eine nicht statische Klasse, die einen statischen Accessor und einen nicht öffentlichen Konstruktor verwendet, um den Zugriff auf eine einzelne Instanz von sich selbst zu ermöglichen. Theoretisch bietet ein Singleton die gleichen Vorteile wie eine vollständig statische Klasse, bietet jedoch die Möglichkeit, die Klasse instanzbasiert und objektorientiert zu verwenden.