从方法更改对象属性(最佳实践)

时间:2014-01-31 09:08:23

标签: c# methods parameter-passing

我有一个问题要问你。在方法中更改对象属性的最佳做法是什么。我们假设我有一个这样的方法:

    public void ChangeThis(MyObj myobj)
    {
        myobj.Prop = 5;
    }

返回那个对象是不是更好,就像我们想表明我们改变一些东西一样?

    public MyObj ChangeThis(MyObj myobj)
    {
        myobj.Prop = 5;
        return myobj;
    }

从方法更改对象属性的最佳做法是什么?

3 个答案:

答案 0 :(得分:3)

第二种方法很糟糕,因为对象的新实例是使用changed属性创建还是返回当前实例是不明确的。

如果我的对象是不可变的,我只会使用第二种方法。

方法的名称ChangeThis表示该对象是可变的,但是通过返回一个对象,它表明它们不是。

答案 1 :(得分:1)

如果您想明确表示对象的内部状态已更改,请通过为方法选择正确的名称并添加适当的XML文档来实现。

我认为这不足以让对象返回客户端,老实说,这让人感到困惑。你回来了一个新对象吗?或者它是作为参数传递的相同对象?但是,如果类型是不可变的,那么应该返回它。

答案 2 :(得分:1)

这取决于。

虽然第一种情况更常出现,但第二种情况是有用的,当你想在链中组合方法调用时:

myObject
  .ChangeThis()
  .ChangeThat()
  .ChangeSomethingElse();

我认为,StringBuilder是一个非常好的例子:

sb
  .AppendLine("1")
  .AppendChar('2')
  .AppendLine()
  .ToSting();

相同的API具有来自实体框架的模型配置classes

Property(_ => _.Name)
    .HasColumnName("name")
    .HasMaxLength(64)
    .IsRequired();

因此,有时这是非常方便的方法来调用方法 想象一下,上面的代码在第一种情况下会如何看待:

  sb.AppendLine("1");
  sb.AppendChar('2');
  sb.AppendLine();
  sb.ToSting();

可悲的是,不是吗?