在我的代码中,是否有一种简写方式,仅当对象不为空时,我可以使用它来为变量分配对象属性的值?
string username = SomeUserObject.Username; // fails if null
我知道我可以进行类似 if(SomeUserObject != null) 的检查,但我想我看到了此类测试的简写。
我尝试过:
string username = SomeUserObject ?? "" : SomeUserObject.Username;
但这行不通。
在 c# 6.0 中你现在可以这样做
string username = SomeUserObject?.Username;
如果 SomeUSerObject 为 null,则用户名将设置为 null。 如果你想让它得到值“”,你可以这样做
string username = SomeUserObject?.Username ?? "";
第二个的语法有点不对。
string name = SomeUserObject != null ? SomeUserObject.Username : string.Empty;
我想,你能得到的最接近的是:
string username = SomeUserObject == null ? null : SomeUserObject.Username;
这可能是您所能得到的最接近的结果:
string username = (SomeUserObject != null) ? SomeUserObject.Username : null;
你可以使用? :正如其他人所建议的,但您可能需要考虑 Null 对象模式,在该模式中创建一个特殊的静态 User
User.NotloggedIn
并在各处使用它而不是 null 。
然后就变得很容易一直做
.Username
。
其他好处:对于未分配变量和(未登录)用户不允许执行某些操作的情况(null),您可以获得/可以生成不同的异常。
您的 NotloggedIn 用户可以是 User 的派生类,例如 NotLoggedIn,它会重写方法并在未登录时无法执行的操作(例如付款、发送电子邮件等)上引发异常。
作为 User 的派生类,您可以获得一些相当不错的语法糖,因为您可以执行诸如if (someuser is NotLoggedIn) ...
string username = SomeUserObject == null ? "" : SomeUserObject.Username;
请参阅
http://msdn.microsoft.com/en-us/library/ty67wk28.aspx 了解更多详细信息。
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);
string username = SomeUserObject.Username ?? ""