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

时间:2010-03-31 18:39:32

标签: 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";
     ....

}

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

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

5 个答案:

答案 0 :(得分:5)

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

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

这是否符合您的需求?它没有使用它,并且它在做什么,IMO更清楚。

user = user ?? new User();

SetUserProperties(user);

UpdateUser(user);

答案 1 :(得分: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;
}

答案 2 :(得分:0)

您将使用ref,因为您有 potential 将变量指向内存中的新对象。如果您用完了,则必需来更改用户。

答案 3 :(得分:0)

ref =您希望函数具有对象的句柄,可能“将其重定向到内存中的另一个位置”(即将其设置为不同的实例)对象类型)

out =您要求方法“将其重定向到内存中的其他位置”

答案 4 :(得分:-1)

是的,您应该使用refout关键字用于未初始化的变量,但这不是这种情况。