【问题标题】:What's the best implementation of safe navigation operator安全导航算子的最佳实现是什么
【发布时间】:2012-04-27 19:26:52
【问题描述】:

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

例如,在 groovy 中,如果 SessionData.CurrentSeminar 为 null,则执行此类操作将防止它获得 NullPointerException。

int respId = SessionData.CurrentSeminar?.SeminCbaRespId;

这是如何用 C# 完成的?

【问题讨论】:

  • 如果 CurrentSeminar 为空,你还没有提到你想要的值。你想要 null 还是 0?
  • 值得注意的是,C# 6.0 添加了与问题示例中一样的安全导航运算符。

标签: c# nullpointerexception


【解决方案1】:

C# 中不存在该运算符。你可以用 inline-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);
}

【讨论】:

【解决方案2】:

也许像这样的解决方法?

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

【讨论】:

    【解决方案3】:

    这里没有运营商,但你可以接近。试试this answer的那个:

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

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

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

    【讨论】:

      【解决方案4】:

      最近的运算符是?:,但没有那么甜。
      所以,你可以这样做:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2010-09-12
        • 1970-01-01
        • 1970-01-01
        • 2013-05-17
        • 1970-01-01
        • 2011-03-17
        • 1970-01-01
        相关资源
        最近更新 更多