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
需要非常仔细地封装。但我想我更改了一些内容并返回了我刚刚修改的对象。不同意。在这种情况下,不变性不是一个标准。如果mutable
StringBuilder
没有这样的API,那就太糟糕了。@Dennis-我不知道
StringBuilder
有这个接口。我现在真的被吓坏了,觉得自己很脏。这确实意味着
StringBuilder
需要非常仔细地封装。但我想我更改了一些内容并返回了我刚刚修改的对象。使用
StringBuilder
的第一种方法对我来说更合适。现在我知道这取决于我的需要。没有“更好”的方法来做这些事情。使用
StringBuilder
的第一种方法更适合我。现在我知道这取决于我的需要。没有“更好”的方法来做这些事情。