C# 从方法更改对象属性(最佳实践)
我有个问题要问你。在方法中更改对象属性的最佳实践是什么。假设我有这样一个方法:C# 从方法更改对象属性(最佳实践),c#,methods,parameter-passing,C#,Methods,Parameter Passing,我有个问题要问你。在方法中更改对象属性的最佳实践是什么。假设我有这样一个方法: public void ChangeThis(MyObj myobj) { myobj.Prop = 5; } 返回那个对象不是更好吗,就像我们想要显示我们改变了什么一样 public MyObj ChangeThis(MyObj myobj) { myobj.Prop = 5; return myobj; } 从方法
public void ChangeThis(MyObj myobj)
{
myobj.Prop = 5;
}
返回那个对象不是更好吗,就像我们想要显示我们改变了什么一样
public MyObj ChangeThis(MyObj myobj)
{
myobj.Prop = 5;
return myobj;
}
从方法更改对象属性的最佳做法是什么?第二种方法不好,因为它不确定是使用更改的属性创建对象的新实例,还是返回当前实例 如果我的对象是不可变的,我只会使用第二种方法
方法的名称,
ChangeThis
,意味着对象是可变的,但通过返回一个对象,它表明对象不是可变的。第二个方法是不好的,因为它不清楚是否使用已更改的属性创建了对象的新实例,或者是否返回了当前实例
如果我的对象是不可变的,我只会使用第二种方法
方法的名称,
ChangeThis
,意味着对象是可变的,但通过返回一个对象,它表明对象不是可变的。如果您想明确表示对象的内部状态已更改,请为方法选择适当的名称,并添加适当的XML文档
我认为这不是将对象返回给客户机的充分理由,老实说,这很令人困惑。您是否返回一个新对象?或者是作为参数传递的同一个对象?但是,如果该类型是不可变的,则应返回该类型。如果要明确显示对象的内部状态已更改,请为该方法选择适当的名称,并添加适当的XML文档 我认为这不是将对象返回给客户机的充分理由,老实说,这很令人困惑。您是否返回一个新对象?或者是作为参数传递的同一个对象?但是,如果类型是不可变的,则应返回它。这取决于具体情况 当您希望在链中组合方法调用时,第一种情况更常见,第二种情况很有用:
myObject
.ChangeThis()
.ChangeThat()
.ChangeSomethingElse();
我认为,这是一个很好的例子:
sb
.AppendLine("1")
.AppendChar('2')
.AppendLine()
.ToSting();
同一API具有实体框架中的模型配置:
Property(_ => _.Name)
.HasColumnName("name")
.HasMaxLength(64)
.IsRequired();
因此,有时这是调用方法的非常方便的方法。想象一下,在第一种情况下,上面的代码会是什么样子:
sb.AppendLine("1");
sb.AppendChar('2');
sb.AppendLine();
sb.ToSting();
可悲的是,不是吗?这要看情况而定
当您希望在链中组合方法调用时,第一种情况更常见,第二种情况很有用:
myObject
.ChangeThis()
.ChangeThat()
.ChangeSomethingElse();
我认为,这是一个很好的例子:
sb
.AppendLine("1")
.AppendChar('2')
.AppendLine()
.ToSting();
同一API具有实体框架中的模型配置:
Property(_ => _.Name)
.HasColumnName("name")
.HasMaxLength(64)
.IsRequired();
因此,有时这是调用方法的非常方便的方法。想象一下,在第一种情况下,上面的代码会是什么样子:
sb.AppendLine("1");
sb.AppendChar('2');
sb.AppendLine();
sb.ToSting();
很遗憾,不是吗?我不同意。在这种情况下,不变性不是一个标准。如果mutable
StringBuilder
没有这样的API,那就太糟糕了。@Dennis-我不知道StringBuilder
有这个接口。我现在真的被吓坏了,觉得自己很脏。这确实意味着StringBuilder
需要非常仔细地封装。但我想我更改了一些内容并返回了我刚刚修改的对象。不同意。在这种情况下,不变性不是一个标准。如果mutableStringBuilder
没有这样的API,那就太糟糕了。@Dennis-我不知道StringBuilder
有这个接口。我现在真的被吓坏了,觉得自己很脏。这确实意味着StringBuilder
需要非常仔细地封装。但我想我更改了一些内容并返回了我刚刚修改的对象。使用StringBuilder
的第一种方法对我来说更合适。现在我知道这取决于我的需要。没有“更好”的方法来做这些事情。使用StringBuilder
的第一种方法更适合我。现在我知道这取决于我的需要。没有“更好”的方法来做这些事情。