2013-07-06 16 views
9

W poniższym kodzie nie wiem, co znaczy "gdzie S: nowy()" część. Jakie jest słowo kluczowe, aby znaleźć więcej informacji w Google?Co oznacza gdzie S: new() in C#

public virtual void Print<S, T>() 
     where S : new() 
    { 
     Console.WriteLine(default(T)); 
     Console.WriteLine(default(S)); 
    } 
+1

wyszukaj ograniczenia dla parametrów typu. tutaj jest link http://msdn.microsoft.com/en-us/library/d5x73970.aspx – qwr

+6

Duplikat [mylącego kodu C# z klauzuli where] (http://stackoverflow.com/q/5461963), który znalazłem po wyszukaniu SO dla [\ [C# \] generic gdzie new] (http://stackoverflow.com/search?q=%5Bc%23%5D+generic+wherew). Ponadto, [What does new() does in 'where T: new()'] (http://stackoverflow.com/q/1085434), które SO pokazuje na pasku bocznym Pokrewne pytania. –

Odpowiedz

16

new() Ograniczenie oznacza, że ​​dany parametr generycznych muszą mieć domyślny konstruktor (tj. Np. Konstruktor bez parametrów).

Celem tego jest zazwyczaj, aby umożliwić wpisywanie-bezpiecznie konstruować nowe instancje ogólnych typów parametrów, bez uciekania się do refleksji/Activator.CreateInstance.

Na przykład:

public T Create<T>() where T : new() 
{ 
    // allowed because of the new() constraint 
    return new T(); 
} 

Aby uzyskać więcej informacji, sprawdź http://msdn.microsoft.com/en-us/library/sd2w2ew5%28v=vs.80%29.aspx.

Jeśli chodzi o wyszukiwarce Google terminu, będę próbować "C# new() wiązania".

+1

Formalna nazwa to _konstruktor constraint_, więc jest to coś, do czego można również użyć google. _Constraint_ jest oczywiście najważniejszym słowem. Zauważ, że jeśli 'T' jest typem wartości, to' new T(); 'nie wywołuje prawdziwego konstruktora instancji; konstruuje taką samą wartość jak 'default (T)', dla typów wartości. Z tego powodu nie można łączyć ograniczenia typu wartości z ograniczeniem konstruktora, więc jest to niedozwolone: ​​'gdzie T: struct, new()' (uznany za redundantny). Jeśli 'T' jest typem odniesienia,' default (T) 'daje' null' reference, podczas gdy 'new T();' wywołuje prawdziwy konstruktor. –

+0

Dowolny typ wartości, w tym predefiniowane typy całkowite i typy wyliczeniowe, spełnia ograniczenie konstruktora. Typ referencyjny spełnia go, jeśli jest i tylko jest (jest nie abstrakcyjny i) ma konstruktor instancji ** 'public' ** zero-parametr. (Klasa abstrakcyjna _ nie może mieć "publicznych" konstruktorów.) –