仅当对象不为 null 时,如何将属性值分配给 var

问题描述 投票:0回答:8

在我的代码中,是否有一种简写方式,仅当对象不为空时,我可以使用它来为变量分配对象属性的值?

string username = SomeUserObject.Username;     // fails if null

我知道我可以进行类似 if(SomeUserObject != null) 的检查,但我想我看到了此类测试的简写。

我尝试过:

string username = SomeUserObject ?? "" : SomeUserObject.Username;

但这行不通。

c# null
8个回答
7
投票

在 c# 6.0 中你现在可以这样做

string username = SomeUserObject?.Username;

如果 SomeUSerObject 为 null,则用户名将设置为 null。 如果你想让它得到值“”,你可以这样做

string username = SomeUserObject?.Username ?? "";

4
投票

第二个的语法有点不对。

string name = SomeUserObject != null ? SomeUserObject.Username : string.Empty;

2
投票

我想,你能得到的最接近的是:

string username = SomeUserObject == null ? null : SomeUserObject.Username;

1
投票

这可能是您所能得到的最接近的结果:

string username = (SomeUserObject != null) ? SomeUserObject.Username : null;

1
投票

你可以使用? :正如其他人所建议的,但您可能需要考虑 Null 对象模式,在该模式中创建一个特殊的静态 User

User.NotloggedIn
并在各处使用它而不是 null 。

然后就变得很容易一直做

.Username

其他好处:对于未分配变量和(未登录)用户不允许执行某些操作的情况(null),您可以获得/可以生成不同的异常。

您的 NotloggedIn 用户可以是 User 的派生类,例如 NotLoggedIn,它会重写方法并在未登录时无法执行的操作(例如付款、发送电子邮件等)上引发异常。

作为 User 的派生类,您可以获得一些相当不错的语法糖,因为您可以执行诸如

if (someuser is NotLoggedIn) ...

 之类的操作
    


0
投票
您正在考虑三元运算符。

string username = SomeUserObject == null ? "" : SomeUserObject.Username;

请参阅

http://msdn.microsoft.com/en-us/library/ty67wk28.aspx 了解更多详细信息。


0
投票
public static void NullGuard<T>(Expression<Func<T>> expression, T? value) { if (expression.Body is not MemberExpression memberExpression) throw new ArgumentException("Expression must be a member access expression."); var member = memberExpression.Member; if (member is not PropertyInfo property) throw new ArgumentException("Member must be a property."); if (value == null) { return; } var constant = Expression.Constant(value); var assignment = Expression.Assign(memberExpression, constant); var lambda = Expression.Lambda<Action>(assignment); lambda.Compile().Invoke(); }
用途:

NullGuard(() => obj.SomeProperty, maybeNullValue);
    

-1
投票
这称为空合并,执行方式如下:

string username = SomeUserObject.Username ?? ""
    
© www.soinside.com 2019 - 2024. All rights reserved.