2010-05-29 134 views
41

将在通用类的静态构造函数每次传递到泛型参数,如这种类型的运行:C#泛型静态构造函数

class SomeGenericClass<T> 
{ 
     static List<T> _someList; 
     static SomeGenericClass() 
     { 
      _someList = new List<T>(); 
     } 
} 

是否有抽奖背上用这种方法?

回答

52

是的,静态构造函数将为每个封闭类类型(指定类型参数时创建的类型)调用一次。请参阅C# 3 specification,§10.12静态构造函数。

封闭类类型的静态构造函数在给定的应用程序域中最多执行一次。

和也:

由于静态构造正好一次为每个封闭构造类类型执行时,它是执行在不能在被检查的类型参数的运行时检查一个方便的地方编译时间通过约束(§10.1.5)。例如,下面的类型使用静态构造来执行该类型参数是一个枚举:

class Gen<T> where T: struct 
{ 
    static Gen() { 
     if (!typeof(T).IsEnum) { 
      throw new ArgumentException("T must be an enum"); 
     } 
    } 
} 

它也是相关的读取§4.4.2打开和关闭的类型:

在运行时,泛型类型声明中的所有代码都是在通过对泛型声明应用类型参数而创建的封闭构造类型的上下文中执行的。泛型类型中的每个类型参数都绑定到特定的运行时类型。所有语句和表达式的运行时处理总是在封闭类型中发生,而开放类型只在编译时处理时才会发生。

每个封闭构造类型都有自己的一组静态变量,它们不与任何其他封闭构造类型共享。

这个程序,你可以自己运行表明,该静态构造函数被调用了三次,不只是一次:

public class Program 
{ 
    class SomeGenericClass<T> 
    { 
     static SomeGenericClass() 
     { 
      Console.WriteLine(typeof(T)); 
     } 
    } 

    class Baz { } 

    static void Main(string[] args) 
    { 
     SomeGenericClass<int> foo = new SomeGenericClass<int>(); 
     SomeGenericClass<string> bar = new SomeGenericClass<string>(); 
     SomeGenericClass<Baz> baz = new SomeGenericClass<Baz>(); 
    } 
} 

输出:

 
System.Int32 
System.String 
Program+Baz 
+0

那是一个静态类吗? – 2010-05-29 21:06:21

+5

@Jouke van der Maas,他谈到了静态课程?问题是关于泛型类的静态构造函数,而不是静态类... – 2010-05-29 22:39:32

+0

这是既不,所以它仍然适用:) – 2010-05-30 02:25:52

0

是的,泛型类型的静态成员和构造函数是特定于泛型参数的,并且将针对每种不同类型运行。没有真正的缺点。将非泛型类重构为通用类时要小心。

0

是的,它会针对您提供的每种类型运行,因为对于每种不同的提供类型,您都会获得单独的类型。

2

它将工作,而是一个新的将为您使用的每种类型创建'实例'。