【发布时间】:2018-12-17 05:13:14
【问题描述】:
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 为每个元素存储“元”信息......
还是我错了?
【问题讨论】:
-
您应该阅读提供标准类型结构的 unix 手册。在 unix 中,结构的大小需要确定。因此,对于非标准对象,长度会在需要时继续对象。字符串以 '\n' 结束。在 Net 库中,结构(或类)不仅是连续内存块,还包含类型和大小(在需要时)。 c# 有 Anonymous(运行时)和 Non- Anonymous 类型(在编译时定义)。
-
@JohnG 当然不会抛出异常,下次请仔细阅读问题
-
@jdweng 我知道 Unix 上类型大小的工作原理。你试图回答另一个问题。请下次也仔细阅读问题。
-
我读了这个问题。为什么你认为 c# 与 c 语言有什么不同?对象的大小必须是确定的。你说:“C# 中的数组只是一块连续的内存,就像任何其他语言一样”。然后说“我知道 Unix 的类型大小是如何工作的”是矛盾的。 Unix 是 c 语言,它不仅仅是内存块。