如何通过更改变量静态设置 属性
How to set a property statically with changing variable
这可能是一个简单的问题,总的来说我对 OOP 还很陌生。
如果我有一个简单的 class 和一个 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) 的值?我需要某种静态关键字吗?
这一行:
C1.MyProperty = x;
意味着 MyProperty
指向与 x
相同的引用,因此 x
元素的任何更改对您的 属性 也是可见的。该代码当前正在进行浅复制。
一个简单的修复可能是:
C1.MyProperty = x.ToArray();
ToArray
将创建一个新的 array/a 新引用并将其分配给 MyProperty
。
你应该寻找 deep copying objects。
您可能想要克隆(浅拷贝)数组。
C1.MyProperty = (int[]) x.Clone();
您将获得一个包含原始值或引用的新数组,但任何新的槽分配都将在新数组中。
x.ToArray()
在语义上是等价的,并且可能是首选,因为它是类型化的并且不需要转换。
试试下面的代码。现在,您将同一个数组分配给两个字段。如果您想要单独的数组,则每次都需要创建一个新数组。
请注意您的变量 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};
}
}
这可能是一个简单的问题,总的来说我对 OOP 还很陌生。
如果我有一个简单的 class 和一个 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) 的值?我需要某种静态关键字吗?
这一行:
C1.MyProperty = x;
意味着 MyProperty
指向与 x
相同的引用,因此 x
元素的任何更改对您的 属性 也是可见的。该代码当前正在进行浅复制。
一个简单的修复可能是:
C1.MyProperty = x.ToArray();
ToArray
将创建一个新的 array/a 新引用并将其分配给 MyProperty
。
你应该寻找 deep copying objects。
您可能想要克隆(浅拷贝)数组。
C1.MyProperty = (int[]) x.Clone();
您将获得一个包含原始值或引用的新数组,但任何新的槽分配都将在新数组中。
x.ToArray()
在语义上是等价的,并且可能是首选,因为它是类型化的并且不需要转换。
试试下面的代码。现在,您将同一个数组分配给两个字段。如果您想要单独的数组,则每次都需要创建一个新数组。
请注意您的变量 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};
}
}