什么是安全导航操作员的最佳实现

本文关键字:最佳 实现 操作员 导航 安全 什么 | 更新日期: 2023-09-27 18:31:27

C# 中是否有一个运算符的行为类似于 groovy 中的安全导航运算符?

例如,在 groovy 中,如果 SessionData.CurrentSeminar 为空,执行这样的事情将阻止它获得 NullPointerException。

int respId = SessionData.CurrentSeminar?.SeminCbaRespId;

如何使用 C# 实现这一点?

什么是安全导航操作员的最佳实现

该运算符在 C# 中不存在。你可以用内联-if 来做到这一点

int respId = SessionData.CurrentSeminar != null ? 
   SessionData.CurrentSeminar.SeminCbaRespId : default(int);

或作为扩展方法。

var respId = SessionData.CurrentSeminar.GetSeminCbaRespId();
public static int GetSeminCbaRespId(this typeofCurrentSeminar CurrentSeminar)
{
   return CurrentSeminar != null ? CurrentSeminar.SeminCbaRespId : default(int);
}

也许像这样的解决方法?

int respId= ReferenceEquals(SessionData.CurrentSeminar,null)?-1:SessionData.CurrentSeminar.SeminCbaRespId;

最接近的运算符是 ?: ,但它没有那么含糖。
因此,您可以执行以下操作:

int respId = SessionData.CurrentSeminar != null ? SessionData.CurrentSeminar.SeminCbaRespId : 0; // if 0 is the "null" value 

没有运算符,但您可以接近。试试这个答案中的一个:

int respId = SessionData.CurrentSeminar.NullOr(s => s.SeminCbaRespId) ?? 0;

如果您需要链接其中的几个,这将变得格外有用:

var elem = xml.Element("abc")
    .NullOr(x => x.Element("def"))
    .NullOr(x => x.Element("blah");