据我所知,当第一次调用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();
}
}
答案 0 :(得分:3)
当首次使用值类型作为参数构造泛型类型时,运行时会创建一个专用泛型类型,其中提供的参数或参数将替换为MSIL中的相应位置。为每个用作参数的唯一值类型(from here)创建一次专用泛型类型。
因此,每次使用不同参数化的泛型类型时,运行时都会创建一个新的专用版本,不确定它是否会将其存储在堆中,但它肯定会将其存储在某个地方。
因此,在您的代码中,将创建三种类型:GenericTypesClass<string, string>
,GenericTypesClass<int, int>
和GenericTypesClass<Simple,Simple>