Array.GetValue()返回struct对象的新实例

时间:2016-08-09 06:50:36

标签: c# arrays structure

我有一个未知的结构类型数组。当我试图获得一些索引时,我得到了这个对象的一个​​新实例:

var inst = ((SomeStruct)((Array)arrOfSomeStruct).GetValue(0));

现在 inst 是与 arrOfSomeStruct [0] 不同的实例。

获取数组项原始实例的最佳最快方式是什么,而不是使用 [] 运算符?

2 个答案:

答案 0 :(得分:4)

如果原件是value type,则无法获取原件。如果从方法返回或传递给方法,则每个Value Type都将被复制。

要按照您的意愿工作,您必须使用reference type(class)

答案 1 :(得分:2)

这是与结构交互的默认行为。它被复制,未被引用。对于每个包含结构的交换都是如此,而不仅仅是GetValue方法(例如this[index])。

Jeppe Stig Nielsen评论:

  

...对于值类型数组,.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
}