我有一个未知的结构类型数组。当我试图获得一些索引时,我得到了这个对象的一个新实例:
var inst = ((SomeStruct)((Array)arrOfSomeStruct).GetValue(0));
现在 inst 是与 arrOfSomeStruct [0] 不同的实例。
获取数组项原始实例的最佳或最快方式是什么,而不是使用 [] 运算符?
答案 0 :(得分:4)
如果原件是value type
,则无法获取原件。如果从方法返回或传递给方法,则每个Value Type
都将被复制。
要按照您的意愿工作,您必须使用reference type(class)
答案 1 :(得分:2)
这是与结构交互的默认行为。它被复制,未被引用。对于每个包含结构的交换都是如此,而不仅仅是GetValue
方法(例如this[index]
)。
...对于值类型数组,
.GetValue(0)
返回对struct值的盒装副本的引用。另一方面,[0]
是原始的结构值。如果您分配给变量,则然后复制,如var valueCopy = arr[0];
中所示。但是,这与可变值类型大多相关。如果struct有一个变构结构值的成员,那么arr[0].MutateValue();
将改变原始结构。当然valueCopy.MutateValue();
会更改副本。
你拥有的最佳选择是使结构成为一个对象,即。搬到一个班级。
在某些极端的情况下,使用不安全的代码是最后的手段:
unsafe
{
Point p = new Point(1, 2);
Point*[] points = new Point*[] { &p };
Point* p2 = points[0];
p2->X = 2; // this changes both p and p2
}