《C#高级编程》【第7章】运算符与类型强制转换
运算符编程语言的基本元素,它使得我们的代码更加的简洁明了。然而我们为了解决操作数类型不同的问题,我们又有引入了强制转换的概念。我们先看看本章的内容构成吧。
1、运算符
我们来看看一些常见的运算符:
<1>条件运算符
其语法如下:
当条件Condition为真时,其将执行true_Expression,否则执行false_Expression。
<2> checked 和 unchecked运算符
使用语法如下:
使用checked运算符可以检查被标记的代码块中是否有溢出。如果发生溢出,则抛出OverflowException异常。如果我们要禁止溢出检查,则使用unchecked运算符。
注意:unchecked是默认行为。如果没有被显式的标记为checked,则都默认是unchecked。
<3> is 运算符
is 运算符可以检查对象是否与特定类型兼容。例如,我们有两个对象A和B。如果A和B兼容,那么表达式A is B将为true,否则就为false。兼容表示的是,A和B是同一类型或者它们之间具有派生关系。
<4> as 运算符
as 运算符用于执行引用类型的显式转换。如果与要转换的类型兼容,转换就会成功进行,否则as运算符就会返回null值。
<5> sizeof 运算符
sizeof运算符可以确定栈中值类型的长度(单位:字节)。如果对非基本类型使用sizeof运算符,就需要把代码放入unsafe块中。
<6>typeof运算符
typeof运算符可以返回一个特定类型的System.Type对象。例如,typeof(string)返回表示System.String类型的Type对象。
<7>可空类型和运算符
通常可空类型使用一元或二元运算符,只要有一个操作数为null,那么结果就为null。在比较可空类型时,只要有一个操作数为null那么比较结果就是false。所以不能因为一个条件是false其对立面就是true。
<8>空合并运算符(??)
空合并运算符(??)为可空类型转换为非空类型提供了便利。我们以int的可空类型为例:
2、比较对象的相等性
根据比较机制的不同,我们可以分为引用类型的比较和值类型的比较:
<1>比较引用类型的相等性
System.Object提供了4种方式来比较对象的相等性。
①ReferenceEquals()方法
ReferenceEquals()方法是一个静态方法,用于测试两个引用是否为同一个实例。作为静态方法,所以它不能被重写。
②虚拟的Equals()方法
虚拟的Equals()方法,这它默认的比较引用。不过因为它是虚拟的方法,所以我们可以重写它,使它按值来比较对象。
③静态的Equals()方法
Equals()的静态版本与虚拟版本的功能一致,区别:静态版本带有两个参数,可以处理两个对象中有一个是null的方法。但是如果比较两个引用,它就相当于调用Equals()的虚拟版本,即相当于重写了静态的Equals()方法
④比较运算符(==)
通常引用类型使用比较运算符(没有重载前)都是比较引用(System.String除外,因为.Net对String重写了比较运算符)。
<2>比较值类型的相等性
在比较值类型的相等性时,与引用类型相同:ReferenceEquals()用于比较引用,Equals用于比较值,对于基本类型==则是比较值,,然而结构需要重载==运算符才可以进行比较。
注意:ReferenceEquals()方法引用于值类型时,它总是false。因为调用这个方法,值类型需要被装箱到对象中,故不会得到相同的引用。
3、运算符重载
在很多时候,我们使用运算符来表示一个表达式,会使我们的程序变得更加简洁易懂,另一方面运算符的重载还可以提升我们的开发效率。假设我们定义了一个矩阵类Matrix的对象a, b, c。假设我们来表达 c = a + b,用方法来表达的话可能是这样 c = Matrix.Add(a, b); 相信通过这个例子大家应该都了解了运算符重载的好处了吧。
现在我们来看看运算符重载的语法吧:
温馨提示: 本文由Jm博客推荐,转载请保留链接: https://www.jmwww.net/file/70640.html