据称,当使用引用类型实例化时, native 代码为实例化的泛型类型共享,但不为值类型共享。
这是为什么呢?有人会解释深入的细节吗?
更具体一点:
类 MyGenericType{
MyGenericType<string> and MyGenericType<Shape>
只会生成一个代码,而
MyGenericType<int> and MyGenericType<long>
不会,因此它回避了使用引用类型是否更有效的问题——
MyGenericType<int> vs. MyGenericType<SomeIntegerWrapper>
谢谢
最佳答案
首先纠正问题中的一个谬误,int
和 System.Int32
是同义词。 MyGenericType<int>
和 MyGenericType<Int32>
是完全相同的类型。
其次,要解决这个问题(并略微扩展 Mehrdad 的回答):考虑 CLR 需要了解的类型。它包括:
- 该类型值的大小(即,如果您有某种类型的变量,该内存需要多少空间?)
- 如何根据垃圾回收处理值:它是对对象的引用,还是可能包含其他引用的值?
对于所有引用类型,这些问题的答案都是一样的。大小只是一个指针的大小,值始终只是一个引用(因此如果变量被认为是根,GC 需要递归地下降到它)。
对于值类型,答案可能大相径庭。例如,考虑:
struct First
{
int x;
object y;
}
struct Second
{
object a;
int b;
}
当 GC 查看一些内存时,它需要知道 First
之间的区别和 Second
所以它可以递归到y
和 a
但不是 x
和 b
.我相信此信息是由 JIT 生成的。现在考虑 List<First>
的信息和 List<Second>
- 它不同,因此 JIT 需要区别对待两者。
如果这不是很清楚,我深表歉意 - 这是有点深奥的东西,而且我对 CLR 的细节并不像我可能的那样热衷。
关于c# - 共享通用代码以了解引用类型的原因和效率影响,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/598702/