这可能是一个简单的问题,我对OOP一般都很陌生。
如果我有一个带有一个int数组属性(和构造函数)的简单类
public class MyClass
{
public int[] MyProperty {get; set;}
public MyClass(){}
}
如果对象没有更改属性,如何将属性值设置为对象的值?
MyClass C1 = new MyClass();
MYClass C2 = new MyClass();
int[] x = new int[3] {1,2,3};
C1.MyProperty = x;
x[2] = 7; //this changes C1.MyProperty to a value of {1,2,7}
C2.MyProperty = x;
我希望C1的属性的2索引保持值3,即使我改变x [2]的值。类似地,我希望C2属性索引2值始终为7.是否有某种方式我可以将属性设置为ValueOf(x)?我需要某种静态关键字吗?
答案 0 :(得分:5)
这一行:
C1.MyProperty = x;
表示MyProperty
指向与x
相同的引用,因此x
元素的任何更改都会对您的媒体资料可见。该代码目前正在进行浅层复制。
一个简单的解决方法可能是:
C1.MyProperty = x.ToArray();
ToArray
将创建一个新数组/一个新引用,并将其分配给MyProperty
。
你应该寻找deep copying objects。
答案 1 :(得分:1)
您可能希望克隆(浅层复制)数组。
C1.MyProperty = (int[]) x.Clone();
您将获得一个包含原始值或引用的新数组,但任何新的插槽分配都将位于新数组中。
x.ToArray()
在语义上是等价的,可能是首选的,因为它是打字的,并且不需要演员。
答案 2 :(得分:0)
尝试以下代码。现在,您为两个字段分配了相同的数组。如果您需要单独的数组,则每次都需要创建一个新数组。
请注意您的变量 x 包含数组的地址,而不是数组本身。每次将 New 数组分配到 x 时,都会在内存中的某个位置创建一个数组,并将其地址放在 x 中。
我强烈建议您阅读pointers,这就是它的全部内容。
MyClass C1 = new MyClass();
MYClass C2 = new MyClass();
int[] x = new int[3] {1,2,3};
C1.MyProperty = x;
x[2] = 7;
x = new int[3] {1,2,3};
C2.MyProperty = x;
//You know have two arrays, {1,2,7} and {1,2,3}, which are accessible through C1 and C2
编辑:如果您很难理解上述内容,请查看下面的构造函数。我认为在这里获得两个不同的阵列要容易得多。
如果您确实知道这里有两个不同的数组,那么您应该能够找到两个不同的数组,其中包含代码。
public class MyClass
{
public int[] MyProperty {get; set;}
public MyClass(){
MyProperty = new int[3] {1,2,3};
}
}