在C#中,_where_克隆对象的一些经验法则是什么?

时间:2015-06-17 22:30:38

标签: c# clone single-responsibility-principle responsibility

以下是这种情况:我正在尝试确定克隆对象的 where 部分,以避免修改原始对象。

我有两个选择:

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

我发现这个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-land中?

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

2 个答案:

答案 0 :(得分:2)

方法的目的是改变对象吗?然后不要克隆方法内部。你想要副作用发生。通常,方法名称会清楚地表明预期会发生突变(例如UpdateCustomer)。

如果方法的明确目的不是改变其输入,则突变是一个实现细节,并且该方法必须确保突变不会泄漏。它可以通过克隆来实现。

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

答案 1 :(得分:1)

强制执行(和记录)constness的最佳方法是定义只读接口并将参数定义为该接口。接受该接口的任何东西都是常量,任何接受完整对象的东西都可能改变该对象。

如果你遵循这种方法,调用者应该克隆,如果它不想要副作用,因为我们已经允许被调用者通过传递一个可修改的对象来修改对象。