2014-01-23 11 views
6

Wenn Sie eine Initialisierungsliste verwenden, um eine struct zu erstellen, erhalten die Mitglieder, die Sie auslassen, einen bekannten Standardwert?Sind nicht initialisierte Strukturelemente garantiert ein Wert?

public struct Testing 
{ 
    public int i; 
    public double d; 
    public string s; 
} 

Testing test = new Testing { s="hello" }; 

fand ich einen Link bei Microsoft, die es bedeutet, aber so nicht explizit angeben: Default Values Table (C# Reference).

Ein kleines Testprogramm zeigt, dass es keinen Compilerfehler generiert und die erwarteten Ergebnisse erzeugt. Ich weiß es besser, als sich auf einfache Tests für Garantien zu verlassen. http://ideone.com/nqFBIZ

Antwort

9

Ja, sie enthalten den Standardwert (T), wobei T der Typ des Werts ist. Objektreferenzen sind null.

Auszug:

Als 5.2 werden verschiedene Arten von Variablen in Abschnitt automatisch auf ihren Standardwert initialisiert, wenn sie erstellt werden. Für Variablen des Klassentyps und andere Referenztypen ist dieser Standardwert Null. Da Strukturen jedoch Werttypen sind, die nicht null sein können, ist der Standardwert einer Struktur der Wert, der von erzeugt wird, indem alle Werttypfelder auf ihren Standardwert und alle Referenzfelder des Typs auf null gesetzt werden.

von hier genommen:

http://msdn.microsoft.com/en-us/library/aa664475(v=vs.71).aspx

Ich erinnere mich, als die MOC für die Zertifizierung zu studieren, dass sie dies ausdrücklich erklären. Es ist eine garantierte Eigenschaft der Sprache.

6

auf pid Antwort zu erweitern: haben die Semantik von

test = new Testing { s = hello } 

angegeben:

Testing temp = new Testing(); 
temp.s = "hello"; 
test = temp; 

Der Standardkonstruktors eines Werttyps als Konstrukteur dokumentiert wird, die setzt alle Felder der Instanz auf ihre Standardwerte.

Allgemeiner die Sprache C# erfordert, dass jeder Konstruktor einer Werttyp die Eigenschaft haben, dass alle Felder definitiv zugewiesen werden, bevor der Konstruktor normalerweise beendet.

Nun, wenn kein Konstruktor aufgerufen wird, gibt es zwei Fälle. Wenn die Variable anfänglich zugewiesen ist, verhält sich die Variable genauso, als ob der Standardkonstruktor aufgerufen wurde.Zum Beispiel, wenn Sie sagen,

Testing[] test = new Testing[1]; 

Dann wird test[0] auf den Standardwert initialisiert das gleiche wie wenn Sie

Testing[] test = new Testing[1] { new Testing() }; 

gesagt hatte Wenn die Variable zunächst nicht zugeordnet ist, zum Beispiel ein lokale Variable, dann Sie sind erforderlich, um alle Felder definitiv zuzuweisen, bevor Sie sie lesen. Das heißt, wenn wir eine lokale haben:

Testing test; 
test.s = "hello"; 
Console.WriteLine(test.d); // ERROR, test.d has not been written yet. 

Beachten Sie auch, dass muable Strukturen eine schlechteste Übung in C# sind. Erstellen Sie stattdessen einen öffentlichen Konstruktor, der alle Felder festlegt, die Felder als privat definiert und die Eigenschaften-Getter darüber platziert.