Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/317.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 数组中对象的引用未保留_C#_Arrays_Struct_Reference - Fatal编程技术网

C# 数组中对象的引用未保留

C# 数组中对象的引用未保留,c#,arrays,struct,reference,C#,Arrays,Struct,Reference,如果列表中对对象的引用丢失,我会遇到一个问题,我就是这样详细阐述我的代码的: PropertyObject[] myProperties = new PropertyObject[200]; var objParent = new Parent(); var objProperty = new PropertyObject(); myProperties[0] = objProperty; objParent.property = myProperties[0]; 现在,当我修改objPar

如果列表中对对象的引用丢失,我会遇到一个问题,我就是这样详细阐述我的代码的:

PropertyObject[] myProperties = new PropertyObject[200];
var objParent = new Parent();
var objProperty = new PropertyObject();

myProperties[0] = objProperty;
objParent.property = myProperties[0];
现在,当我修改
objParent.property
时,它不会修改
myProperties
数组中的对象,有什么解决方法吗?我需要这个,这样我就不必迭代数组了

以下是我修改对象的方式:

public void modifyObject(ref Parent objectToModify) {
   objectToModify.property.isThisCrazy = true;
}

然后我只调用
modifyObject
方法。

struct
s是不可变的。将
struct
分配给另一个变量将导致复制
struct

在一个实例上指定属性时,
struct
的另一个实例的属性不会更改。因此,在其他引用中看不到更新

演示结构问题的示例代码:

struct X
{
    public string Y { get; set; }

    public X(string y) : this()
    {
        Y = y;
    }
}

X x = new X("abc");
X x2 = x;

x2.Y = "def";

Console.WriteLine(x.Y);
Console.WriteLine(x2.Y);
对于类,您希望
x.Y
x2.Y
是相同的,但与结构不同。

您编写的“对对象的引用”丢失,但
struct
没有对它的“引用”

struct
具有值类型语义。因此,当您使用
=
进行赋值时,将生成右侧的副本。你可以:

myProperties[0] = objProperty;
这将复制该值,并将副本放入数组的第0个条目中

如果以后修改“原始”实例
objProperty
,则该更改将不会出现在阵列中保存的副本中

这实际上不是一个数组问题。所有
struct
值赋值也会发生同样的情况。例如:

var objProperty2 = objProperty;
如果原始的
objProperty
随后发生变异,则复制的值
objProperty2
将不受影响。例如,见


有些人认为可变结构是邪恶的。

什么是<代码>属性对象< /代码>?它是一个保存对象的某些特性的代码<代码> Objor < /代码>不在数组中,那么如果修改<代码> Objuts<代码>,为什么数组会改变?“那么我只调用modifyObject函数”Where?结构是值类型。若要使其成为引用类型,请将其更改为classStructs,因为它不是固有不变的。它们的复制语义使得可变结构难以使用。因此,建议它们是不可变的,但很可能有可变的结构。@mikez:同意。更新了第一句。你:事实上,你正在创建一个属性/字段设置的新实例。否。新实例是在将结构分配给另一个变量(或将其作为值参数传递给方法,或将其装箱)时创建的。在您的示例中,行
x2=X创建一个新实例。设置属性
Y
的值不会创建结构的新实例@杰佩斯蒂格尼尔森:你是对的。谢谢你指出这一点。更新了我的帖子。