先看如下代码:

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数据进行 ifobject==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。

转载于:https://www.cnblogs.com/AaronBear/p/5952780.html

[转载]C#操作符??和?:相关推荐

  1. [转载]JAVA操作符

    几乎所有运算符都只能操作"主类型"(Primitives).例外是"="."= ="和"! =",它们能操作所有对象.除 ...

  2. c语言用string类型,c语言中的string

    1. strlen(char const* s); 函数传入的是c风格字符串(即以'\0'结尾的字符数组),返回的长度为size_t(即unsigned int),其长度不包括'\0'. 2. str ...

  3. (转载)你好,C++(17)0.1*10不等于1.0——4.1.4 关系操作符4.1.5 逻辑操作符

    你好,C++(17)0.1*10不等于1.0--4.1.4 关系操作符4.1.5 逻辑操作符 4.1.4  关系操作符 在C++中,除了需要用算术操作符对数据进行加减乘除的算术操作之外,我们有时候还需 ...

  4. 【转载】C++操作符

    C++操作符介绍 优先级 运算符 含    义 示  例 结合方向 要求运算 对象的个数 可重载性 1 :: 全局解析 ::x 自右至左 一元操作符 不可重载 :: 类域解析 X::x 自左至右 二元 ...

  5. makefile学习(转载)

    该篇文章为转载,是对原作者系列文章的总汇加上标注. 支持原创,请移步陈浩大神博客: http://blog.csdn.net/haoel/article/details/2886 makefile很重 ...

  6. NET基础(3):is 和 as 操作符

    在C#语言中进行类型转换的另外一种方式是使用is和as操作符.is检查对象是否兼容于指定类型,返回Boolean值true或false.注意,is操作符永远不抛出异常,例如以下代码: Object o ...

  7. shell 语法简介(转载)

    一.基本语法 1.1.shell文件开头 shell文件必须以下面的行开始(必须方在文件的第一行):  #!/bin/sh  符号#!用来告诉系统它后面的参数是用来执行该文件的程序.在这个例子中我们使 ...

  8. 翻译-高质量JavaScript代码书写基本要点(转载)

    by zhangxinxu from http://www.zhangxinxu.com 本文地址:http://www.zhangxinxu.com/wordpress/?p=1173 原文作者:S ...

  9. [转载]oracle索引的简单总结

    原文地址:oracle索引的简单总结作者:kindle 一.索引的概念: 数据库的索引类似于书籍的索引.在书籍中,索引允许用户不必翻阅完整个书就能迅速地找到所需要的信息.在数据库中,索引也允许数据库程 ...

最新文章

  1. Protractor测试环境搭建
  2. 基于Python的HTTPS协议模拟登陆+爬取页面
  3. 编写更好的 Java 单元测试的 7 个技巧
  4. Url Rewrite 再说Url 重写
  5. C# 参数按照ASCII码从小到大排序(字典序)
  6. 使用SpringBoot的jackson包进行实体类型转换
  7. Swift 中如何测试驱动开发
  8. matlab双纵坐标的绘图命令_MATLAB基础学习之绘图基本命令
  9. 【CodeForces - 122B 】Lucky Substring (字符串,水题)
  10. 变电站计算机在线监控系统,变电站环境在线监测系统
  11. JVM专题之类加载机制
  12. 用 Nginx 禁止国外 IP 访问我的网站....
  13. M1 MacBook Air值不值得买?使用体验分享
  14. 【实战】Axis2后台Getshell
  15. 精通开关电源设计(一)
  16. Java 多个文件压缩为一个zip文件
  17. 旷世face++人脸识别实名鉴权商汤科技ocr二要素哪家强
  18. Flutter 实现风车加载动画组件
  19. 道一云七巧-低代码快速开发平台 JNPF快速开发平台 3.4 更新介绍说明
  20. MyBatis联合主键结果集与SQL查询结果不一致的问题

热门文章

  1. 分析解决logcat报read: Unexpected EOF!异常
  2. 栈和队列:1.栈(Stack)
  3. python安装轮子_python
  4. redis清理缓存_大话Redis问题
  5. 【Flink】Flink + Drools 构建规则模型
  6. 【Flink】Flink 资源相关 Slot SlotPool
  7. 【Elasticsearch】如何使用 Elasticsearch 6.2 搜索中文、日语和韩语文本 - 第 3 部分:语言检测工具
  8. 【Clickhouse】Clickhouse MergeTree家族引擎
  9. 【Java】字符串substring方法在jkd6,7,8中的差异
  10. 95-190-642-源码-窗口操作符-EvictingWindowOperator