gpt4 book ai didi

c# - C#中引用类型的赋值

转载 作者:太空狗 更新时间:2023-10-29 17:39:52 24 4
gpt4 key购买 nike

为引用类型实现按值赋值的正确方法是什么?我想执行任务,但不更改引用。

这就是我要说的:

void Main()
{
A a1 = new A(1);
A a2 = new A(2);
a1 = a2; //WRONG: Changes reference
a1.ValueAssign(a2); //This works, but is it the best way?
}

class A
{
int i;

public A(int i)
{
this.i = i;
}

public void ValueAssign(A a)
{
this.i = a.i;
}
}

我应该为此使用某种约定吗?我觉得我不是第一个遇到这种情况的人。谢谢。

编辑:

哇。我想我需要根据我面临的实际问题来调整我的问题。我得到了很多不符合不更改引用要求的答案。克隆不是这里的问题。问题在于分配克隆。

我有很多类依赖于 A - 它们都共享对类 A 的同一个对象的引用。因此,每当一个类更改 A 时,它会反射(reflect)在其他类中,对吗?一切都很好,直到其中一个类尝试这样做:

myA = new A();

实际上我并没有执行 new A() 但实际上我正在从硬盘驱动器中检索 A 的序列化版本。但无论如何,这样做会导致 myA 收到新的引用。它不再与其他依赖于 A 的类共享同一个 A。这就是我要解决的问题。我希望所有具有 A 实例的类都受到上述代码行的影响。

我希望这能澄清我的问题。谢谢。

最佳答案

听起来你在谈论克隆。有些对象会支持这个(通过 ICloneable )但大多数不会。在许多情况下,无论如何它都没有意义 - 复制 FileStream 对象是什么意思? ICloneable 通常被认为是一个不好用的接口(interface),部分原因是它没有指定克隆的深度。

最好尝试改变您的思维方式,这样就没有必要了。我的猜测是您是一名 C++ 程序员,并且完全不希望做出任何判断:不要试图将 C# 当作 C++ 来编写。您最终会得到不合常理的 C#,它可能无法很好地工作,可能效率低下,而且 C# 开发人员可能不直观地理解它。

一个选择是尽可能使类型不可变 - 在这一点上,是否存在副本并不重要,因为无论如何您都无法更改对象。这就是 String 所采用的方法,并且效果很好。遗憾的是框架中还没有不可变的集合(目前)。

在您的情况下,您将使用 WithValue 而不是 ValueAssign 方法,它会返回一个 new 实例,其中仅更改了值. (无可否认,这是您的情况下唯一可用的值...)我意识到这种复制(除即将更改的属性外的所有复制)与我所说的在 C# 中复制有点不合常理的说法背道而驰,但它在类而不是外部机构来决定何时复制。

我怀疑我没有很好地解释这一点,但我的一般建议是围绕它进行设计,而不是尝试在所有地方显式复制。

关于c# - C#中引用类型的赋值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1065709/

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