c# - 共享通用代码以了解引用类型的原因和效率影响

标签 c# .net generics

据称,当使用引用类型实例化时, native 代码为实例化的泛型类型共享,但不为值类型共享。

这是为什么呢?有人会解释深入的细节吗?

更具体一点:

类 MyGenericType{

 MyGenericType<string> and MyGenericType<Shape>

只会生成一个代码,而

 MyGenericType<int> and MyGenericType<long> 

不会,因此它回避了使用引用类型是否更有效的问题——

MyGenericType<int> vs. MyGenericType<SomeIntegerWrapper>

谢谢

最佳答案

首先纠正问题中的一个谬误,intSystem.Int32是同义词。 MyGenericType<int>MyGenericType<Int32>是完全相同的类型。

其次,要解决这个问题(并略微扩展 Mehrdad 的回答):考虑 CLR 需要了解的类型。它包括:

  • 该类型值的大小(即,如果您有某种类型的变量,该内存需要多少空间?)
  • 如何根据垃圾回收处理值:它是对对象的引用,还是可能包含其他引用的值?

对于所有引用类型,这些问题的答案都是一样的。大小只是一个指针的大小,值始终只是一个引用(因此如果变量被认为是根,GC 需要递归地下降到它)。

对于值类型,答案可能大相径庭。例如,考虑:

struct First
{
    int x;
    object y;
}

struct Second
{
    object a;
    int b;
}

当 GC 查看一些内存时,它需要知道 First 之间的区别和 Second所以它可以递归到ya但不是 xb .我相信此信息是由 JIT 生成的。现在考虑 List<First> 的信息和 List<Second> - 它不同,因此 JIT 需要区别对待两者。

如果这不是很清楚,我深表歉意 - 这是有点深奥的东西,而且我对 CLR 的细节并不像我可能的那样热衷。

关于c# - 共享通用代码以了解引用类型的原因和效率影响,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/598702/

相关文章:

c# - 如何在操作系统关闭期间延迟 Topshelf 服务停止

c# - ASP.NET 中的单选按钮

c# - 何时使用 ExecuteScalar、ExecuteReader 和 ExecuteNonQuery?

c# - .NET 中的外部翻译

generics - 如何使用 Codable 解析通用响应

java - 无法修复抽象方法错误 (Java)

c# - 检测空间并添加逗号

java - 使用 java 以编程方式突出显示 MS Word 中的文本

Java 通用列表<List<?扩展号码>>

c# - 如何以编程方式编辑特定用户的注册表项?