Haben Eigenschaften immer einen Wert, wenn sie nicht gesetzt sind?

7

Ich habe eine Eigenschaft wie folgt:

%Vor%

und ich habe einen Test in einer meiner Methoden wie folgt:

%Vor%

Abhängig davon, wann diese Methode aufgerufen wird, wurde möglicherweise Breadcrumbs nicht festgelegt. In einem Test wird Breadcrumbs == null zu True ausgewertet.

Wird die Unset-Eigenschaft immer einen Wert haben? (Wird es immer null sein?)

    
Oliver 27.01.2012, 14:18
quelle

4 Antworten

18

Eine automatisch implementierte Eigenschaft, die von keinem Code explizit festgelegt wurde, hat immer den Standardwert für den Eigenschaftstyp, der für Referenztypen null ist. (Für int wäre es 0, für char wäre es '\ 0' usw.).

Eine automatisch implementierte Eigenschaft wie diese ist nur äquivalent zu:

%Vor%

... mit der Ausnahme, dass die Unterstützungsvariable einen unsäglichen Namen hat (Sie können nicht im Code darauf verweisen), so dass es immer mit dem Standardwert für den Typ beginnt.

    
Jon Skeet 27.01.2012, 14:22
quelle
3

Auto-Eigenschaften verwenden Hintergrundfelder und werden zu regulären Eigenschaften kompiliert.

Wenn der Eigenschaftstyp ein Referenztyp ist, wäre der Wert null, wenn nicht der Wert der Standardwert wäre.

    
Gilad Naaman 27.01.2012 14:22
quelle
2

Klassenmitgliedsvariablen (aufgerufene Felder) und damit Begleitvariablen von Eigenschaften werden immer auf ihren Standardwert initialisiert, wenn sie nicht explizit initialisiert werden, also null für Referenztypen. Der Standardwert für alle Typen ist der Wert, dessen Binärdarstellung aus allen Bits besteht, die auf 0 gesetzt sind.

Auf der anderen Seite müssen Sie in C # lokale Variablen explizit initialisieren. Dies sind: Variablen, die in Methoden, Konstruktoren und Eigenschaftenaccessoren deklariert sind, und out Methodenparameter; Sie werden als undefiniert behandelt, bis Sie ihnen einen Wert zuweisen.

    
Olivier Jacot-Descombes 27.01.2012 14:23
quelle
0

Es ist logisch unmöglich, dass es keinen Wert hat. Es muss etwas zurückgeben, ein paar Einsen und Nullen, die zumindest als Verweis auf Tuple<String, String>[] betrachtet werden, also hat es einen Wert.

Es ist auch der Fall, dass alle Felder in Klassen auf ihren Standardwert gesetzt werden ( default(T) für den Typ T , der für alle Referenztypen null ist). Sonst wäre es möglich, ein Objekt in einem Zustand zu haben, der nicht nur keinen Sinn ergibt, sondern auch keinen Sinn ergibt, nach welchen Regeln Objekte von .NET erwartet werden. Dies schließt die versteckten Felder hinter den automatischen Eigenschaften ein.

Jetzt können wir in einigen Sprachen das Äquivalent dazu machen:

%Vor%

Wenn dies erlaubt wäre, hätte whatIWillSend einen Wert, der nicht durch eine bewusste Entscheidung von Ihnen definiert wurde, sondern durch das, was sich gerade in der Erinnerung befand. Es könnte null sein, es könnte ein gültiger Tuple<String, String>[] rein zufällig sein (aber nicht der, den du verwenden wolltest!), Es könnte ein Dictionary<int, List<string>> sein, das die Laufzeit jetzt denken wird, ist tatsächlich ein Tuple<String, String>[] ( da geht die typsicherheit des gesamten systems, könnte es ein viertel prozent co_de% struktur sein. (In den Sprachen, die solche Dinge erlauben, könnte es auch ein bekannter Wert sein, den Debugger für solche Sprachen in diesen Fällen genau so einstellen, um Fehler zu finden, die dadurch verursacht werden.)

Das ist das nächste, was wir zu einer Immobilie bringen können, die keinen Wert hat. Beachten Sie jedoch Folgendes:

  1. Es hätte immer noch einen Wert, nur keinen sinnvollen Wert.
  2. Wir dürfen das sowieso nicht in C # machen.
Jon Hanna 27.01.2012 14:49
quelle

Tags und Links