2012-04-16 38 views
1

在C#中是否有一个运算符像Groovy中的安全导航运算符那样?安全导航运算符的最佳实现是什么

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

int respId = SessionData.CurrentSeminar?.SeminCbaRespId; 

这是如何用C#完成的?

+0

你没有提到你想,如果CurrentSeminar为null,该值。你想要null还是0? – 2012-04-16 13:10:53

回答

1

该运算符在C#中不存在。你可以用内联的方式做 - 如果

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); 
} 
+0

这似乎是一个很好的解决方法,谢谢。我们厌倦了C#中不存在这样一个完美的运算符。 – kbaccouche 2012-04-16 13:10:29

+0

http://connect.microsoft.com/VisualStudio/feedback/details/192177/a-bit-more-c-syntactic-sugar-for-nulls – 2012-04-16 13:11:47

+0

并没有什么是完美的。 – 2012-04-16 13:12:53

0

也许这样的解决方法?

int respId= ReferenceEquals(SessionData.CurrentSeminar,null)?-1:SessionData.CurrentSeminar.SeminCbaRespId; 
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"); 
0

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

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