泛型类中的静态通用字段

时间:2016-08-31 16:04:02

标签: c# .net clr

据我所知,当第一次调用C#中的类型时,CLR会找到这种类型并为这种类型创建包含类型对象指针,同步块索引器,静态字段,方法表的对象类型(更多信息见第4章) ' CLR通过C#' book)。好吧,一些泛型类型有静态通用字段。我们为这个字段设置值

GenericTypesClass<string, string>.firstField = "firstField";
GenericTypesClass<string, string>.secondField = "secondField";

再次

GenericTypesClass<int, int>.firstField = 1;
GenericTypesClass<int, int>.secondField = 2;

之后在堆上创建了两个不同的对象类型还是没有?

这里有更多的考试:

class Simple
{
}

class GenericTypesClass<Type1,Type2>
{
    public static Type1 firstField;
    public static Type2 secondField;
}

class Program
{
    static void Main(string[] args)
    {
        //first call GenericTypesClass, create object-type
        Type type = typeof (GenericTypesClass<,>);

        //create new object-type GenericTypesClass<string, string> on heap
        //object-type contains type-object pointer,sync-block indexer,static fields,methods table(from  Jeffrey Richter : Clr Via C#(chapter 4))
        GenericTypesClass<string, string>.firstField = "firstField";
        GenericTypesClass<string, string>.secondField = "secondField";

        //Ok, this will create another object-type?
        GenericTypesClass<int, int>.firstField = 1;
        GenericTypesClass<int, int>.secondField = 2;

        //and another object-type?
        GenericTypesClass<Simple,Simple>.firstField = new Simple();
        GenericTypesClass<Simple, Simple>.secondField = new Simple();
    }
}

1 个答案:

答案 0 :(得分:3)

当首次使用值类型作为参数构造泛型类型时,运行时会创建一个专用泛型类型,其中提供的参数或参数将替换为MSIL中的相应位置。为每个用作参数的唯一值类型(from here)创建一次专用泛型类型。

因此,每次使用不同参数化的泛型类型时,运行时都会创建一个新的专用版本,不确定它是否会将其存储在堆中,但它肯定会将其存储在某个地方。

因此,在您的代码中,将创建三种类型:GenericTypesClass<string, string>GenericTypesClass<int, int>GenericTypesClass<Simple,Simple>