繁体   English   中英

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

[英]Should I use the ref or out keyword here?

我有一个可能为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'关键字吗?

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

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

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

user = user ?? new User();

SetUserProperties(user);

UpdateUser(user);

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

  • 您希望在某些情况下更新调用者的变量以引用新对象,因此您需要通过引用语义进行传递 这意味着你需要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;
}

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

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

out =您需要该方法“将其重定向到内存中的另一个位置”

是的,你应该使用ref out关键字用于未初始化的变量,这不是这里的情况。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM