在 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# 和 .净土地?
无论答案如何,有哪些好方法可以记录修改参数的方法或克隆对象的方法的行为?
该方法的目的是改变对象吗?然后不要在方法内部克隆。您希望副作用发生。通常,方法名称会清楚地指出预期发生突变的事实(例如 UpdateCustomer
)。
如果该方法的明确目的不是改变其输入,那么突变就是一个实现细节,方法必须确保突变不会泄漏出来。它可以通过克隆来做到这一点。
方法不应仅将其输入用作暂存空间。Win32 API 中的一些操作非常令人困惑。
强制(和记录)恒定性的最佳方法是定义只读接口并将参数定义为该接口。 接受接口的任何内容都是常量,任何接受完整对象的内容都可能使对象发生变化。
如果您遵循此方法,则调用方如果不希望副作用,则应克隆,因为我们已经允许被调用方通过向其传递可修改的对象来修改对象。