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

C# 我应该在这里使用ref或out关键字吗?,c#,pass-by-reference,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();

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

这适合你的需要吗?在我看来,这两种方法都没有用,而且它所做的事情更加清晰了一点

user = user ?? new User();

SetUserProperties(user);

UpdateUser(user);

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

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

注意对象和变量之间的差异非常重要:

  • 在某些情况下,需要更新调用方的变量以引用新对象,因此需要传递引用语义。这意味着您需要
    ref
    out
  • 您需要读取变量的现有值以了解是否创建新对象。这意味着您需要
    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
=您希望函数具有对象的句柄,并可能“将其重定向到内存中的另一个位置”(即,将其设置为该对象类型的不同实例化)


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

我的方法实际上已经返回布尔值,这就是问题所在。@Blankman:这就是为什么最好在问题中给我们尽可能真实的图片;)是的,但是用户的属性(在SetUserProperties中更新)将超出UpdateUser(用户)的范围,对吗?@Blankman:否-因为它们将位于同一对象上。
user
的值只是一个参考。看见