前言html
本节主要来说C#中的各类运算符。主要包括is运算符、as运算符、checked和unchecked运算符、sizeof运算符、空接合运算符(??)、&和&&、移位运算符、增量和减量运算符、条件运算符(三元运算符)、命名空间别名限定符。安全
正文测试
一、is运算符this
is运算符能够检查对象是否与特定的类型兼容。好比下例中要检查变量是否与object类型兼容:spa
int i=0; if(i is object) { Console.WriteLine("i is an object."); }
二、as运算符code
as运算符用于执行引用类型的显式类型转换。若是要转换的类型和指定的类型兼容,转换就会成功进行;若是类型不兼容,as运算符就会返回值null。举例以下:htm
static void Main(string[] args) { object obj1 = "a string"; object obj2 = 5; string str1 = obj1 as string; string str2 = obj2 as string; Console.Write("str1为{0}\r\n", str1); Console.Write("str2为{0}", str2); Console.ReadLine(); }
注:as运算符容许在一步中进行安全的类型转换,不须要先使用is运算符测试类型,再执行转换。对象
三、checked和unchecked运算符blog
static void Main(string[] args) { byte b = 255; b++; Console.WriteLine("第一个"+b.ToString()); try { byte c = 255; checked { c++; //抛出OverflowException Console.WriteLine(b.ToString()); } } catch (Exception e) { Console.WriteLine("抛出异常"); } Console.ReadLine(); }
byte数据类型只能包含0~255的数,因此b值的增量会溢出。CLR如何处理溢出?C#提供了checked和unchecked运算符。若是把一块代码段标志为checked,CLR就会执行溢出检查,若是发生异常,就抛出异常。get
若是要禁止溢出检查,能够把代码标记为unchecked。
注:unchecked是默认值。只有在须要把几个未检查的代码行放在一个明确标记为checked的大代码块中,才须要显式使用unchecked关键字。
sizeof能够用来肯定堆栈中值类型须要的长度(单位是字节):
五、空接合运算符(??)
空接合运算符为处理可空类型和引用类型时表示Null值的可能性提供了一种快捷方式。这个运算符放在两个操做数之间,第一个操做数必须是一个可空类型或引用类型,第二个操做数必须与第一个操做数的类型不一样,或者能够隐含地转换为第一个操做数的类型。空接合运算符的计算以下:若是第一个操做数不是null,则整个表达式就等于第一个操做数的值。但若是第一个操做数是null,则整个表达式就等于第二个操做数的值。例如:
int?a=null; int b; b=a??10; // b的值为10; a=15; b=a??10;// b的值为15;
六、&和&&
&:二元运算符 (&) 为整型和 bool 类型预约义了二进制 & 运算符。对于整型,& 计算操做数的按位“与”。对于 bool 操做数,& 计算操做数的逻辑“与”;也就是说,当且仅当两个操做数均为 true 时,其结果才为 true。
&&:条件“与”运算符 (&&) 执行布尔操做数的逻辑“与”运算,但若有必要,只计算第二个操做数。它与二元运算符 (&)很像,不一样的是,若是 x 为 false,则不计算 y(由于不论 y 为什么值,与操做的结果都为 false)。这被称做为“短路”计算。
稍微提一下按位“与”:
运算规则:0&0=0; 0&1=0; 1&0=0; 1&1=1;
即:两位同时为“1”,结果才为“1”,不然为0
例如:3&5 即 0000 0011 & 0000 0101 = 0000 0001 所以,3&5的值得1。
5&7 即 0000 0101 & 0000 0111 = 0000 0101 所以,5&7的值得5。
七、移位运算符
是用<<(左移) 和 >>(右移) 运算符是用来执行移位运算。
左移 (<<)
将第一个操做数向左移动第二个操做数指定的位数,空出的位置补0。
左移至关于乘. 左移一位至关于乘2;左移两位至关于乘4;左移三位至关于乘8。
x<<1= x*2
x<<2= x*4
x<<3= x*8
x<<4= x*16
同理, 右移即相反:
右移 (>>)
将第一个操做数向右移动第二个操做数所指定的位数,空出的位置补0。
右移至关于整除. 右移一位至关于除以2;右移两位至关于除以4;右移三位至关于除以8。
x>>1= x/2
x>>2= x/4
x>>3= x/8
x>>4=x/16
当声明重载C#移位运算符(这个在第一节中也有一个重载符《+》http://www.cnblogs.com/aehyok/p/3499822.html)时,第一个操做数的类型必须老是包含运算符声明的类或结构,而且第二个操做数的类型必须老是 int,如:
class Program { static void Main(string[] args) { ShiftClass shift1 = new ShiftClass(5, 10); ShiftClass shift2 = shift1 << 2; ShiftClass shift3 = shift1 >> 2; Console.WriteLine("{0} << 2 结果是:{1}", shift1.valA, shift2.valA); Console.WriteLine("{0} << 2 结果是:{1}", shift1.valB, shift2.valB); Console.WriteLine("{0} >> 2 结果是:{1}", shift1.valA, shift3.valA); Console.WriteLine("{0} >> 2 结果是:{1}", shift1.valB, shift3.valB); Console.ReadLine(); } public class ShiftClass { public int valA; public int valB; public ShiftClass(int valA, int valB) { this.valA = valA; this.valB = valB; } public static ShiftClass operator <<(ShiftClass shift, int count) { int a = shift.valA << count; int b = shift.valB << count; return new ShiftClass(a, b); } public static ShiftClass operator >>(ShiftClass shift, int count) { int a = shift.valA >> count; int b = shift.valB >> count; return new ShiftClass(a, b); } } }
八、增量和减量运算符、条件运算符(三元运算符)
这个在第一节中也有提到过http://www.cnblogs.com/aehyok/p/3499822.html
九、命名空间别名限定符
假如你实现了下面的代码,想打印一下:
Console.WriteLine("Hello World");
接下来再看,咱们使用命名空间来进行访问:
你会发现这两种方式都没法实现了。那么能够经过以下方式进行调用
static void Main() { global::System.Console.WriteLine("Hello World"); }
global 是 C# 2.0
中新增的关键字,理论上说,若是代码写得好的话,根本不须要用到它。
就如上面的代码中写了一个类,名字叫 System。那么当你再在代码里写 System
的时候,编译器就不知道你是要指你写的 System 类仍是系统的 System 命名空间,而 System
命名空间已是根命名空间了,没法再经过彻底限名来指定。在之前的 C# 版本中,这就是一个没法解决的问题。如今,能够经过global::System 来表示 System 根命名空间,而用你本身的 MyNamespace.System
来表示本身的类。
接下来咱们再看一个小例子:
using colAlias = System.Collections; namespace System { class TestClass { static void Main() { // Searching the alias: colAlias::Hashtable test = new colAlias::Hashtable(); // Add items to the table. test.Add("A", "1"); test.Add("B", "2"); test.Add("C", "3"); foreach (string name in test.Keys) { // Seaching the gloabal namespace: global::System.Console.WriteLine(name + " " + test[name]); } } } }