Was ist der Unterschied zwischen Instanzvariablen und Klassenvariablen in C #?


Antwort 1:

Sie haben die Fragen nicht ganz richtig gestellt, aber ich glaube, ich weiß, was Sie fragen.

Eine Instanzvariable ist eine Variable, die instanziiert werden muss, bevor Sie sie verwenden können. Okay, das hat wahrscheinlich nicht viel geholfen, da Sie das zweifellos schon einmal gehört haben. Hier ist ein Beispiel dafür, was das bedeutet.

Nehmen wir an, Sie haben eine Klasse erstellt (C #, gilt aber auch für VB und andere), und in dieser Klasse gibt es eine Reihe von Variablen, von denen eine ein Flag ist, das angibt, wann der Gastank voll ist. Um auf diese Variable zugreifen zu können, müssen Sie eine Instanz der Klasse erstellen.

öffentliche Klasse GasTank {

private int _amountOfGas = 0;

private bool _flagFullTank = false;

private bool _flagEmptyTank = true;

public GasTank = neuer GasTank () {}

public FillTank () {

while (! _ flagFullTank) {

_amountOfGas ++;

}}

}}

public int AmountOfGas {

get {return _amountOfGas;}

setze {_amountOfGas = value;}

}}

}}

Um den Wert _amountOfGas anzuzeigen, müssen Sie eine Instanz der Klasse erstellen.

GasTank MyGasTank = neuer GasTank ();

Mit MyGasTank können Sie dann den Wert sehen, nach dem Sie suchen.

int GasLeft = MyGasTank.AmountOfGas;

Okay, das ist sehr einfach und direkt über meinem Kopf, es ist also kein vollständiger Code. Außerdem habe ich etwas mehr getan, als ich brauchte, um versteckte oder private Variablen und öffentliche Eigenschaften zu erstellen. Innerhalb der Klasse aktualisieren wir die privaten Variablen (falls erforderlich), greifen jedoch nur über die Eigenschaften darauf zu. Ist das unbedingt nötig? Nein. Wenn Sie die privaten Teile der Klasse öffentlich machen, können Sie über MyGasTank auf alle Teile zugreifen.

Wenn Sie jetzt eine Klasse mit statischen Variablen erstellen, sagen Sie beispielsweise eine Utility-Klasse, die nur einige nette Funktionen enthält, die Sie möglicherweise in Ihrem Code verwenden. Wenn die Funktionen und Variablen wie folgt definiert wurden:

public static bool ValidUser;

Dann können Sie diese Variable in Ihrem Code mit Utility.ValidUser aufrufen und den Wert (true oder false) abrufen.

Dies sind die wesentlichen Punkte, aber es gibt noch mehr Möglichkeiten, um eine Klasse einzurichten (und sollte). Im späteren Beispiel ist es nicht erforderlich, die Utility-Klasse zu instanziieren (dh Utility MyUtility = new Utility (). Solange alle Dinge, auf die Sie zugreifen möchten, statisch definiert sind, können Sie sie einfach verwenden.

Hoffe das hilft.


Antwort 2:

Es gibt vier Arten von Gültigkeitsbereichen, die für Variablen in C verwendet werden:

global - auf das von jeder Funktion, jedem Modul zugegriffen werden kann. Diese werden ohne weitere Bereichsbeschränkungen deklariert, die mit "int a;" hinzugefügt wurden. Sie werden außerhalb einer Funktion deklariert und sind so global.

statisch "global" - Dies ist eine globale Variable, auf die von jeder Funktion aus zugegriffen wird, die auf die Deklaration WITHIN THE MODULE (eine Datei) folgt. "Statisch int a;" außerhalb einer Funktion deklariert ist für die Verwendung innerhalb des Moduls definiert (eine C-Datei). Außerhalb des Moduls ist nicht direkt darauf zugegriffen, obwohl eine Funktion innerhalb des Moduls einen Zeiger auf die Variable zurückgeben kann.

Lokal - auf das nur innerhalb des Blocks zugegriffen werden kann, in dem es deklariert ist. Diese Variablen befinden sich auf dem Stapel und werden beim Aufrufen anderer Funktionen Teil des Stapelrahmens. Zeiger auf diese Variablen können NUR an Funktionen übergeben werden, die von dem Block aufgerufen werden, in dem sie deklariert sind. Wenn die Adresse von der Funktion zurückgegeben wurde, handelt es sich um eine Stapelanfälligkeit.

statisch lokal - Dies sind Variablen, die eingeschränkter sind als die statische "globale", da der Gültigkeitsbereich des Namens auf den Block beschränkt ist, in dem die Variable deklariert ist. HINWEIS: Der in dieser Variablen enthaltene WERT wird übertragen und steht dem zur Verfügung Block zur weiteren Verwendung. Diese Variablen befinden sich nicht auf dem Stapel, daher können Zeiger auf sie zurückgegeben werden.