[转载]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。
|
转载于:https://www.cnblogs.com/AaronBear/p/5952780.html
[转载]C#操作符??和?:相关推荐
- [转载]JAVA操作符
几乎所有运算符都只能操作"主类型"(Primitives).例外是"="."= ="和"! =",它们能操作所有对象.除 ...
- c语言用string类型,c语言中的string
1. strlen(char const* s); 函数传入的是c风格字符串(即以'\0'结尾的字符数组),返回的长度为size_t(即unsigned int),其长度不包括'\0'. 2. str ...
- (转载)你好,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++中,除了需要用算术操作符对数据进行加减乘除的算术操作之外,我们有时候还需 ...
- 【转载】C++操作符
C++操作符介绍 优先级 运算符 含 义 示 例 结合方向 要求运算 对象的个数 可重载性 1 :: 全局解析 ::x 自右至左 一元操作符 不可重载 :: 类域解析 X::x 自左至右 二元 ...
- makefile学习(转载)
该篇文章为转载,是对原作者系列文章的总汇加上标注. 支持原创,请移步陈浩大神博客: http://blog.csdn.net/haoel/article/details/2886 makefile很重 ...
- NET基础(3):is 和 as 操作符
在C#语言中进行类型转换的另外一种方式是使用is和as操作符.is检查对象是否兼容于指定类型,返回Boolean值true或false.注意,is操作符永远不抛出异常,例如以下代码: Object o ...
- shell 语法简介(转载)
一.基本语法 1.1.shell文件开头 shell文件必须以下面的行开始(必须方在文件的第一行): #!/bin/sh 符号#!用来告诉系统它后面的参数是用来执行该文件的程序.在这个例子中我们使 ...
- 翻译-高质量JavaScript代码书写基本要点(转载)
by zhangxinxu from http://www.zhangxinxu.com 本文地址:http://www.zhangxinxu.com/wordpress/?p=1173 原文作者:S ...
- [转载]oracle索引的简单总结
原文地址:oracle索引的简单总结作者:kindle 一.索引的概念: 数据库的索引类似于书籍的索引.在书籍中,索引允许用户不必翻阅完整个书就能迅速地找到所需要的信息.在数据库中,索引也允许数据库程 ...
最新文章
- Protractor测试环境搭建
- 基于Python的HTTPS协议模拟登陆+爬取页面
- 编写更好的 Java 单元测试的 7 个技巧
- Url Rewrite 再说Url 重写
- C# 参数按照ASCII码从小到大排序(字典序)
- 使用SpringBoot的jackson包进行实体类型转换
- Swift 中如何测试驱动开发
- matlab双纵坐标的绘图命令_MATLAB基础学习之绘图基本命令
- 【CodeForces - 122B 】Lucky Substring (字符串,水题)
- 变电站计算机在线监控系统,变电站环境在线监测系统
- JVM专题之类加载机制
- 用 Nginx 禁止国外 IP 访问我的网站....
- M1 MacBook Air值不值得买?使用体验分享
- 【实战】Axis2后台Getshell
- 精通开关电源设计(一)
- Java 多个文件压缩为一个zip文件
- 旷世face++人脸识别实名鉴权商汤科技ocr二要素哪家强
- Flutter 实现风车加载动画组件
- 道一云七巧-低代码快速开发平台 JNPF快速开发平台 3.4 更新介绍说明
- MyBatis联合主键结果集与SQL查询结果不一致的问题
热门文章
- 分析解决logcat报read: Unexpected EOF!异常
- 栈和队列:1.栈(Stack)
- python安装轮子_python
- redis清理缓存_大话Redis问题
- 【Flink】Flink + Drools 构建规则模型
- 【Flink】Flink 资源相关 Slot SlotPool
- 【Elasticsearch】如何使用 Elasticsearch 6.2 搜索中文、日语和韩语文本 - 第 3 部分:语言检测工具
- 【Clickhouse】Clickhouse MergeTree家族引擎
- 【Java】字符串substring方法在jkd6,7,8中的差异
- 95-190-642-源码-窗口操作符-EvictingWindowOperator