Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/279.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 泛型如何实现结构?_C#_.net_Generics_Cil - Fatal编程技术网

C# 泛型如何实现结构?

C# 泛型如何实现结构?,c#,.net,generics,cil,C#,.net,Generics,Cil,我在想这个。课程显然是通过ptr传递的。我怀疑结构是通过复制来传递的,但我不确定。(对于int数组来说,让每个元素都有一个ptr并为int传递ptr似乎是一种浪费) 但是仔细想想,List无法知道我的结构的大小。当我这样做时会发生什么?是否有“List`1”的多个副本,并且每次我将其与存储大小一起使用时,它都会创建一个新的实现?(调整T等的新偏移量) 这可能是有意义的,因为源代码将位于DLL内部的CIL中。但我完全在猜测,这是怎么做到的?可能是对ECMA标准的引用或页面?泛型使用开放泛型类型和封

我在想这个。课程显然是通过ptr传递的。我怀疑结构是通过复制来传递的,但我不确定。(对于int数组来说,让每个元素都有一个ptr并为int传递ptr似乎是一种浪费)

但是仔细想想,
List
无法知道我的结构的大小。当我这样做时会发生什么?是否有“List`1”的多个副本,并且每次我将其与存储大小一起使用时,它都会创建一个新的实现?(调整T等的新偏移量)


这可能是有意义的,因为源代码将位于DLL内部的CIL中。但我完全在猜测,这是怎么做到的?可能是对ECMA标准的引用或页面?

泛型使用开放泛型类型和封闭泛型类型的概念:参数化泛型类定义(即
列表
)是一种开放泛型类型,运行时会为代码中的每个不同用途生成封闭泛型类型,也就是说,为
列表
列表
创建不同的类型-对于每个关闭的泛型类型,
T
的大小和类型在运行时是已知的

澄清:

当使用泛型类型或方法时 编译成微软中间版本 语言(MSIL),它包含元数据 将其标识为具有类型 参数。如何将MSIL用于泛型 所使用的类型根据是否 提供的类型参数是一个值 类型或引用类型

当泛型类型是第一个 以值类型作为 参数,运行时将创建 具有 提供的一个或多个参数 以适当的方式替换 MSIL中的位置。专业的 泛型类型为一次创建 用作的每个唯一值类型 参数

泛型的工作方式在某些方面有所不同 引用类型。第一次 泛型类型是用任何 引用类型,运行时将创建 带有对象的专用泛型类型 引用文件取代了 MSIL中的参数。然后,每 创建构造类型的时间 实例化引用类型为 它的参数,无论是什么类型 也就是说,运行时重用 以前创建的专用版本 属于泛型类型。这是可能的 因为所有的引用都是一样的 尺寸


CLR编译泛型类的1个版本,并将其用于所有引用类型。它还为每个值类型使用编译了一个版本,以优化性能。

我对C#如何实现泛型知之甚少。但是为了参考,这正是C++模板工作的原理(在理论上,对于每个类型都会例示<代码>清单>代码>。@ OLI:YEP,我也知道它不编译方法,除非您使用它,并且您需要在页眉中使用模板。C#没有标题,但泛型在编译成dll@Oli:也就是说,每个值类型将有单独的实现,引用类型将有一个共享实现。@Oded:我看不出您的链接如何回答任何问题。。。他们都没有提到泛型