C#通用静态构造函数

将一个generics类的静态构造函数运行到你传递给generics参数的每一个types如下:

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

有没有使用这种方法的退步?

是的,静态构造函数将为每个closures的类types(指定types参数时创build的types)调用一次。 请参阅C#3规范 ,第10.12节“静态构造函数”。

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

并且:

因为静态构造函数对于每个封闭的构造类types只执行一次,所以对编译时通过约束(§10.1.5)无法检查的types参数执行运行时检查是一个方便的地方。 例如,以下types使用静态构造函数来强制type参数是一个枚举:

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

阅读§4.4.2打开和closurestypes也是相关的:

在运行时,genericstypes声明中的所有代码都是在通过对generics声明应用types参数而创build的封闭构造types的上下文中执行的。 genericstypes中的每个types参数都绑定到特定的运行时types。 所有语句和expression式的运行时处理总是在封闭types中进行,而开放types只在编译时处理。

每个封闭的构造types都有自己的一组静态variables,这些静态variables不与任何其他封闭的构造types共享。

这个程序你可以运行自己演示静态构造函数被调用三次,而不是一次:

 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
计划+巴兹

它会起作用,但会为您使用的每种types创build一个新的“实例”。

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

是的,它会运行您提供的每种types,因为对于每种不同的供应types,您会得到不同的types。