您是否更愿意返回修改后的对象?

Sch*_*ime 5 c# class

Class c = new Class( { Prop = "Initial" } );
Run Code Online (Sandbox Code Playgroud)

我上面的课.你会如何创建一个方法来修改它?

public Class ModifyIt(Class c)
{
    c.Prop = "changed";
    return c;
}
Run Code Online (Sandbox Code Playgroud)

要么

public void ModifyIt(Class c)
{
    c.Prop = "changed";
}
Run Code Online (Sandbox Code Playgroud)

然后像这样打电话......

Class c = ModifyIt(c);
Console.WriteLine(c.Prop);
// changed
Run Code Online (Sandbox Code Playgroud)

或这个

ModifyIt(c)
Console.WriteLine(c.Prop);
// changed
Run Code Online (Sandbox Code Playgroud)

你的偏好是什么?

Ale*_*lli 6

就个人而言,我更喜欢命令查询分离 - 即,返回结果的方法不应该是mutator,反之亦然.我理解return this人群的争论,即"链接"电话的简易性:

foo.ChangeThis(23).ChangeThat(45).AndAlso(67);
Run Code Online (Sandbox Code Playgroud)

但是将这些案例编码为绝对不是太糟糕

var x=foo;
x.ChangeThis(23); x.ChangeThat(45); x.AndAlso(67);
Run Code Online (Sandbox Code Playgroud)

同时,"命令查询分离"的优势(在绝大多数情况下,虽然不可否认,不是100%),正如wikipeida网址所讨论的那样,忍受......


BFr*_*ree 2

第一种方式(在更改项目后实际上返回该项目)的最酷之处在于它允许方法链接。这意味着你可以做这样的事情:

c.ModifyIt("hello").MessWithIt("World").ReallyScrewWithIt("!!!");
Run Code Online (Sandbox Code Playgroud)

如果它对您的特定类有意义,您可以预见需要链接,则返回该实例。如果没有,那么你可以让它无效。StringBuilder 类就是一个很好的例子,它允许您执行以下操作:

myStringBuilder.Replace("!", "?").Append("Something").Remove(4,3);
Run Code Online (Sandbox Code Playgroud)