C#中?的相关使用

我是研究僧i 提交于 2019-12-01 18:36:31

原链接:https://www.cnblogs.com/iNeXTs/p/10023996.html

C#中?的相关使用

1. 可空类型

看标题就能够很好的理解这个概念:可以为空的类型。而在C#中可以为空也就是null的类型,都是引用类型,所以?对于引用类型来说,也就没有什么存在的价值了,只能服务于值类型,使得在某些不确定的情况下,值类型拥有更好的适应能力。也就是说,值类型也可以接受null,当然是在使用?的前提下。使用如下,在值类型后添加?即可:

  int? a = null;  a = 10;

可以看的出,声明为可空类型的变量,既可以接收null也可以接收正常的值类型。

2. 可空运算符

使用可空运算符这个词可能不是特别的合适,但一时词穷,将就用了。其实就是?.?[]罢了。分别用于对象对成员的调用以及数组的索引。对象为空或者数组为空,这种情况还是挺常见的。如果按照平时的写法大致就是。。。

  if(object != null){//方法调用      object.method();  }  if(array != null){ //数组索引      int a = array[1];  }

但是现在有了可空运算符之后,能省的就都省了,简洁到飞起来,一句代码搞定。

  object?.method();  array?[1];

而且这样的写法更加的容易理解,在执行方法的调用或者素组的索引之前,进行null的判断,如果为null,则后续的操作打断,返回null;不为null,则继续执行。这样的效率相比较if判断也要更高一下。

3. 三元运算符 condition?(true result):(false result)

这个再熟悉不过了,但是之前一直没有和这些归为一类来考虑,只是机械化的使用。不同的是,三元运算符的condition必须为bool类型,为true时,返回true result;false时,返回false result。需要注意的应该就是返回的值一定要和定义类型匹配才行。

4. 空合并运算符 ??

有些情况下,获取的值可能出现null,但获取的null对于后续的程序来说无法使用。好的处理方法,应该就是判断一下获取的值是否为null,为null,那么就赋一个值;不为null,就直接使用获取的值,这样是比较合理的操作。这里使用三元运算符是完全可以进行解决的,如下:

  int oneNum = object.num !=null? object.num : 0;

这样获取到oneNum永远都不会为null,对于后续的代码而言,也是相对有好的。虽然三元运算符可以解决,但更简洁的解决方案是使用??:

  int oneNum = object.num ?? 0;

当object.num不为null时,返回object.num;object.num为null,则返回0。相比较三元运算符而言,更加的简洁,理解性也高了不少。但是上面的使用存在一个问题,如果object为null呢?这里就可以使用可空运算符来判断,如下:

  int oneNum = object?.num ?? 0;

这样就保证了在ojbect为null的情况下,也不会出错了。

总结

null在很多情况下,对于程序而言都是不友好的,我们也极力地避免null的出现。

相比较使用各种判断语句而言,?的出现无疑让代码精简了不少,理解性也提高了很多。而且它们之间的嵌套使用(像最后一个例子)在复杂的判断中优势更加的明显。

 

1. 可空类型

看标题就能够很好的理解这个概念:可以为空的类型。而在C#中可以为空也就是null的类型,都是引用类型,所以?对于引用类型来说,也就没有什么存在的价值了,只能服务于值类型,使得在某些不确定的情况下,值类型拥有更好的适应能力。也就是说,值类型也可以接受null,当然是在使用?的前提下。使用如下,在值类型后添加?即可:

  int? a = null;  a = 10;

可以看的出,声明为可空类型的变量,既可以接收null也可以接收正常的值类型。

2. 可空运算符

使用可空运算符这个词可能不是特别的合适,但一时词穷,将就用了。其实就是?.?[]罢了。分别用于对象对成员的调用以及数组的索引。对象为空或者数组为空,这种情况还是挺常见的。如果按照平时的写法大致就是。。。

  if(object != null){//方法调用      object.method();  }  if(array != null){ //数组索引      int a = array[1];  }

但是现在有了可空运算符之后,能省的就都省了,简洁到飞起来,一句代码搞定。

  object?.method();  array?[1];

而且这样的写法更加的容易理解,在执行方法的调用或者素组的索引之前,进行null的判断,如果为null,则后续的操作打断,返回null;不为null,则继续执行。这样的效率相比较if判断也要更高一下。

3. 三元运算符 condition?(true result):(false result)

这个再熟悉不过了,但是之前一直没有和这些归为一类来考虑,只是机械化的使用。不同的是,三元运算符的condition必须为bool类型,为true时,返回true result;false时,返回false result。需要注意的应该就是返回的值一定要和定义类型匹配才行。

4. 空合并运算符 ??

有些情况下,获取的值可能出现null,但获取的null对于后续的程序来说无法使用。好的处理方法,应该就是判断一下获取的值是否为null,为null,那么就赋一个值;不为null,就直接使用获取的值,这样是比较合理的操作。这里使用三元运算符是完全可以进行解决的,如下:

  int oneNum = object.num !=null? object.num : 0;

这样获取到oneNum永远都不会为null,对于后续的代码而言,也是相对有好的。虽然三元运算符可以解决,但更简洁的解决方案是使用??:

  int oneNum = object.num ?? 0;

当object.num不为null时,返回object.num;object.num为null,则返回0。相比较三元运算符而言,更加的简洁,理解性也高了不少。但是上面的使用存在一个问题,如果object为null呢?这里就可以使用可空运算符来判断,如下:

  int oneNum = object?.num ?? 0;

这样就保证了在ojbect为null的情况下,也不会出错了。

总结

null在很多情况下,对于程序而言都是不友好的,我们也极力地避免null的出现。

相比较使用各种判断语句而言,?的出现无疑让代码精简了不少,理解性也提高了很多。而且它们之间的嵌套使用(像最后一个例子)在复杂的判断中优势更加的明显。

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!