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

时间:2012-04-16 13:00:31

标签: c# nullpointerexception

C#中的运算符是否与groovy中的安全导航运算符相似?

例如,在groovy中,如果SessionData.CurrentSeminar为null,那么执行此类操作将阻止它获取NullPointerException。

int respId = SessionData.CurrentSeminar?.SeminCbaRespId;

如何用C#完成这项工作?

4 个答案:

答案 0 :(得分: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);
}

答案 1 :(得分:0)

也许这样的解决方法?

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

答案 2 :(得分:0)

没有这方面的操作员,但你可以接近。试试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");

答案 3 :(得分:0)

最接近的运算符是?:,但它不是含糖的 所以,你可以这样做:

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