C#中?的相关使用
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的出现。相比较使用各种判断语句而言,?的出现无疑让代码精简了不少,理解性也提高了很多。而且它们之间的嵌套使用(像最后一个例子)在复杂的判断中优势更加的明显。
C#中?的相关使用的更多相关文章
- 理解CSV文件以及ABAP中的相关操作
在很多ABAP开发中,我们使用CSV文件,有时候,关于CSV文件本身的一些问题使人迷惑.它仅仅是一种被逗号分割的文本文档吗? 让我们先来看看接下来可能要处理的几个相关组件的词汇的语义. Separat ...
- Spring Framework------>version4.3.5.RELAESE----->Reference Documentation学习心得----->Spring Framework中web相关的知识(概述)
Spring Framework中web相关的知识 1.概述: 参考资料:官网documentation中第22小节内容 关于spring web mvc: spring framework中拥有自 ...
- storm-kafka组件中KafkaOffsetMetric相关统计指标说明
storm-kafka组件中KafkaOffsetMetric相关统计指标说明 storm-kafka是storm提供的一个读取kakfa的组件,用于从kafka队列中消费数据.KafkaOffset ...
- Linux中mod相关的命令 内核模块化 mod相关命令都是用来动态加载内核模块/驱动程序模块
Linux中mod相关的命令 内核模块化 mod相关命令都是用来动态加载内核模块/驱动程序模块 http://baike.baidu.com/link?url=lxiKxFvYm-UfJIxMjz ...
- 补充:sql server 中的相关查询、case函数
相关查询(在同一个表中) 相关查询类似子查询,但是又不同于子查询:子查询中的子条件可以单独查出数据,但是相关查询的子条件不能查处数据.(可以理解成C#中for的穷举法,第一个for走一个,第二个for ...
- c语言中数组相关问题
c语言中数组相关问题: 1.数组基本定义: 相同数据类型的元素按一定顺序排列的集合,就是把有限个类型相同的变量用一个名字命名,然后用编号区分他们的变量的集合,这个名字称为数组名,编号称为下标.组成数组 ...
- 【Socket编程】Java中网络相关API的应用
Java中网络相关API的应用 一.InetAddress类 InetAddress类用于标识网络上的硬件资源,表示互联网协议(IP)地址. InetAddress类没有构造方法,所以不能直接new出 ...
- c语言中条件编译相关的预编译指令
一. 内容概述 本文主要介绍c语言中条件编译相关的预编译指令,包括#define.#undef.#ifdef.#ifndef.#if.#elif.#else.#endif.defined. 二.条件编 ...
- (笔记)Linux内核中内存相关的操作函数
linux内核中内存相关的操作函数 1.kmalloc()/kfree() static __always_inline void *kmalloc(size_t size, gfp_t flags) ...
- electron-builder中NSIS相关配置
electron-builder中NSIS相关配置 相比较于electron-packager打包,使用electron-builder打包使得包体积更小.在electron-builder中,对于N ...
随机推荐
- find 命令和sed命令练习
1.查找/var目录下属主为root,且属组为mail的所有文件 find /var/ -user root -group mail 2.查找/var目录下不属于root.lp.gdm的所有文件 fi ...
- 题解 [SDOI2010] 大陆争霸
题面 解析 这题似乎不是那么难啊 首先,显而易见, 如果要摧毁一个城市,必须要满足两个条件: 机器人摧毁了保护它的城市. 机器人到达了这个城市. 而这两个条件可以同时进行(毕竟有无数机器人) 那么显然 ...
- 【Wince-USB通讯】Wince在没有Wifi的情况下使用USB数据线与PC进行Socket通讯
具体操作 1.确保Wince连接PC成功 2.服务端的IP输入:127.0.0.1 ,然后启动侦听. 3.在客户端输入的服务器IP是:192.168.55.100 (客户端的IP是192.168.55 ...
- is(expr|obj|ele|fn)
is(expr|obj|ele|fn) 概述 根据选择器.DOM元素或 jQuery 对象来检测匹配元素集合,如果其中至少有一个元素符合这个给定的表达式就返回true.大理石平台支架 如果没有元素符合 ...
- JS核心知识点:DOM\BOM\EVENT
1.DOM(Document Object Model) :文档对象模型2. DOM节点:页面中最基本的组成部分 3. childNodes:获取某个节点下所有的子节点 在标准及ie9以上 : 会获取 ...
- Postman官方文档翻译
本文根据官方文档,为千夜同学的翻译做了一个目录 启动Postman Postman的安装和升级 发送第一个请求 创建第一个集合 Postman导航 Postman账号 同步 设置 新按钮 发送API请 ...
- 第一次使用Open Live Writer写博客
写一下来试一试,感觉还是蛮有趣的.但是我并不知道写下来的文章是什么格式的,我刚才用VS Code打开看了一下好像都是二进制格式. 7.5正式入职,已经过去七天了.等培训结束就要去Base地了,新的生活 ...
- Mybatis源码学习之日志(五)
简述 在Java开发中常用的日志框架有Log4j.Log4j2.Apache Commons Log.java.util.logging.slf4j等,这些工具对外的接口并不相同.为了统一这些工具的接 ...
- JVM GC之垃圾收集算法
1.垃圾收集概念 GC目的 分配内存,为每个新建的对象分配空间 确保还在使用的对象的内存一直还在,不能把有用的空间当垃圾回收了 释放不再使用的对象所占用的空间 我们把还被引用的对象称为活的,把不再被引 ...
- JavaScript设计模式—代理模式
代理模式介绍 使用者无权访问目标对象,中间加代理,通过代理做授权和控制 代理(proxy)是一个对象,它可以用来控制对另外一个对象的访问: 代理对象和本体对象实现了同样的接口,并且会把任何方法调用传递 ...