gpt4 book ai didi

c# - 在 C# 中,_where_ 克隆对象有哪些经验法则?

转载 作者:太空宇宙 更新时间:2023-11-03 23:34:50 24 4
gpt4 key购买 nike

情况是这样的:我正在尝试确定克隆对象的位置部分以避免修改原始对象。

我有两个选择:

  • 克隆调用者中的对象并将克隆的对象传递给方法(“被调用者”),从而防止被调用者进行潜在的修改。
  • 克隆被调用者中的对象,因为被调用者修改了传递给它的对象,这就假设调用者从不想修改参数对象。

我发现这个 6 岁的答案有多种观点。不幸的是,似乎并没有达成真正的共识。

Passing copy of object to method -- who does the copying?

这是我的代码形式的问题:

  • 我是否在调用者 中克隆对象并将克隆的对象传递给方法?
public static void Main()
{
var foo = new Foo();
Bar.Baz(foo.DeepClone());
}

public static class Bar
{
public static void Baz(Foo foo)
{
/* ... modifies members in foo ... */
}
}

public class Foo { /* ... */ }
  • 我是否克隆了被调用者中的对象?
public static void Main()
{
var foo = new Foo();
Bar.Baz(foo);
}

public static class Bar
{
public static void Baz(Foo foo)
{
foo = foo.DeepClone();
/* ... modifies members in foo ... */
}
}

public class Foo { /* ... */ }

所以,我的问题是:

  • 在何处跨语言克隆对象有哪些好的经验法则,尤其是在 C# 和 .NET 领域?

  • 无论答案如何,有哪些好的方法可以记录修改参数的方法或克隆对象的方法的行为?

最佳答案

方法的目的是改变对象吗?然后不要在方法内部克隆。您希望副作用发生。通常,方法名称会清楚地指出预期会发生变化的事实(例如 UpdateCustomer)。

如果方法的明确目的不是改变其输入,那么突变是一个实现细节,并且该方法必须确保突变不会泄露出去。它可以通过克隆来做到这一点。

方法不应将其输入仅用作暂存空间。 Win32 API 中的某些 API 会做一些非常令人困惑的事情。

关于c# - 在 C# 中,_where_ 克隆对象有哪些经验法则?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30903561/

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