2009-06-18 6 views
2

sagen läßt ich habe folgendekönnen Sie Ihren eigenen Standard-T erstellen, wo T Ihre eigene Klasse ist

public class A 
{ 
    private string _someField; 
    public string SomeField { get { return _someField; } } 
} 

Aus irgendeinem Grunde mir den Standard dieser Klasse bin Überprüfung, und ich möchte für eine Standard festlegen Klasse, genau wie ein Standard vom Typ int 0 ist, möchte ich in der obigen Klasse für meinen Standard von Somefield "Hallo" sein;

int i = default(int); // i is 0 
A myClass = default(A); 
string s = myClass.SomeField; // s is hello 

Dies ist mehr für meine eigene theoretische Zufriedenheit als praktische Anwendung. Ich frage mich nur.

+0

denke ich, ein paar von euch wissen nicht, was die Standard-Schlüsselwort Test Ihren Code, den Sie –

Antwort

5

Nein. Der Standard für Klassen (Referenztypen) ist null und kann nicht überladen werden.

+1

+1 geschrieben ist. Standard (T) == null wobei T: Klasse –

-1

Dies sollte die Arbeit machen:

public class A 
{ 
    private string _someField = "hello"; 
    public string SomeField { get { return _someField; } } 
} 

Nun, wenn Sie eine Instanz dieser Klasse erstellen, wird der Anfangswert von somefield sein hallo.

[Bearbeiten: Dies tut nicht ganz was Sie wollen. Wie andere in den Kommentaren angemerkt haben, wird der Standardwert (T), bei dem T eine Klasse ist, immer Null ergeben.

Stattdessen würden Sie die Klasse normalerweise erstellen, anstatt das Schlüsselwort 'default' zu verwenden.

A myClass = new A(); 
string defaultValue = myClass.SomeField // This will be set to "hello" by default. 

]

+0

Standard (T) ist immer Null, das ist der Wert nach dem Aufruf des Standardkonstruktors. –

+0

Dies führt zu einer NULL-Referenzausnahme, wenn myClass dereferenziert wird. –

+0

-1 Wenn es vielleicht eine Struktur wäre, aber ein Standard von T, wo T: Klasse immer Null ist. –

5

Sie nicht, welchen Standard ändern können (T) ist für eine T. null Es ist immer für Referenztypen und den ‚leeren‘ Wert für Werttypen (zB. Für eine Struktur, die alle Mitglieder haben ihre standardmäßigen, nicht initialisierten Werte).

+0

+1 Schön gemacht. –

0

Bei Klassen (Referenztypen) das Standard-Schlüsselwort nicht für die Mitglieder der Klasse alles tut, setzt sich einfach die ganze Referenz

0

Während default() immer null zurückgibt, könnten Sie angeben, wo die Klasse einen parameterlosen Konstruktor enthalten muss, damit Sie sie neu aufrufen können.

void SomeMethod<T>(T something) where T : new() 
    { 
     T newObject = new T(); 
    }