以下是这种情况:我正在尝试确定克隆对象的 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中?
无论答案是什么,有哪些好方法可以记录修改参数的方法或克隆对象的方法的行为?
答案 0 :(得分:2)
方法的目的是改变对象吗?然后不要克隆方法内部。你想要副作用发生。通常,方法名称会清楚地表明预期会发生突变(例如UpdateCustomer
)。
如果方法的明确目的不是改变其输入,则突变是一个实现细节,并且该方法必须确保突变不会泄漏。它可以通过克隆来实现。
方法不应将其输入仅用作临时空间。 Win32 API中的一些做了非常令人困惑的事情。
答案 1 :(得分:1)
强制执行(和记录)constness的最佳方法是定义只读接口并将参数定义为该接口。接受该接口的任何东西都是常量,任何接受完整对象的东西都可能改变该对象。
如果你遵循这种方法,调用者应该克隆,如果它不想要副作用,因为我们已经允许被调用者通过传递一个可修改的对象来修改对象。