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

最新文章

  1. java中的集合和区别
  2. Effective Java 62 Document all exceptions thrown by each method
  3. iOS:特殊符号大全
  4. [原]poj-2680-Choose the best route-dijkstra(基础最短路)
  5. MSSQL手札四 MSSQL的函数
  6. MySQL数据库还原:路径必须用正斜杠?
  7. Win8.1中打不开IE的解决方法
  8. What does wildcard address in InetSocketAddress mean?
  9. git 提高下载速度
  10. 从Thread,ThreadPool,Task, 到async await 的基本使用方法解读
  11. python 全栈开发,Day4(正式)
  12. remove() 方法
  13. Packet for query is too large (1660 > 1024). You can change this value on the server by setting the max_allowed_packet' variable.
  14. pyspark数据准备
  15. Java基础-SSM之Spring的AOP编程
  16. 转:Java中String与byte[]的转换
  17. GitHub+Hexo 搭建个人网站
  18. libcurl HTTP POST请求向服务器发送json数据
  19. [ 原创 ] Java基础5--abstract class和interface的区别
  20. 2017ACM暑期多校联合训练 - Team 4 1003 HDU 6069 Counting Divisors (区间素数筛选+因子数)

热门文章

  1. 【Remoting】.Net remoting方法实现简单的在线升级(上篇:更新文件)
  2. c#初学-多线程中lock用法的经典实例
  3. 比对两个同类型的List
  4. mysql和oracle jdbc连接
  5. c语言是如何实现泛型链表
  6. Scalaz(27)- Inference & Unapply :类型的推导和匹配
  7. psql 命令行使用
  8. [python拾遗]enumerate()函数
  9. 【FOL】第二周
  10. CodeBlock