我应该在这里使用ref或out关键字吗?

Bla*_*man 4 c# pass-by-reference

我有一个可能为null的对象,我将传递给将设置其属性的方法.

所以我的代码看起来像:

User user = null;  // may or may not be null at this point.

SetUserProperties(user);

UpdateUser(user);


public void SetUserProperties(User user)
{
      if(user == null) 
          user = new User();

     user.Firstname = "blah";
     ....

}
Run Code Online (Sandbox Code Playgroud)

所以我正在更新传递给SetUserProperties的同一个对象.

我应该在我的方法SetUserProperties中使用'ref'关键字吗?

Joh*_*zen 5

我认为'ref'符合你在这里想要做的更好的语义.

但是,如果可能的话,我会尽量避免使用'out'和'ref'关键字.

这适合您的需求吗?它没有使用它,并且它在做什么,IMO更清楚一点.

user = user ?? new User();

SetUserProperties(user);

UpdateUser(user);
Run Code Online (Sandbox Code Playgroud)


Jon*_*eet 5

了解对象变量之间的区别非常重要:

  • 您希望在某些情况下更新调用者的变量以引用新对象,因此您需要通过引用语义进行传递.这意味着你需要refout
  • 您需要读取变量的现有值以了解是否创建新对象.这意味着你需要ref而不是out.如果将其更改为out参数,则if语句将无法编译,因为user在方法的开头不会明确赋值.

我个人不确定这是一个不错的设计.你确定创建新对象的方法有意义吗?你不能在通话现场这样做吗?感觉有点尴尬.

使用ref(但仍可能在方法中创建新用户)的另一种替代方法是返回适当的引用:

user = SetUserProperties(user);

...

public User SetUserProperties(User user)
{
    if(user == null) 
    {
        user = new User();
    }
    user.Firstname = "blah";
    ....
    return user;
}
Run Code Online (Sandbox Code Playgroud)