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#的精彩世界还离不开其提供的丰富的操作符,按照操作数的个数,C#操作符可分为以下几类:
如果从操作符的作用来看,C#操作符可以分为赋值操作符,算术操作符,关系操作符,逻辑操作符,位操作符和其它操作符。 1.赋值操作符 赋值操作符除基本的赋值操作符“=”之外还包括以下的组合赋值操作符:
要注意的是,对于复合的赋值操作符,中间不运许有空格,否则程序将会报错。 关于赋值操作符的运用下面给出一个综合的例子: using System; class ComOp double d1 = 10.5; int a=16; 运行结果如下: 注意:符合赋值操作符右边值的数据类型必须与左边值得数据类型相同或能够进行隐式转换,否则会出错。 2.算术操作符 C#为我们提供了5种算术操作符:
对于+,-,*,/,大家都不陌生,下面只说一说求余操作符%。 在C#中,%不仅可以对于整数求余数,对小数同样可以求余数。如 5%3=2,3.2%2=1.2,5%1.5=0.5。 下面给出一个综合例子来说一下算术操作符的用法: using System; class AriOp int a=13,b=11; 运算结果如下: 3.关系操作符 关系操作符,即比较操作符,是用于比较两个值大小或相等的。其结果应该是一个逻辑值“真”或“假”。C#中的的关系操作符主要有以下几种:
在书写组合操作符时要注意,两个字符之间不允许有空格,否则系统无法识别,而出错。 对于布尔类型、引用类型和字符串类型,只能使用==和!=两个关系操作符,即无大小之分,只有是否相等和不相等之分。下面举一个例子说明其用法: using System; class ComOp 运行结果如下: 4.逻辑操作符 逻辑操作符用于两个布尔值之间。C#提供了3种逻辑操作符: && 表示逻辑“与”的关系,二元操作符; || 表示逻辑“或”的关系,二元操作符; ! 表示逻辑“非”的关系,一元操作符; 它们之间的运算关系可以用真值表来表示。假设,x和y是两个布尔值,它们的初始值和运算结果如下表:
下面给出一个简单的例子,测试一下逻辑操作符的使用方法: 运行结果如下: 5.条件操作符 C#中唯一的一个三元操作符为:?:,即条件操作符。他要求每一个操作数都必须是一个可以隐式转换成bool类型的表达式,其运用形式如下: 表带式1?表达式2:表达式3; 其先运算表达式1,如果表达式1的值为true,则计算表达式2,运算结果为表达式2的值;若表达式1的值为false,则运算表达式3,运算结果为表达式3的值。 下面给出一个例子: 其运算结果为: 我们也可以运用三元操作符来实现求两个值的大小: 其运行结果为: 6.位操作符 我们知道,任何信息在计算机中都是以二进制的形式保存的。位操作符就是对数据按二进制进行运算的操作符。C#语言中的位操作符有:
其中,取补只有一个操作数,而其它的位操作符都有两个操作数。这些运算都不会产生溢出。位操作符的操作数为整型或者是可以转换为整型的任何其它类型。 (1)& 与操作符 &操作符的操作数按二进制进行与运算,其规则为: 0&0=0 即,除了两个位均为1时,与运算结果为1外,其它任何情况下与运算结果均为0。比如,3和9进行与运算: 3的二进制表示: 00000011 9的二进制表示: 00001001 与运算结果: 00000001 即,3&9的结果为1。 (2)| 或操作符 或操作符的操作数按二进制位进行或运算,其规则为: 0|0=0 即,除了两个位均为0时,或运算结果为0外,其它情况下或运算结果均为1。比如,3和9进行或运算: 3的二进制表示: 00000011 9的二进制表示: 00001001 或运算结果: 00001011 即,3|9的结果为11。 (3)^ 异或操作符 异或操作符的操作数按二进制位进行异或运算,其运算规则为: 0^0=0 可以看出,当两个位相同时,异或运算结果为0;不相同时异或运算结果为1。如3和9进行异或运算: 3的二进制表示: 00000011 9的二进制表示: 00001001 异或运算结果: 00001010 即,3^9的结果为10。 (4)~ 取补操作符 取补操作符对操作数的每一位取补,如对9取补结果为: 9的二进制表示:00001001 取补运算结果: 11110110 (5)移位操作符 左移操作将操作数按位左移,高位被丢弃,低位顺序补0。比如12的二进制为00001100,左移一位为00011000(24),左移二位为00110000(48)。 右移操作时,如果操作数x是int或long类型时,x的低位被丢弃,其它各位顺序依次右移,如果x是非负数,最高位设为零;如果x为负数,则最高位设为1。而当x为uint或ulong类型时,x的低位将被丢弃,其它各位顺序依次右移,高位设为0。 下面简单举个例子来说明以上各位操作符的用法: using System; class Bit Console.WriteLine("\n演示与操作符..."); Console.WriteLine("\n演示异或操作符..."); Console.WriteLine("\n演示取补操作符..."); Console.WriteLine("\n演示移位操作符..."); } 运算结果如下 7.其它操作符 |