2013-07-06 19 views
9

Aşağıdaki kodda "S: new()" bölümünün ne anlama geldiğini bilmiyorum. Google'da daha fazla bilgi bulmak için anahtar kelime nedir?Ne demek S: new() in C#

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

Tür Parametreleri ile ilgili Kısıtlamaları arayın. Burada bağlantı http://msdn.microsoft.com/en-us/library/d5x73970.aspx – qwr

+6

Ben bulundu [C# kod karmaşası] yan tümce (http://stackoverflow.com/q/5461963), bulundu [\ [C# \] generic, yeni olduğu yerde SO için arama yaparak] (http://stackoverflow.com/search?q=%5Bc%23%5D+generic+where+new). Ayrıca, [Yeni() T: new() '] (http://stackoverflow.com/q/1085434) 'ın SO'sunun İlgili Sorular kenar çubuğunda gösterdiği yerde ne yapar. –

cevap

16

new() kısıtlama Özel bir jenerik parametre varsayılan bir kurucu (i. E., Parametre ile bir yapıcı) sahip olacak şekilde gerekli olduğu anlamına gelir.

Bunun amacı, genellikle yansıma/Activator.CreateInstance uygulamasına başvurmadan jenerik parametre türlerinin yeni örneklerini güvenli bir şekilde oluşturmanıza olanak sağlamaktır. Örneğin

: Daha fazla bilgi için

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

, http://msdn.microsoft.com/en-us/library/sd2w2ew5%28v=vs.80%29.aspx göz atın.

Google arama terimi için "C# new() sınırlaması" nı deneyebilirim.

+1

Resmi ad, bir _constructor constraint_, bu yüzden aynı zamanda google için de yapabileceğiniz bir şey. _Constraint_ elbette en önemli kelimedir. 'T' bir değer türü olduğunda, 'yeni T(); 'bir gerçek örnek kurucuyu çağırmaz; değer türleri için "default (T)" ile aynı değeri oluşturur. Bu nedenle, bir değer türü kısıtlaması ve bir kurucu kısıtını birleştirmesine izin verilmez, bu yüzden bu yasa dışıdır: 'T: struct, new()' (gereksiz olarak kabul edilir). Eğer 'T' bir referans tipi ise, 'default (T)' bir 'null' referansı verirken, 'yeni T(); 'gerçek bir kurucu çağırır. –

+0

Önceden tanımlanmış tamsayı türleri ve enum türleri de dahil olmak üzere, herhangi bir değer türü yapıcı kısıtlamasını karşılar. Bir referans tipi, sadece (ve soyut olmayan) bir ** 'public' ** sıfır parametresi örnek kurucuya sahipse bunu karşılar. (Soyut sınıflar _should_ 'public' constructors 'değil.) –