C#数组如何处理内存?
How C# Array works with memory?
C# 中的数组只是一块连续的内存,就像在任何其他语言中一样。
默认情况下,在 T[]
处按索引操作获取元素将花费 O(1),因为计算 index * sizeof(T)
。但这只有在我们知道 sizeof(T)
.
时才有效
所以我尝试破解它:
var sampleArray = new string[10];
sampleArray[0] = "1";
sampleArray[1] = "2";
var objectArray = (object[]) sampleArray;
objectArray[2] = 42;
并且可以预测得到运行时间 System.ArrayTypeMismatchException
。
好的,但是今天我发现了这个例子:
var arr = new[] { new object[] { new[] { 1 }, 2, "3" } };
var someValue = arr[0][1];
且本例无异常编译运行
为什么?
如果元素不同,对象数组如何知道任何元素的大小?
这对于低级别不同长度的字符串如何工作?
我不认为 Array
存储每个元素的 'meta' 信息...
或许我错了?
String
和 Object
是 引用类型 ,即数组 string[] 和 object[] 包含对数据的引用,而不是数据本身.
引用具有固定大小(32 位或 64 位,具体取决于处理器架构)。
C# 中的数组只是一块连续的内存,就像在任何其他语言中一样。
默认情况下,在 T[]
处按索引操作获取元素将花费 O(1),因为计算 index * sizeof(T)
。但这只有在我们知道 sizeof(T)
.
所以我尝试破解它:
var sampleArray = new string[10];
sampleArray[0] = "1";
sampleArray[1] = "2";
var objectArray = (object[]) sampleArray;
objectArray[2] = 42;
并且可以预测得到运行时间 System.ArrayTypeMismatchException
。
好的,但是今天我发现了这个例子:
var arr = new[] { new object[] { new[] { 1 }, 2, "3" } };
var someValue = arr[0][1];
且本例无异常编译运行
为什么?
如果元素不同,对象数组如何知道任何元素的大小?
这对于低级别不同长度的字符串如何工作?
我不认为 Array
存储每个元素的 'meta' 信息...
或许我错了?
String
和 Object
是 引用类型 ,即数组 string[] 和 object[] 包含对数据的引用,而不是数据本身.
引用具有固定大小(32 位或 64 位,具体取决于处理器架构)。