给出以下代码:
void Main()
{
dynamic[] arr = { 5, "test2", "test3"};
foreach (var i in arr)
{
Console.WriteLine(i.GetType().Name);
}
}
它打印以下内容:
Int32
String
String
我不明白数组如何具有不同类型的元素。从C背景来看,数组元素应具有相同的类型,并且每个元素都应占用相同数量的RAM。因为在C语言中,类似arr[i]
的内容等同于*(arr + i)
,指针arr
的移动i * sizeof(arr data type)
个步骤。
答案 0 :(得分:5)
dynamic[] arr = { 5, "test2", "test3"};
结果为object[]
(您可以查看是否致电arr.GetType()
)。
该数组包含相同类型的对象;在这种情况下,类型为object
。
将数组中的元素装箱。这段文字来自Boxing and Unboxing (C# Programming Guide)。
装箱是将值类型转换为类型对象或该值类型实现的任何接口类型的过程。当CLR装箱值类型时,它将值包装在System.Object实例内,并将其存储在托管堆中。
即使对于值类型,object[]
数组也不包含对象本身。它包含对它们的引用(string
is是C#中的引用类型)。
同样,这是从Boxing and Unboxing (C# Programming Guide)来的。
dynamic
在C#
我认为Using type dynamic (C# Programming Guide)的第一句话可以阐明动态代码在C#中的工作原理。
C#4引入了一种新类型
dynamic
。该类型是静态类型,但是动态类型的对象会绕过静态类型检查。
Built-in reference types (C# reference)的报价甚至更好。
动态类型指示使用变量及其成员的引用会绕过编译时类型检查。而是,这些操作在运行时解决。 (...)
动态类型在大多数情况下的行为类似于类型对象。
答案 1 :(得分:1)
请记住,在C#中,所有类都从Object
继承。
Object[]
数组实际上是一个包含指向实际对象的指针的数组,因此大小始终相同。
内存看起来像这样:
dynamic[]
数组将强制转换为Object[]
,因此在其中接受任何数据类型。
关于不是从Object
继承的结构,运行时使用名为boxing的技巧将结构放入对象中,因此允许结构项进入数组。 / p>
答案 2 :(得分:0)
dynamic
类型将作为对象存储,但是在运行时,编译器将加载更多字节,以了解如何处理dynamic
类型。为了做到这一点,将使用更多的内存来解决这一问题。将dynamic
视为一个奇特的对象。