2013-07-06 3 views
9

В следующем коде я не знаю, что означает «где S: new()». Какое ключевое слово можно найти в Google?Что означает, где S: new() в C#

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

поиск ограничений по параметрам типа. здесь ссылка http://msdn.microsoft.com/en-us/library/d5x73970.aspx – qwr

+6

Дубликат [C# код путаницы where where] (http://stackoverflow.com/q/5461963), который я нашел путем поиска SO для [\ [C# \] generic, где new] (http://stackoverflow.com/search?q=%5Bc%23%5D+generic+where+new). Кроме того, [Что делает new() в 'where T: new()'] (http://stackoverflow.com/q/1085434), который SO показывает на боковой панели «Вопросы по теме». –

ответ

16

new() ограничение означает, что конкретный универсальный параметр должен иметь конструктор по умолчанию (я. Е. Конструктор без параметров).

Цель этого, как правило, заключается в том, чтобы позволить вам безопасно создавать новые экземпляры общих типов параметров, не прибегая к отражению/Activator.CreateInstance.

Например:

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.

Что касается поискового запроса google, я бы попробовал «C# new() constraint».

+1

Формальное имя - это ограничение _constructor_, поэтому вы также можете использовать Google. _Constraint_ - это самое важное слово, конечно. Обратите внимание: если 'T' является типом значения, то' new T(); 'не вызывает конструктор реальных экземпляров; он создает то же значение, что и 'default (T)', для типов значений. По этой причине не допускается комбинировать ограничение типа значения и ограничение конструктора, поэтому это незаконно: 'где T: struct, new()' (считается избыточным). Если 'T' является ссылочным типом,' default (T) 'дает ссылку« null », тогда как' new T(); 'вызывает реальный конструктор. –

+0

Любой тип значения, включая предопределенные целые типы и типы перечислений, удовлетворяет ограничению конструктора. Тип ссылки удовлетворяет его, если и только он (не является абстрактным и) имеет ** 'public' ** конструктор экземпляра нулевого параметра. (Абстрактные классы _should_ не имеют 'public' конструкторов.) –

Смежные вопросы