繁体   English   中英

如何通过更改变量静态设置属性

[英]How to set a property statically with changing variable

这可能是一个简单的问题,一般而言,我对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;

我希望即使更改x [2]的值,C1属性的2索引也保持为3的值。 同样,我希望C2属性索引2的值始终为7。是否可以通过某种方式将属性设置为类似ValueOf(x)的值? 我需要某种静态关键字吗?

这行:

C1.MyProperty = x;

表示MyProperty指向与x相同的引用,因此x元素的任何更改也对您的属性可见。 该代码当前正在执行浅表复制。

一个简单的修复方法可能是:

C1.MyProperty = x.ToArray();

ToArray将创建一个新数组/一个新引用,并将其分配给MyProperty

您应该寻找深层复制对象

您可能想要克隆(浅拷贝)阵列。

C1.MyProperty = (int[]) x.Clone();

您将获得一个具有原始值或引用的新数组,但是任何新的插槽分配都将在新数组中。

x.ToArray()

在语义上是等效的,由于它是类型化的并且不需要强制转换,因此可能是首选。

试试下面的代码。 现在,您将相同的数组分配给两个字段。 如果要使用单独的数组,则每次都需要创建一个新数组。

请注意,变量x保存的是数组的地址,而不是数组本身。 每次将New数组分配给x时 ,都会在内存中的某个位置创建一个数组并将其地址放入x中

我强烈建议您阅读有关指针的内容 ,这就是它的全部内容。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM