gpt4 book ai didi

c# - 何时复制 C# 值/对象,何时复制其引用?

转载 作者:IT王子 更新时间:2023-10-29 03:44:32 26 4
gpt4 key购买 nike

我一遍又一遍地遇到同样的问题,我想引用的对象被复制了,或者我想复制的对象被引用了。当我使用 = 运算符时会发生这种情况。

例如,如果我将对象发送到另一个表单,即:

SomeForm myForm = new SomeForm();
SomeObject myObject = new SomeObject();
myForm.formObject = myObject;

...然后修改窗体中的对象,原来的对象没有被修改。就好像对象被复制了,没有被引用。然而,当我这样做时:

SomeObject myObject = new SomeObject();
SomeObject anotherObject = new SomeObject();
anotherObject = myObject;

...然后修改anotherObjectmyObject也被修改。

最严重的情况是当我尝试克隆我定义的对象之一时:

public class SomeObject
{
double value1, value2;

//default constructor here

public SomeObject(val1, val2)
{
value1 = val1;
value2 = val2;
}

public void Clone(SomeObject thingToCopy)
{
this.value1 = thingToCopy.value1;
this.value2 = thingToCopy.value2;
}
}

当我这样做时...

SomeObject obj1 = new SomeObject(1, 2);
SomeObject obj2 = new SomeObject();
obj2.Clone(obj1);

...obj1 被引用,对 obj2 的任何修改都会更改 obj1

int、double、string 等系统对象似乎总是被复制,除了上面的克隆方法。

我的问题是,不考虑在函数中使用 ref 关键字,什么时候复制对象,什么时候引用对象(即传递时)函数,设置为其他对象时(如上面的前两个示例),复制成员变量时(如第三个示例等)?

最佳答案

如果不花大量时间仔细挑选用词,就很难准确回答这类问题。

我已经在几篇您可能会发现有用的文章中这样做了:

当然,这并不是说这些文章是完美的 - 远非如此 - 但我已尽力做到尽可能清楚。

我认为一件重要的事情是在你的头脑中将这两个概念(参数传递和引用与值类型)分开。

看你的具体例子:

SomeForm myForm = new SomeForm();
SomeObject myObject = new SomeObject();
myForm.formObject = myObject;

这意味着 myForm.formObjectmyObject 指的是 SomeObject 的同一个实例 - 就像两个人有不同的纸一样,每一张都写着相同的地址。如果您转到一张纸上的地址并将房子涂成红色,然后转到第二张纸上的地址,您会看到一座红色的房子。

不清楚您所说的“然后修改表单中的对象”是什么意思,因为您提供的类型是不可变的。无法修改对象本身。您可以更改 myForm.formObject 以引用 SomeObject 的不同实例,但这就像在一张纸上潦草地写下地址,然后在上面写下一个不同的地址。这不会改变另一张纸上写的内容。

如果您可以提供一个简短但完整 的程序,您不理解其行为(最好是控制台应用程序,只是为了让事情更短更简单),那么具体地讨论事情会更容易条款。

关于c# - 何时复制 C# 值/对象,何时复制其引用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4347902/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com