优雅的方式做链式空检查

Pan*_*kaj 5 c# lambda

我正在使用此解决方案在我的代码中进行链式空检查

更清洁的方法在C#中进行空检查?

我只是想知道我们不能这样做.

bool returnValue = Helper.IsNull(nullPerson.contact.address.city);
Run Code Online (Sandbox Code Playgroud)

那不是更清洁吗?

我尝试编写这样的通用函数

public static bool IsNull<T>(this T rootObj)
{
  var visitor = new IsNullExpressionVisitor();
  //...
  //...
}
Run Code Online (Sandbox Code Playgroud)

但后来我陷入了如何从这个rootObject中表达出来的问题.

Mat*_*son 5

解决这个问题的一种方法(尽管仍然有点笨拙)是使用有时被称为“Maybe” monad 的构造

使用它,代码将变成这样(您可能喜欢也可能不喜欢!):

string city = nullPerson.With(x => x.address)
                        .With(x => x.city);
Run Code Online (Sandbox Code Playgroud)

不过,值得庆幸的是,C# 正在获得“安全导航”运算符 (?. C# 将在下一版本* 中

使用这个新的?.运算符,代码将如下所示:

city = nullPerson?.address?.city;
Run Code Online (Sandbox Code Playgroud)

(*据称...)