[英]How generic methods gets instantiated in C#?
假设我有一个通用方法:
void Fun<T>(FunArg arg) {}
是this.Fun<Feature>
和this.Fun<Category>
是泛型方法的不同实例吗?
一般来说,泛型方法如何实例化? 不同的泛型参数会产生不同的方法,或者同一个方法以及在运行时使用的不同元数据?
请使用语言规范中的一些引用来支持您的回答。
另外,假设我做了这些:
client.SomeEvent += this.Fun<Feature>; //line1
client.SomeEvent += this.Fun<Category>; //line2
client.SomeEvent += this.Fun<Result>; //line3
然后,
client.SomeEvent -= this.Fun<Feature>; //lineX
是否lineX
撤消我在做的事情line1
? 或者它还取决于其他人呢?
它们都共享一个方法定义 ,但在运行时它们是不同的MethodInfo
- 因为泛型类型参数定义了一个泛型方法。
支持插图:
Action<FunArg> a1 = Fun<X>;
Action<FunArg> a2 = Fun<Y>;
Action<FunArg> a3 = Fun<Y>;
Console.WriteLine(a1.Method == a2.Method); // false
Console.WriteLine(a3.Method == a2.Method); // true
在JIT级别,它更复杂; 任何引用类型参数都将共享一个实现,因为引用是引用是一个引用(注意所有这样的T
必须提前满足任何约束)。 如果存在值类型T
,那么泛型类型参数的每个组合在运行时都会获得单独的实现,因为每个需要不同的最终实现。
这取决于所涉及的类型。
对于所有引用类型(即类 ),将使用一种方法JIT来处理它们。
对于所有值类型(即结构 ), 每种类型的一个方法将被JITted。
所以问题中的信息不够详细,无法回答,如果Feature
和Category
是引用类型,那么是的,一个方法将被JIT为它们。 如果其中一个或两者都是值类型,则每个值类型的一个方法将被JIT。
请注意我在这里使用JITted这个词。 在编译的程序集中,只有一个方法,但在运行时,JITter将根据上述规则创建泛型方法的实际实现。
流行测验 :如果在具有泛型类型/方法的程序集上使用NGEN
会发生什么? (提示: 不是你的想法 )
是的,它们将成为两种不同的方法。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.