第六章 运算符和类型强制转换
1,运算符
类别 | 运算符 |
算术运算符 | + - * / % |
逻辑运算符 | & | ^ ~ && || ! |
字符串连接运算符 | + |
增量和减量运算符 | ++ -- |
移位运算符 | << >> |
比较运算符 | == != <> <= >= |
赋值运算符 | = += -= *= /= %= &= |= ^= <<= >>= |
成员访问运算符 | . |
索引运算符 | [] |
数据类型转换运算符 | () |
条件运算符 | ?: |
委托连接和删除运算符 | + - |
对象创建运算符 | new |
类型信息运算符 | sizeof(只限于不安全代码)is typeof as |
间接寻址运算符 | * -> &(只用于不安全的代码)[] |
命名空间别名限定符 | :: |
空结合运算符 | ?? |
?
sizeof在.Net Framework后不存在了。
?
checked和unchecked运算符
checked:标识溢出检查,添加编译选项/checked,对所有代码执行溢出检查
unchecked:对标识checked的代码段取消溢出检查。
checked { ????statements; } |
unchecked { ????statements; } |
?
is运算符
检查对象是否与特定的类型兼容。"兼容"表示对象是该类型,或者派生于该类型。若兼容,为true,不兼容,false。
?
as运算符
用于执行引用类型的显式类型转换。如果转换的类型与指定的类型兼容,转换成功,不兼容,返回false。
?
sizeof运算符
unsafe { ????Console.WriteLine(sizeof(int).ToString()); } |
?
typeof运算符
返回一个特定类型的System.Type对象
?
可空类型和运算符
可以将值指定为null。
int? a = null;
在比较可空类型时,只要有一个操作数为null,结果就为false。
?
空结合运算符??
提供一种快捷方式,可以在处理可空类型和引用类型时表示null值。
这个运算符放在两个操作数之间,第一个操作数必须是一个可空类型或者引用类型,第二个操作数必须与第一个操作数的类型相同,或者可以隐式转换为一个操作数的类型。
空结合运算符的计算如下:如果第一个操作数不是null,则整个表达式就等于第一个操作数的值。如果第一个操作数的值为null,则表达式的值为第二个操作数的值。
?
运算符的优先级(从高到低)
组 | 运算符 |
初级运算符 | () . [] x++ x-- new typeof sizeof checked unchecked |
一元运算符 | + - ! ~ ++x --x和数据类型转换 |
乘/除运算符 | / * % |
加减运算 | + - |
移位运算符 | << >> |
关系运算符 | < > <= >= is as |
比较运算符 | == != |
按位与 | & |
按位异或 | ^ |
按位或 | | |
逻辑与 | && |
逻辑或 | || |
条件运算符 | ?: |
赋值运算符 | = += -= *= /= %= &= |= ^= <<= >>= >>>= |
?
2,对象相等的比较
Object的静态成员ReferenceEquals,测试两个引用是否指向类的同一个实例
虚拟的Equals:按值来比较
静态的Equals:可以处理null的情况
比较运算符==:对值比较值,对引用比较是否指向同一个对象。可重写,执行和Equals相同的逻辑。
调用ReferenceEquals来比较值类型肯定返回false,因为为了调用这个方法,值类型总是需要装箱。
?
3,运算符重载
public class Vector { private double x = 0; private double y = 0; private double z = 0; ? public Vector(double x, double y, double z) { this.x = x; this.y = y; this.z = z; } ? public Vector(Vector rhs) { x = rhs.x; y = rhs.y; z = rhs.z; } ? public static Vector operator + (Vector lhs, Vector rhs) { Vector result = new Vector(lhs); result.x += rhs.x; result.y += rhs.y; result.z += rhs.z; ? return result; } } |
C#要求把所有的运算符重载都声明为public和static。不能使用this,不能访问实例成员。
编译器处理运算符重载和处理方法重载的方式是一样的,所以,对于运算符两侧类型不同的,需要定义两个不同的运算符重载函数。
C#不允许重载=,但是在用户重载+-*/&/后,会自动重载相应的+=。。版本。
?
比较运算符的重载
比较运算符分为三对:
==和!=
>和<
>= 和 <=
C#要求成对重载比较运算符,比较运算符必须返回bool型变量。
?
可以重载的运算符
类别 | 运算符 | 限制 |
算术二元 | +*、-% | ? |
算术一元 | + - ++ -- | ? |
按位二元运算符 | & | % ^ << >> | ? |
按位一元运算符 | ! ~ true false | true和false运算符必须成对重载 |
比较运算符 | == != >= < <= > | 必须成对重载 |
赋值运算符 | += - = *= /= >>= <<= %= &= |= ^= | 不能显式地重载,重载单个时,会隐式重载 |
索引运算符 | [] | 不能直接重载索引运算符。索引器成员可以 |
数据类型转换运算符 | () | 不能直接重载,用户定义的数据类型允许定义定制的数据类型转换 |
?
4,用户定义的数据类型转换
public static implicit operator float (Currency value) { ????statements; } |
上述代码声明了一个隐式类型转换。
也可使用explicit声明一个显式类型转换
?
类型之间的数据转换
限制
数据类型转换应该定义在类型内部,且源代码均可编辑,防止把第三方数据类型引入类中。
原文:http://www.cnblogs.com/xyb930826/p/5289911.html