如何使用更改变量静态设置属性

时间:2015-03-05 19:55:58

标签: c# .net properties setter

这可能是一个简单的问题,我对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)?我需要某种静态关键字吗?

3 个答案:

答案 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};
  }
}