2013-04-05 1 views
-3

Мое соображение о том, почему кто-то предпочел бы делать это в статическом конструкторе, который вызывается ровно один раз, если данный тип является неправильным во всех вызовах, а не только один раз, и я бы предпочел бы получить исключения во всех частях кода, где неправильный тип используемый.Почему лучше проверить тип T в родовом классе в статическом конструкторе вместо нестатического?

Это пример того, что я имею в виду:

internal sealed class GenericTypeThatRequiresAnEnum<T> { 
    static GenericTypeThatRequiresAnEnum() { 
     if (!typeof(T).IsEnum) { 
     throw new ArgumentException("T must be an enumerated type"); 
     } 
    } 
} 

Почему не только не-статический конструктор?

+0

Можете ли вы поделиться код? Или, по крайней мере, пример? –

+0

Зачем вам вообще нужно проверять тип? – Oded

+0

Можете ли вы уточнить, какую проверку вы хотите выполнить? Возможно, вы можете использовать общие ограничения типов. –

ответ

4

Поскольку вы не можете использовать конкретный тип вообще, если статический конструктор терпит неудачу. Итак, нет смысла проверять аргумент типа везде.

public class Test<T> 
    { 
     static Test() 
     { 
      throw new InvalidOperationException(); 
     } 
    } 

Использование:

new Test<string>(); //throws TypeInitializationException 
+0

Хорошо, мы можем сказать, что это сокращает время выполнения в этом случае, но разве это не делает отладку сложнее, поскольку мы не получаем сообщение о точном исключении? – user1121956

+1

Да, у вас будет точное сообщение об исключении, но подробности будут указаны в свойстве InnerException. Также полезно не дублировать код –

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