给出以下代码:
void Main()
{
dynamic[] arr = { 5, "test2", "test3"};
foreach (var i in arr)
{
Console.WriteLine(i.GetType().Name);
}
}
Run Code Online (Sandbox Code Playgroud)
它显示以下内容:
Int32
String
String
Run Code Online (Sandbox Code Playgroud)
我不明白数组如何具有不同类型的元素。从C背景来看,数组元素应具有相同的类型,并且每个元素都应占用相同数量的RAM。因为在C,像arr[i]就相当于*(arr + i)和指针arr会移动i * sizeof(arr data type)的步骤。
dynamic[] arr = { 5, "test2", "test3"};
Run Code Online (Sandbox Code Playgroud)
结果object[](您可以查看是否致电arr.GetType())。
该数组包含相同类型的对象。在这种情况下,类型为object。
数组中的元素被装箱。这段文字来自装箱和拆箱(C#编程指南)。
装箱是将值类型转换为类型对象或该值类型实现的任何接口类型的过程。当CLR装箱值类型时,它将值包装在System.Object实例内,并将其存储在托管堆中。
object[]即使是值类型的数组,也不包含对象本身。它包含对它们的引用(顺便说一句string 是 C#中的引用类型)。
同样,这来自装箱和拆箱(C#编程指南)。
dynamic 在 C#我认为使用动态类型(C#编程指南)的第一句话可以阐明动态在C#中的工作方式。
C#4引入了一种新类型
dynamic。该类型是静态类型,但是动态类型的对象会绕过静态类型检查。
内置引用类型(C#引用)中的引号甚至可能更好。
动态类型指示使用变量及其成员的引用会绕过编译时类型检查。而是,这些操作在运行时解决。(...)
在大多数情况下,动态类型的行为类似于类型对象。