webentwicklung-frage-antwort-db.com.de

Was ist die Verwendung von statischen Variablen in C #? Wann es zu benutzen? Warum kann ich die statische Variable nicht innerhalb der Methode deklarieren?

Ich habe in C # nach statischen Variablen gesucht, bekomme aber immer noch nicht die Verwendung. Wenn ich versuche, die Variable innerhalb der Methode zu deklarieren, wird mir dies nicht gestattet. Warum?

Ich habe einige Beispiele über die statische Variable gesehen. Ich habe gesehen, dass wir keine Instanz der Klasse erstellen müssen, um auf die Variable zuzugreifen. Dies reicht jedoch nicht aus, um zu verstehen, was sie verwendet und wann sie verwendet wird.

Zweite Sache

class Book
{
    public static int myInt = 0;
}

public class Exercise
{
    static void Main()
    {
        Book book = new Book();

        Console.WriteLine(book.myInt); // Shows error why does it show me error?
                                       // Can't I access the static variable 
                                       // by making the instance of a class?

        Console.ReadKey();
    }
}
92
Kartik Patel

Eine Variable static teilt den Wert unter allen Instanzen der Klasse.

Beispiel ohne statisch zu erklären:

public class Variable
{
    public int i = 5;
    public void test()
    {
        i = i + 5;
        Console.WriteLine(i);
    }
}


public class Exercise
{
    static void Main()
    {
        Variable var = new Variable();
        var.test();
        Variable var1 = new Variable();
        var1.test();
        Console.ReadKey();
    }
}

Erläuterung: Wenn Sie das obige Beispiel betrachten, deklariere ich nur die Variable int. Wenn ich diesen Code ausführe, wird die Ausgabe 10 und 10 sein. Es ist einfach.

Betrachten wir nun die statische Variable hier. Ich erkläre die Variable als static.

Beispiel mit statischer Variable:

public class Variable
{
    public static int i = 5;
    public void test()
    {
        i = i + 5;
        Console.WriteLine(i);
    }
}


public class Exercise
{
    static void Main()
    {
        Variable var = new Variable();
        var.test();
        Variable var1 = new Variable();
        var1.test();
        Console.ReadKey();
    }
}

Wenn ich nun über dem Code laufe, lautet die Ausgabe 10 und 15. Der statische Variablenwert wird also von allen Instanzen dieser Klasse gemeinsam genutzt.

155
Kartik Patel

C # hat überhaupt keine statischen Variablen . In der jeweiligen Typdefinition können Sie statische field über C # deklarieren. Statisches Feld ist ein Zustand, der mit allen Instanzen eines bestimmten Typs gemeinsam genutzt wird. Der Gültigkeitsbereich des statischen Feldes ist daher ein ganzer Typ. Aus diesem Grund können Sie nicht statisch field innerhalb einer Methode deklarieren - die Methode selbst ist ein Gültigkeitsbereich, und Elemente, die in einer Methode deklariert sind, müssen über den Rand der Methode nicht erreichbar sein.

29
Dennis

statische Variablen werden verwendet, wenn nur eine Kopie der Variablen benötigt wird. Wenn Sie also eine Variable innerhalb der Methode deklarieren, wird diese Variable nicht mehr verwendet, sondern nur noch lokal.

beispiel für statisch ist 

class myclass
{
    public static int a = 0;
}

Statisch deklarierte Variablen werden im Allgemeinen von allen Instanzen einer Klasse gemeinsam genutzt.

Statisch deklarierte Variablen werden im Allgemeinen von allen Instanzen einer Klasse gemeinsam genutzt. Wenn Sie mehrere Instanzen der VariableTest-Klasse erstellen Diese permanente Variable wird von allen gemeinsam genutzt. Somit ist zu einem bestimmten Zeitpunkt nur ein Zeichenfolgenwert in der permanenten Variablen enthalten.

Da nur eine Kopie der Variablen für alle Instanzen verfügbar ist, führt der Code this.permament zu Kompilierungsfehlern, da daran erinnert werden kann, dass this.variablename auf den Namen der Instanzvariablen verweist. Auf statische Variablen muss also direkt zugegriffen werden, wie im Code angegeben.

16
Pranay Rana

Einige "reale" Beispiele für statische Variablen:

erstellen einer Klasse, in der Sie für Ihre Anwendung fest codierte Werte erhalten können. Ähnlich einer Aufzählung, jedoch mit mehr Flexibilität beim Datentyp.

public static class Enemies
{
    public readonly static Guid Orc = new Guid("{937C145C-D432-4DE2-A08D-6AC6E7F2732C}");
}

Das weithin bekannte Singleton erlaubt es, genau eine Instanz einer Klasse zu haben. Dies ist sehr nützlich, wenn Sie in Ihrer gesamten Anwendung darauf zugreifen möchten, aber nicht an jede Klasse weitergeben möchten, damit diese Klasse sie verwenden kann.

public sealed class TextureManager
    {
        private TextureManager() {}
        public string LoadTexture(string aPath);

        private static TextureManager sInstance = new TextureManager();

        public static TextureManager Instance
        {
            get { return sInstance; }
        }
    }

und so würden Sie den texturemanager nennen

TextureManager.Instance.LoadTexture("myImage.png");

Zu Ihrer letzten Frage: Sie beziehen sich auf den Compiler-Fehler CS0176 . Ich habe versucht, mehr Informationen darüber zu finden, konnte aber nur finden, was die MSDN dazu zu sagen hatte:

Eine statische Methode, ein Feld, eine Eigenschaft oder ein Ereignis kann für eine Klasse auch aufgerufen werden Wenn keine Instanz der Klasse erstellt wurde. Wenn irgendwelche Fälle von Wenn die Klasse erstellt wurde, können sie nicht für den Zugriff auf die statische .__ verwendet werden. Mitglied. Es gibt nur eine Kopie statischer Felder und Ereignisse und statisch Methoden und Eigenschaften können nur auf statische Felder und statische .__ zugreifen. Veranstaltungen.

9
dowhilefor

Statische Klassen erfordern nicht, dass Sie ein Objekt dieser Klasse erstellen/instanziieren. Sie können das C # -Schlüsselwort statisch vor dem Klassennamen voranstellen, um es statisch zu machen.

Denken Sie daran: Wir instanziieren nicht die Console-Klasse, String-Klasse und Array-Klasse.

class Book
{
    public static int myInt = 0;
}

public class Exercise
{
    static void Main()
    {
        Book book = new Book();
       //Use the class name directly to call the property myInt, 
      //don't use the object to access the value of property myInt

        Console.WriteLine(Book.myInt);

        Console.ReadKey();

    }
}
3
Kunal Mukherjee

Die Datenmember und Funktionsmember, die für die Instanz vom Typ Arbeiten, werden Instanzmember genannt. Die ToString-Methode von int (zum Beispiel) sind Beispiele für Instanzmitglieder. Mitglieder sind standardmäßig Instanzmitglieder. .__ Datenmitglieder und Funktionsmitglieder, die nicht für die Instanz des Typs, sondern für den Typ selbst arbeiten, müssen als statisch gekennzeichnet sein. Die Methoden Test.Main und Console.WriteLine sind statische Methoden. Die Console-Klasse ist eigentlich eine statische Klasse, dh alle ihre Mitglieder sind statisch. Sie erstellen nie Instanzen einer Konsole - eine Konsole wird von der gesamten Anwendung gemeinsam genutzt.

1
MichaelY

Als Antwort auf das "Wann verwenden?" Frage:

Ich verwende häufig eine statische (Klassen-) Variable, um jeder Instanz einer Klasse eine eindeutige Instanz-ID zuzuweisen. Ich verwende in jeder Klasse den gleichen Code, es ist sehr einfach:

//Instance ID ----------------------------------------
    // Class variable holding the last assigned IID
    private static int xID = 0;
    // Lock to make threadsafe (can omit if single-threaded)
    private static object xIDLock = new object();
    // Private class method to return the next unique IID 
    //  - accessible only to instances of the class
    private static int NextIID()                    
    {
        lock (xIDLock) { return ++xID; }
    }
    // Public class method to report the last IID used 
    // (i.e. the number of instances created)
    public static int LastIID() { return xID; }
    // Instance readonly property containing the unique instance ID
    public readonly int IID = NextIID();
//-----------------------------------------------------

Dies veranschaulicht einige Punkte zu statischen Variablen und Methoden:

  1. Statische Variablen und Methoden sind der Klasse zugeordnet, nicht einer bestimmten Instanz der Klasse.
  2. Eine statische Methode kann im Konstruktor einer Instanz aufgerufen werden. In diesem Fall wird die Readonly-Eigenschaft IID, die eindeutige ID für diese Instanz, mit der statischen Methode NextIID initialisiert.

Ich finde das nützlich, weil ich Anwendungen entwickle, in denen Schwärme von Objekten verwendet werden, und es gut ist, nachverfolgen zu können, wie viele erstellt wurden, und einzelne Instanzen zu verfolgen/abzufragen.

Ich benutze Klassenvariablen, um Dinge wie Summen und Durchschnittswerte der Eigenschaften der Instanzen zu verfolgen, die in Echtzeit gemeldet werden können. Ich denke, dass die Klasse ein guter Ort ist, um zusammenfassende Informationen über alle Instanzen der Klasse aufzubewahren.

1
JohnRC

Statische Variablen werden verwendet, wenn nur eine Kopie erforderlich ist. Lassen Sie mich das an einem Beispiel erklären: -

class circle
        {
           public float _PI =3.14F;
           public int Radius;


           public funtionArea(int radius)
            {
                return this.radius * this._PI      
            }

        }
    class program
    {
      public static void main()
      {
       Circle c1 = new Cirle();
       float area1 = c1.functionRaduis(5);

       Circle c2 = new Cirle();
       float area2 = c1.functionRaduis(6);

      }

    }

Jetzt haben wir 2 Instanzen für unseren Klassenzirkel erstellt, d. H. 2 Kopiensätze von _PI werden zusammen mit anderen Variablen erstellt. Wenn also viele Instanzen dieser Klasse vorhanden sind, werden mehrere Kopien von _PI erstellt, die den Speicher belegen. In solchen Fällen ist es besser, solche Variablen wie _PI statisch zu machen und darauf zu arbeiten. 

    class circle
        {
           static float _PI =3.14F;
           public int Radius;


           public funtionArea(int radius)
            {
                return this.radius * Circle._PI      
            }

        }
    class program
    {
      public static void main()
      {
       Circle c1 = new Cirle();
       float area1 = c1.functionRaduis(5);

       Circle c2 = new Cirle();
       float area2 = c1.functionRaduis(6);

      }

    }

Unabhängig davon, wie viele Instanzen für den Klassenkreis erstellt werden, existiert nur eine Kopie der Variablen _PI, die unseren Speicher speichert. 

0
TomHardy

Versuchen Sie es direkt mit dem Klassennamen Book.myInt aufzurufen.

0
Arnold Parge

Beim Vergleich mit Sitzungsvariablen haben statische Variablen für alle Benutzer den gleichen Wert, wenn man bedenkt, dass sie eine Anwendung verwenden, die auf dem Server bereitgestellt wird. Wenn zwei Benutzer auf dieselbe Seite einer Anwendung zugreifen, enthält die statische Variable den neuesten Wert, und derselbe Wert wird beiden Benutzern zur Verfügung gestellt. Wenn Sie also etwas Gemeinsames und Gleiches für alle Benutzer wünschen, einschließlich der Werte, die im Anwendungscode verwendet werden sollen, verwenden Sie nur statisch.

0
pratham gn

Sie müssen kein Objekt instanziieren, da Sie __. Eine statische Variable verwenden werden

0
Mehran Sarrafi