2009-12-17 18 views
40

Widzę, że jakiś kod zwróci domyślną wartość, więc zastanawiam się nad klasą zdefiniowaną przez użytkownika, w jaki sposób kompilator zdefiniuje jej domyślną wartość?Wartość domyślna dla klasy zdefiniowanej przez użytkownika w C#

+2

prostu do wyjaśnienia: wszystkie klasy (w tym te, które Ci utworzyć) domyślnie 'null'. Typy wartości liczbowych będą miały domyślnie wartość zero, a struktury są definiowane przez implementację (wartości ustawiane są w konstruktorze). –

+3

W rzeczywistości, struktury mają domyślny domyślny konstruktor, którego nie można przesłonić, z którego zeruje się pamięć używana przez strukturę, więc domyślną wartością jest nadal zdefiniowany kompilator, a nie zdefiniowana implementacja. –

+0

Ważne rozróżnienie: _Klasy członkowskie_ są inicjowane z domyślną wartością. Niezainicjowane zmienne funkcji lokalnych powodują tylko błędy kompilatora;) – Nyerguds

Odpowiedz

48

Aby dostroić się do reszty, to będzie null, ale należy również dodać, że można uzyskać domyślną wartość dowolnego typu, przy użyciu default

default(MyClass) // null 
default(int) // 0 

Może to być szczególnie przydatne podczas pracy z rodzajowych ; możesz chcieć zwrócić default(T), jeśli twój typ zwrotu to T i nie chcesz założyć, że jest on zerowy.

+3

+1 Istnieje pełne wyjaśnienie domyślnego słowa kluczowego pod adresem http://msdn.microsoft.com/en-us/library/xwth0h0d%28VS.80%29.aspx –

3

Jeśli jest to rodzaj odniesienia, wartość domyślna będzie null, jeśli jest to typ wartości, to zależy.

2
Assert.IsTrue(default(MyClass) == null); 
+1

jest celem tego stwierdzenia? –

11

Uwaga: Wartość DefaultValueAttribute nie spowoduje automatycznego inicjowania elementu z wartością atrybutu. Musisz ustawić wartość początkową w swoim kodzie.

Możesz udekorować swoje nieruchomości za pomocą DefaultValueAttribute.

private bool myVal=false; 

[DefaultValue(false)] 
public bool MyProperty { 
    get { 
     return myVal; 
    } 
    set { 
     myVal=value; 
    } 
} 

Wiem, że to nie odpowiada na twoje pytanie, chciałem tylko dodać to jako odpowiednią informację.

Więcej informacji można znaleźć http://msdn.microsoft.com/en-us/library/system.componentmodel.defaultvalueattribute.aspx

+0

Jak mówi strona, DefaultValue jest po prostu czymś używanym przez projektanta wizualnego VS. To naprawdę zupełnie nie ma związku z faktyczną inicjalizacją; to tylko "podpowiedź" tego, jak należy ją zainicjować. – Nyerguds

5

Wartość domyślna dla klas jest null. W przypadku struktur wartość domyślna jest taka sama, jak w przypadku tworzenia domyślnego konstruktora bez parametrów struktury (którego nie można przesłonić). Ta sama reguła jest stosowana rekursywnie do wszystkich pól zawartych w klasie lub strukturze.

1

Jeśli chcesz w jakiś sposób zdefiniować domyślną wartość inną niż null dla typu odniesienia, uświadom sobie, że nie ma sensu, aby typ odniesienia miał wartość domyślną. W pewnym momencie odniesienie musiałoby wskazywać na przydzieloną pamięć dla konstruowanego obiektu. Aby było to możliwe, wyobrażam sobie dwie implementacje:

  1. zdefiniować statyczną instancję jako domyślną: to może działać, ale prawdopodobnie wymagać naprawdę przylegający sposób jakoś zidentyfikować do kompilatora, gdzie uzyskać instancję statycznej. Naprawdę nie jest to funkcja warta umieszczenia w języku.

  2. Pozwól wywołanie konstruktora domyślnego za każdym razem wartość domyślna wystąpił w wyrażeniu: to byłoby straszne, bo teraz trzeba się martwić o dwóch wartości domyślnych może być nierówna, ponieważ nie zastępują Równa się nie porównać odniesień i również straszne ze względu na wydajność pamięci i wydajność przydzielania pamięci, a strona wpływa z konstruktora.

Podsumowując, uważam, że jest to funkcja językowa, której naprawdę nie chcemy. Domyślnie (MyClass) zawsze będzie == null.

0

chciałbym zrobić pole niż nieruchomości, jak to wygląda jak System.String.Empty „domyślny” instancję klasy:

public class Person 
{ 
    public string Name { get; set; } 
    public string Address { get; set; } 

    public static readonly Person Default = new Person() 
    { 
     Name = "Some Name", 
     Address = "Some Address" 
    }; 
} 

... 

public static void Main(string[] args) 
{ 
    string address = String.Empty; 

    Person person = Person.Default; 

    //the rest of your code 
} 
Powiązane problemy