C# 我应该在这里使用ref或out关键字吗?
我有一个可能为null的对象,我将把它传递给一个设置其属性的方法 所以我的代码看起来像: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();
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
的值只是一个参考。看见