C#中双问号(??)在检测Null方面的带来的方便

来源:互联网 发布:jinshi数据 编辑:程序博客网 时间:2024/05/21 12:48

 

最近接到一个维护项目,发现里面超多BUG,基本都是NullReferenceException突然想起C#中有个双问号(??)的单元运算符,用于解决这个问题实在是方便的很。

   首先,既然双问号(??)是一个单元运算符,那么其左右两边数据类型必须是相同类型或能隐形转换类型的。它表示的意思是,首先检测左边的值,若其为Null,那么整个表达式取值为右侧的值,否则为左侧的值。

   例如:string s = null; Console.Write(s ?? "abc");。将打印出"abc"。

   例如string s = "a";Console.Write(s ?? "abc");将打印出"a"。

   下面将对项目中的一些实例进行详细的分析并改进代码:

   示例一:<%# Eval("JBQK_DXXL").ToString() == "本科" ? Eval("JBQK_DXXLSJ") : ""%>。

   这个是在数据绑定控件中很常见的绑定数据的代码,错误也很明显,当JBQK_DXXL为null时,将报NullReferenceException异常。若不用双问号(??)的话,修改后的代码将类似于

   <%# (Eval("JBQK_DXXL") != null && Eval("JBQK_DXXL").ToString() == "本科") ? Eval("JBQK_DXXLSJ") : ""%>

   而使用双问号(??)后,代码将如下:

   <%# (Eval("JBQK_DXXL") ?? string.Empty).ToString() == "本科" ? Eval("JBQK_DXXLSJ"): ""%>

   示例二:entity.ZXX.Contains("高中")

   错误同样明显,entity.ZXX为空,报NullReferenceException异常。

   不用双问号(??)的话,需要先检测空,if(entity.ZXX!=null)

   而使用双问号(??)代码如下:

   (entity.ZXX ?? string.Empty).Contains(item.Text)

   示例三:赋予默认值

   在给一个变量赋值的时候,可以用双问号(??)来起到设置默认值的作用。

   string s = entity ?? string.Empty;

   总结下来,就是省去了if(XXX==null)的判断,特别是在数据控件中绑定数据时,由于不能写语句,只能写表达式,更加发挥出了双问号(??)的作用。


原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 开眼角后增生了怎么办 下颌骨宽怎么办不整容 脸两边骨头太宽怎么办 接了睫毛眼睛疼怎么办 下颌骨错位脸歪怎么办 假体隆鼻感冒了怎么办 打了玻尿酸怀孕怎么办 鼻子上有出血点怎么办 内眼角开小了怎么办 上眼皮肿怎么办小妙招 嫁接的睫毛乱了怎么办 睫毛掉进眼睛里怎么办 痘痘留下的疤痕怎么办 宫颈癌前病变1级怎么办 纹身后结痂很厚怎么办 纹身结痂蹭掉了怎么办 药流20天同房了怎么办 药流23天同房了怎么办 小产后不来月经怎么办 人流12天同房了怎么办 人流20天同房了怎么办 人流后5天同房了怎么办 人流后3天同房了怎么办 人流20后同房了怎么办 上环后月经量多怎么办 上环后喝啤酒了怎么办 取环当天同房了怎么办 生完孩子有外痔怎么办 怀孕了宫腔积液怎么办 做完爱4天怕怀孕怎么办 半永久眉失败了怎么办 取环前2天同房了怎么办 怀孕了发现有子宫肌瘤怎么办 宫腔中央性粘连怎么办 孕妇宫腔粘连带怎么办 内膜厚怎么办吃什么好 功血引起的贫血怎么办 吃宫血宁后月经不来了怎么办 孕晚期胎心不好怎么办 胎心不好怎么办让住院 39 5胎心不好怎么办