那里,
我使用以下代码将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