Frage

Das funktioniert:

class MyClass
{
    int a;

    public MyClass()
    {
        int b = a;
    }
}

Aber das gibt einen Compiler-Fehler ( "Verwendung von nicht zugewiesenen lokalen Variablen 'a'"):

class MyClass
{
    public MyClass()
    {
        int a;
        int b = a;
    }
}

Soweit ich sagen kann, dies geschieht, weil im ersten Beispiel, technisch gesehen, ist der Compiler nicht weiß, dass ‚a‘ ist nicht belegt. Im letzteren Beispiel ‚a‘ lokal definiert und ist daher leicht zu verfolgen.

Aber warum letzteres Beispiel nicht?

Sie ganze Zahlen nicht auf 0 Standard? Ist das etwas, der Compiler für „Best Practices“ erzwingt. Oder gibt es einen anderen Grund?

War es hilfreich?

Lösung

Im ersten Beispiel ist es ein Feld . Felder automatisch auf 0 / false / null Standard. Im zweiten Beispiel ist es ein Variable . Variablen sind nicht vorbelegt und müssen „eindeutige Zuordnung“ haben, bevor sie verwendet werden.

Im Wesentlichen, wenn ein Objekt (oder Initialisierung eines struct) Erstellen sie nullt den Speicher (oder im Falle einer Nicht-Standard-Struktur Ctor, Sie zwingt manuell alles initialisieren). Allerdings sind Variablen so häufig (in jedem Verfahren), dass es nicht den Overhead will mit dem Stapel der ganzen Zeit auf Null. Es stattdessen zwingt Sie den Anfangswert anzuzeigen.

Andere Tipps

  

Sie nicht ganze Zahlen standardmäßig auf 0?

Sie tun, wenn sie Daten Mitglieder einer Klasse sind, aber nicht, wenn sie eine lokale Variable. Lokale Variablen initialisiert werden müssen explizit, bevor sie es gewohnt sind, daher der Compiler-Fehler

Wenn Sie eine neue Instanz einer Klasse der gesamten Speicher instanziiert, die das Objekt benötigt wird „genullt“ ints auf 0 gesetzt Strings eingestellt sind auf null usw. Das ist eine Menge von dem seltsamen Speichern Bugs und Hacks zu vermeiden, waren möglich, in C (++). Leider hat dies auch eine kleine Verarbeitungskosten, so dass, wenn Sie eine lokale Variable erstellen nimmt die Sprache ist, dass Sie den Wert gesetzt wird, sich sehr schnell und nicht stört es Nullstellung der Gesamtzahl der erforderlichen Anweisungen zu verringern. Zum Ausgleich die Gefahr der Verwendung ungesetzt Speicher der Compiler prüft diese einführt, um sicherzustellen, dass ein Wert festgelegt wurde, bevor es erlaubt Ihnen, die Variable zu verwenden.

Das könnte sein, weil Variable auf Klassenebene deklariert wird, kann nicht Wert auf dem gleichen Umfang zugewiesen werden (außer bei der Deklaration)

z

class Test
{
   int a;

   a = 0; // this is not allowed at class level & hence a initialized to default
}

während

class Test
{
   void test()
   {
     int a;
     int b = a;

     a = 20; // this is allowed
   }
}

Wie pro mein Wissen, wenn wir eine Variable in der Klasse deklariert und erstellt ein Objekt dann initialisiert der Standardkonstruktors die Variable und so gibt es keine Notwendigkeit zur Initialisierung der Klassenvariablen. Aber kommen in der Klasse zu den Methoden gibt es keinen Konstruktor oder irgendetwas diese Variablen zu initialisieren, so dass wir nicht nicht initialisierten Variablen in den Methoden zuweisen können.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top