Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/324.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#_.net_Properties_Setter - Fatal编程技术网

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

C# 如何通过更改变量静态设置属性,c#,.net,properties,setter,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};

这可能是一个简单的问题,我对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。是否有某种方法可以将属性设置为类似ValueOfx的值?我需要某种类型的静态关键字吗?

此行:

C1.MyProperty = x;
意味着MyProperty指向与x相同的引用,因此x元素中的任何更改对您的属性也是可见的。代码当前正在进行浅层复制

一个简单的解决方案可以是:

C1.MyProperty = x.ToArray();
ToArray将创建一个新数组/一个新引用,并将其分配给MyProperty

你应该去找找

这一行:

C1.MyProperty = x;
意味着MyProperty指向与x相同的引用,因此x元素中的任何更改对您的属性也是可见的。代码当前正在进行浅层复制

一个简单的解决方案可以是:

C1.MyProperty = x.ToArray();
ToArray将创建一个新数组/一个新引用,并将其分配给MyProperty


你应该去找找

您可能需要克隆或复制阵列

C1.MyProperty = (int[]) x.Clone();
您将获得一个具有原始值或引用的新数组,但任何新的插槽分配都将位于新数组中

x.ToArray()

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

您可能希望克隆或复制数组

C1.MyProperty = (int[]) x.Clone();
您将获得一个具有原始值或引用的新数组,但任何新的插槽分配都将位于新数组中

x.ToArray()

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

请尝试下面的代码。现在,将非常相同的数组分配给这两个字段。如果需要单独的阵列,则每次都需要创建一个新阵列

请注意,变量x包含数组的地址,而不是数组本身。每次将一个新数组分配给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};
  }
}

请尝试下面的代码。现在,将非常相同的数组分配给这两个字段。如果需要单独的阵列,则每次都需要创建一个新阵列

请注意,变量x包含数组的地址,而不是数组本身。每次将一个新数组分配给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};
  }
}

虽然知道指针是件好事,但它不能解释c字符串s1=a中的所有内容;字符串s2=s1;s1=b;Console.WriteLines1++s2;你把我弄糊涂了,所以我测试了你的案子。我不知道这是否是因为我习惯了.NET,但我可以很容易地用我用来写这个答案的相同逻辑来预测B A输出;字符串s2=s1;s1=b;Console.WriteLines1++s2;你把我弄糊涂了,所以我测试了你的案子。我不知道这是否是因为我习惯了.NET,但我可以很容易地用我用来写这个答案的相同逻辑预测B A输出。