2d数组转换为1d数组,这是对旧内存的完整复制还是另一种引用



那里,

我使用以下代码将2d数组转换为1d数组:

object[] newobj = (object[])obj;

我困惑的是,这实际上是分配了一个内存并复制了完整的"内存"吗;obj";到一个新的1d阵列";newobj";,或者newobj只是指向"的另一个引用(或者应该说是指针(;obj";?它是否需要额外的内存和复制时间?

另一个问题是,如果这个";obj";只是一个变量,而不是一个数组,这段代码会将其转换为长度等于1的1d数组?

请澄清一下。

提前感谢,alex

好吧,我冒昧地假设你指的是数组数组,而不是2d数组,否则cast将不会编译

多维数组[][]vs[,]

公平地说,这很令人困惑!

当涉及到弄清楚代码是如何工作的时候,只要有一把小提琴就不会有什么坏处。我敲了一些伪代码来表明你所做的只是创建一个对内存的新引用,而不是创建一个副本。

object[][] obj = new object[5][]; //Delcare Jagged array
obj[0] = new object[] { 1, 1, 1 };
obj[1] = new object[] { 2, 2, 2 };
obj[2] = new object[] { 3, 3, 3 };
obj[3] = new object[] { 4, 4, 4 };
obj[4] = new object[] { 5, 5, 5 }; //Fill up with stuff
Console.WriteLine("{0}", obj[2][0]);  // prints 3
object[] newobj = (object[])obj; // Declare array of objects and cast 
newobj[2] = new object[] { 9, 9, 9 }; // update using the new refrence
Console.WriteLine("{0}", obj[2][0]); // print from old reference, now prints 9
Console.WriteLine("{0}", ((object[])newobj[2])[0]); // print from new reference, prints 9 but requires a cast
Console.WriteLine("{0}", newobj[2][0]); // Error, cannot apply indexing with [] to an expression of type object

因此,您可以看到,从新的1d引用更新数组仍然会更新原始引用仍然指向的底层内存。然而,由于您向编译器坚持第二个引用是1d数组,因此您不能再使用[][]语法,或者至少不能在没有再次回写的情况下使用

您还可以使用诸如ILSpy之类的工具来查看代码的编译方式。在这种情况下,我们的函数在顶部声明了两个本地类型

.locals init (
[0] object[][],
[1] object[]
)

但是当强制转换发生时,IL所做的只是将变量0的值(引用(推到堆栈上,并将其弹出到变量1中,就这么简单!

IL_00ca: ldloc.0  //push 0
IL_00cb: stloc.1  //pop 1

最新更新