c# ?和??
先看如下代码:
string strParam = Request.Params[ "param" ]; if ( strParam== null ) { strParam= "" ; } string strParam= Request.Params[ "param" ] == null ? "" : Request.Params[ "param" ]; |
你发现,尽管实现的同一个功能,但第二段代码要比第一段代码是不是更简洁。 这里的” ?:“就是一个三元的操作符。利用这个三元操作符也称条件操作符, 就很简单的把一个 if 语句给实现了。 在使用条件操作符的时候要注意,假定条件表达式是这样 x?y:z, 表达式类型的只能是使y 和z的变量类型之一,换句话说就是 y和z的变量类型决定这个条件表达式的类型, 无论y和z是同一类型,还是y和z不是同一类型。 如果表达式的类型和赋值类型不一致,发生编译时错误 ,例如:如果你想实现如下代码: string strTemp ; object obj; .... if (strTemp == "" ) obj = DBNull.Value; else obj = strTemp ; 然后为了简单,改成下面这种形式: string strTemp; object obj = strTemp == "" ?DBNull.Value:strTemp; 你编译的时候,会报错。因为DBNull和 string 之间没隐式转换,修改成如下代码就可以了: object obj = strTemp == "" ? DBNull.Value: ( object )strTemp; 另外条件操作符是向右关联的,从左到右进行计算,于是a?b:c?d:e 应理解为 a?b:(c?d:e)。 上面提到了DBNull,在c#2.0里面实现了Nullable数据类型,别小看这个数据类型,其实非常有用, 从此我们就可以放弃对 object 数据进行 if ( object == null )这样的判断了。同时你会发现, 在数据库应用上,数据库中有的字段允许取空值,在C#世界中引入nullable类型正好与之对应 ,从(C#)对象映射到关系数据库对象,或者反过来,转换都是比较平滑。 为了实现Nullable数据类型转换成non-Nullable型数据,就有了一个这样的操作符”??(两个问号)“,双问号操作符意思是取所赋值??左边的,如果左边为 null ,取所赋值??右边的, 比如 int y = x ?? -1 如果x为空,那么y的值为-1. 于是这时候就可以把最上面第二段代码改成: string strParam= Request.Params[ "param" ]?? "" ; 嘿嘿,是不是更简洁了。 另外还有”?(单问号)“修饰符,是System.Nullable的缩写形式,比如 int ?代表是可空的整形, 例如: int ? a = 1 或者 int ? b= null 。Nullable类型具有一个HasValue的 bool 类型只读属性, 当Nullable类型实例的该属性为 true 时,则表示该实例是非空实例,包含一个已知值Value, HasValue为 false 时,访问Value属性将导致System.InvalidOperationException。 |
随机推荐
- java之反射概述
类加载器和反射 类加载器: 1 类的加载过程: 当程序要使用某个类时,如果该类还未被加载到内存中,则系统会通过加载.连接.初始化三步骤来实现对这个类进行初始化. 加载:就是指将class文件读入内存 ...
- centos 限制只能访问某个目录的php文件
vi /etc/php.ini #编辑 open_basedir = .:/tmp/ #在380行 设置表示允许访问当前目录(即PHP脚本文件所在之目录)和/tmp/目录,可以防止php木马跨站,如果 ...
- bzoj 3671 [Noi2014]随机数生成器——贪心(时间复杂度分配)
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=3671 设 x 为一个点的行号, y 为一个点的列号:原本想着判断一个点能不能选就是看选了的点 ...
- bzoj3258秘密任务
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=3258 因为只走最短路,所以先正反两遍djkstra,新建边. 这里的边是单向边.所以要用原来 ...
- NumPy-快速处理数据--ndarray对象--多维数组的存取、结构体数组存取、内存对齐、Numpy内存结构
本文摘自<用Python做科学计算>,版权归原作者所有. 上一篇讲到:NumPy-快速处理数据--ndarray对象--数组的创建和存取 接下来接着介绍多维数组的存取.结构体数组存取.内存 ...
- jeecg中List页面标签的用法
1.t:datagrid的常用属性 1. <t:datagrid name="jeecgDemoList" checkbox="true" sortNam ...
- JDBC--数据库链接及相关方法的封装
使用的是MySQL数据库,首先导入驱动类,然后根据数据库URL和用户名密码获得数据的链接.由于使用的是MySQL数据库,它的URL一般为,jdbc:mysql://主机地址:端口号/库名. 下面是封装 ...
- java代码--------实现随机输出100个随机数,10行,0--到9的数字
总结:妹纸不是那么会表述,如有不妥之处,请提出来 package com.sads; //杰伦的世界 //实现在0-100个数中,随机输出数每行10个数,也就是10行10列,这些数在0---到9之间 ...
- hadoop从调整GC到关键Counter计算原理分析
hadoop集群中发现使用Parallel Scavenge+Parallel Old收集器组合进行垃圾收集(这也是server端jvm默认的GC方式)时CPU占用可能会非常高,偶尔会出现爆满的状态 ...
- canvas之画矩形
<canvas id="canvas" width="600" height="500" style="background ...