我在 .NΕΤ 中阅读了一些关于泛型的信息,并注意到一件有趣的事情。
例如,如果我有一个泛型类:
class Foo<T>
{
public static int Counter;
}
Console.WriteLine(++Foo<int>.Counter); //1
Console.WriteLine(++Foo<string>.Counter); //1
两个类 Foo<int>
和 Foo<string>
在运行时是不同的。但是如果非泛型类具有泛型方法呢?
class Foo
{
public void Bar<T>()
{
}
}
很明显只有一个Foo
类(class)。但是方法呢 Bar
?所有通用类和方法都在运行时使用它们使用的参数关闭。是不是表示类Foo
有许多 Bar
的实现以及有关此方法的信息存储在内存中的什么位置?
最佳答案
As opposed to C++ templates , .NET 泛型是在运行时评估的,而不是在编译时评估的。从语义上讲,如果您使用不同的类型参数实例化泛型类,它们的行为就像是两个不同的类,但在幕后,编译的 IL(中间语言)代码中只有一个类。
泛型
当您 use Reflection 时,相同泛型类型的不同实例化之间的差异变得明显: typeof(YourClass<int>)
不会与 typeof(YourClass<string>)
相同.这些称为构造泛型类型。还有一个 typeof(YourClass<>)
代表通用类型定义。这里有一些 further tips关于通过反射处理泛型。
当你instantiate a constructed generic class ,运行时动态生成一个专门的类。它处理值类型和引用类型的方式存在细微差别。
- 编译器只会在程序集中生成一个通用类型。
- 运行时为您使用它的每个值类型创建一个单独版本的泛型类。
- 运行时为泛型类的每个类型参数分配一组单独的静态字段。
- 因为引用类型具有相同的大小,所以运行时可以重用它在您第一次将它与引用类型一起使用时生成的专用版本。
通用方法
对于 generic methods ,原理是一样的。
- 编译器只生成一个泛型方法,即泛型方法定义。
- 在运行时,方法的每个不同特化都被视为同一类的不同方法。
关于c# - 通用方法存储在哪里?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41461595/