五、运算符和类型转换
1、运算符
C#支持的运算符其中4个(sizeof、*、->、&)只能用于不安全代码(绕过C#类型安全性的检查)。
三元运算符(?:)
checked和unchecked运算符:CLR执行溢出检查,如果发生溢出,就抛出异常。
is运算符:检查对象是否与特定的类型兼容(表示对象是该类型,或者派生于该类型)。
as运算符:用于执行引用类型的显示类型转换。
sizeof运算符:确定堆栈中值类型需要的长度(单位是字节)。
typeof运算符:返回一个表示特定类型的System.Type对象。(常用于反射动态查找对象的信息)
可空类型和运算符:程序中使用可空类型,必须考虑null值在与各种运算符一起使用时的影响。通常可空类型与一元或二元运算符一起使用时,如果其中一个操作数或两个操作数都是null,其结果就是null.
空接合运算符(??):为处理可空类型和引用类型时表时Null值的可能性提供一种快捷方式。
运算符的优先级:
组 运算符
初级运算符 ()、[]、x++、x--、new、typeof、sizeof、checked、unchecked
一元运算符 +、-、!、~、++x、--x、数据类型转换
乘除运算符 *、/、%
加减运算符 +、-
移位运算符 << >>
关系运算符 < > <= >= is as
比较运算符 == !==
按位AND运算符 &
按XOR运算符 |
按OR运算符 ^
布尔AND运算符 &&
布尔OR运算符 ||
三元运算符 ?:
赋值运算符 = += -= *= /= %= &= |= ^= <<= >>= >>>=
2、类型的安全性
类型转换:隐式转换,显式转换
装箱和拆箱:装箱是值类型转换为引用类型,拆箱是引用类型转换为值类型。
3、对象的相等比较
引用类型的相等比较:ReferenceEquals()方法、虚拟的Equals()方法、静态的Equals()方法、比较运算符==
值类型的相等比较:Equals()对值类型进行合适的相等测试,如果值类型包含作为字段的引用类型,就需要重写Equals(),以便为这些字段提供合适的语义,因为Equals的默认版本仅比较它们的地址。
4、运算符重载
重载运算符允许生成可读性更高、更直观的代码,包括:
在数学领域中,几乎包括所有的数学对象:坐标、矢量、矩阵、张量和函数等。如果编写一个程序执行数学或物理建模,肯定会用类表示这些对象。
图形程序在计算屏幕上的位置时,也使用数学或相关的坐标对象。
表示大量金钱的类(例如,在财务程序中)
字处理或文本分析程序也有表示语句、子句等的类,可以使用运算符把语句连接在一起(这是字符串连接的一种比较复杂的版本)
C#要求所有的运算符重载都声明为public和static,这表示它们和它们的类或结构相关联,而不是与实例相关联,所以运算符重载的代码体不能访问非静态类成员,也不能访问this标识符.
添加更多运算符
C#不允许重载=运算符,但如果重载+运算符,编译器会自动使用+运算符的重载来执行+=运算符的操作。-=、&=、*=、/=赋值运算符也遵循此规则。
比较运算符
重载==和!=时,还应重载System.Object中继承的Equals()和GetHashCode()方法,否则会产生一个编译警告。原因是Equals()方法应执行与==运算符相同的相等逻辑。
5、用户定义的数据类型转换
类之间的数据类型转换:两个限制:
如果某个类直接或间接继承了另一个类,就不能在这两个类之间进行类型转换(这些类型的类型转换已经存在)。
数据类型转换必须在源或目标数据类型定义的内部定义。