【问题标题】:Changing object properties from method (Best Practise)从方法更改对象属性(最佳实践)
【发布时间】:2014-01-31 09:08:23
【问题描述】:

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

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

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

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

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

【问题讨论】:

    标签: c# methods parameter-passing


    【解决方案1】:

    第二种方法不好,因为它对于是否使用更改的属性创建对象的新实例或是否返回当前实例不明确。

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

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

    【讨论】:

    • 不同意。在这种情况下,不变性不是标准。如果 mutable StringBuilder 没有这样的 API,那就太糟糕了。
    • @Dennis - 我不知道StringBuilder 有这个接口。我现在真的很害怕,我现在觉得很脏。这确实意味着StringBuilder需要非常小心地封装。
    • 但我想我改变了一些东西并返回了我刚刚修改的对象。
    【解决方案2】:

    这取决于。

    虽然第一种情况出现的频率更高,但第二种情况很有用,当您想在链中组合方法调用时:

    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();
    

    很遗憾,不是吗?

    【讨论】:

    • StringBuilder 的第一种方法对我来说更好。现在我知道这取决于我的需要。并且没有“更好”的方式来做这些事情。
    【解决方案3】:

    如果您想让对象的内部状态明显改变,请为方法选择适当的名称,并添加适当的 XML 文档。

    我认为这不是将对象返回给客户端的充分理由,老实说,这令人困惑。您要返回一个新对象吗?还是作为参数传递的同一个对象?但是,如果类型是不可变的,那么您应该返回它。

    【讨论】:

      猜你喜欢
      • 2011-12-27
      • 1970-01-01
      • 2013-02-06
      • 2012-09-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多