2009-03-01 16 views
7

Ich habe viel Verwirrung in Bezug auf den Unterschied von generischen Referenztyp vs. generischen Werttyp während meiner API-Codierung konfrontiert.C# Generika: Referenztyp vs. Wert

Leute, das ist die Frage, was sind Unterschiede in Bezug auf Einschränkungen und Funktionalitäten (am wichtigsten/leicht zu übersehen ist) zwischen diesen beiden Tieren:

class ReferenceGeneric <T> where ??? 
{ 

} 

und

struct ValueGeneric <T>: where ??? 
{ 


} 

bearbeiten Nur um die Frage zu klären und was ich möchte: Ich möchte wissen, was man mit generischen Referenztypen machen kann UND nicht mit generischen Werttypen umgehen kann ... und umgekehrt

Bearbeiten # 2 Weitere Erläuterungen: Wie kann T eingeschränkt werden, wenn der generische Typ Verweis oder Werttyp ist - gibt es Unterschiede, wie jeder Typ eingeschränkt werden kann?

+0

Sie Frage ist sehr conf mit ... da ist eine Antwort da draußen, aber was willst du? – andleer

+0

Sie sagten, Sie müssen manchmal zwicken. Kannst du ein Beispiel geben? –

+0

Ich habe die Frage in der Bearbeitung ausgearbeitet. –

Antwort

13

Beachten Sie, dass alles, was erklärt, wie eine Struktur immer ein Werttyp ist, und alles, was erklärt, wie eine Klasse immer ein Referenztyp ist. Mit anderen Worten, ist List<int> noch ein Referenztyp, und wenn Sie hat:

struct Foo<T> 
{ 
    T value; 
} 

dann würde Foo<string> noch ein Werttyp sein.

Was Sie können tun mit den generischen Typen - sie folgen wirklich nur die normalen Regeln für Werttypen und Referenztypen; Was Sie tun können mit einem Wert des Typs Tinnerhalb der Typ, der davon abhängt, ob/wie T ist eingeschränkt. Es hängt nicht davon ab, ob der generische Typ selbst eine Struktur oder eine Klasse ist.

EDIT: Sasha erwähnt Nullable<T> in den Kommentaren. Ich bin mir nicht sicher, was "Ausnahme" hier gemeint ist - anders als Nullable<T> erfüllt nicht entweder die "where T : struct" oder "where T : class" Einschränkung. Es ist aber immer noch ein Werttyp (was Teil des Punktes ist).

+0

Jon, es gibt eine Ausnahme, wenn der Strukturtyp Nullable ist. Würdest du das auch näher ausführen? thx –

+0

danke für die Ausarbeitung ... –

+0

"alles als Klasse deklariert ist immer ein Werttyp" Tippfehler? – ShuggyCoUk

8

Als Reaktion auf Edit2: Sie können die Typen beschränken dürfen Referenz oder Wert, der durch die folgenden Möglichkeiten:

Referenz:

class ReferenceGeneric <T> where T: class 
{ 

} 

Wert:

struct ValueGeneric <T> where T: struct 
{ 


} 

Aus der folgenden Seite MSDN http://msdn.microsoft.com/en-us/library/d5x73970.aspx

+0

Können Sie struct nach Klasse einschränken: struct ValueGeneric where T: Klasse { } –