[转载]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。 |
[转载]C#操作符??和?:的更多相关文章
- [转载]MongoDB学习 (五):查询操作符(Query Operators).1st
本文地址:http://www.cnblogs.com/egger/archive/2013/05/04/3059374.html 欢迎转载 ,请保留此链接๑•́ ₃•̀๑! 查询操作符(Quer ...
- C#中如何利用操作符重载和转换操作符 (转载)
操作符重载 有的编程语言允许一个类型定义操作符应该如何操作类型的实例,比如string类型和int类型都重载了(==)和(+)等操作符,当编译器发现两个int类型的实例使用+操作符的时候,编译器会生成 ...
- 30多条mysql数据库优化方法,千万级数据库记录查询轻松解决(转载)
1.对查询进行优化,应尽量避免全表扫描,首先应考虑在 where 及 order by 涉及的列上建立索引. 2.应尽量避免在 where 子句中对字段进行 null 值判断,否则将导致引擎放弃使用索 ...
- 转载请注明出处: https://github.com/qiu-deqing/FE-interview
转载请注明出处: https://github.com/qiu-deqing/FE-interview Table of Contents generated with DocToc FE-inter ...
- sizeof(转载)
原文地址:http://blog.sina.com.cn/s/blog_5da08c340100bmwu.html 转载至:http://www.cnblogs.com/wangkangluo1/ar ...
- JSON相关知识,转载:删除JSON中数组删除操作
一:JSON是什么 JSONg格式:对象是一个无序的“名称/值”对的集合. 对象以括号开始,括号结束. 名称冒号分隔值. "名称/值"之间用逗号分隔 例: var people = ...
- 转载:SqlServer数据库性能优化详解
本文转载自:http://blog.csdn.net/andylaudotnet/article/details/1763573 性能调节的目的是通过将网络流通.磁盘 I/O 和 CPU 时间减到最小 ...
- 【转载】new和malloc的区别
本篇随笔为转载,原贴地址:C++中new和malloc的十点区别. 前言 几个星期前去面试C++研发的实习岗位,面试官问了个问题: new与malloc有什么区别? 这是个老生常谈的问题.当时我回答n ...
- [转载] 深入理解Android之Java虚拟机Dalvik
本文转载自: http://blog.csdn.net/innost/article/details/50377905 一.背景 这个选题很大,但并不是一开始就有这么高大上的追求.最初之时,只是源于对 ...
随机推荐
- 交换机多VLAN访问同一网络
一.前言 经常有需求通过交换机改变IP地址或者实现在同一个交换机中建立多个VLAN访问外部网络(VLAN之间独立),在折腾了多次后,稍有心得,现记录之. 二.实现方案 何为VLAN就不在此赘述.实现起 ...
- php---截取描述方法
参考: https://www.cnblogs.com/xsphehe/p/5682004.html 示例: /** * 参数说明 * $string 欲截取的字符串 * $sublen 截取的长度 ...
- 万事开头难 && 实践出真知
实践出真知,真是千古不变的真理. 前几天在顺手做一个万年历项目,实现了用TFT屏显示实时时间,日期,温度,和按键设置时间,能在特定时间显示特定的话语在显示屏上面.其实这个项目现在想想还是挺简单的.我的 ...
- Cloudstack云平台实践
laaS平台的虚拟化 利用率高 资源整合 节约电能 节约空间 灾难恢复 CloudStack是一个开源的具有高可用性及扩展性的云计算平台.支持管理大部分主流的hypervisor,如KVM虚拟机,Xe ...
- poj1066 Treasure Hunt【计算几何】
Treasure Hunt Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 8192 Accepted: 3376 Des ...
- 肖俊:HPE IT 的DevOps 实践分享
本篇文章来自于HPE和msup共同举办的技术开放日HPE测试技术总监肖俊的分享,由壹佰案例整理编辑. 一.DevOps含义解析 这是DevOps的趋势图.DevOps这个概念大概是在2009年被提出来 ...
- maven冲突问题
通过配置文件解决问题: http://stamen.iteye.com/blog/2030552 1.用命令dependency:tree得到依赖关系 (或者加上Dincludes或者Dexclude ...
- POJ 1061 - 青蛙的约会 - [exgcd求解一元线性同余方程]
先上干货: 定理1: 如果d = gcd(a,b),则必能找到正的或负的整数k和l,使ax + by = d. (参考exgcd:http://www.cnblogs.com/dilthey/p/68 ...
- spring boot继承web和mybatis时,调用接口删除记录出现的空指针以及解决办法
前两天在学spring boot的时候,出现了一个很奇怪的错误,因为是第一次使用spring boot,所以没想到会遇到这种莫名其妙的bug,即调用接口删除数据库中一条记录的时候,数据库中记录事实上以 ...
- CentOS关闭防火墙&SELinux
须知: 防火墙配置文件:/etc/sysconfig/iptables 查看防火墙状态:service iptables status 关闭防火墙:service iptables stop 关闭ip ...