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

本文关键字:对象 经验法则 where | 更新日期: 2023-09-27 17:56:54

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

我有两个选择:

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

我找到了这个6岁的答案,有各种各样的意见。不幸的是,似乎没有真正的共识。

将对象的副本传递给方法 -- 谁进行复制?

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

  • 我是否克隆调用方中的对象并将克隆的对象传递给方法?
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# 和 .净土地?

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

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

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

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

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

强制(和记录)恒定性的最佳方法是定义只读接口并将参数定义为该接口。 接受接口的任何内容都是常量,任何接受完整对象的内容都可能使对象发生变化。

如果您遵循此方法,则调用方如果不希望副作用,则应克隆,因为我们已经允许被调用方通过向其传递可修改的对象来修改对象。