《C#高级编程》【第7章】运算符与类型强制转换

 运算符编程语言的基本元素,它使得我们的代码更加的简洁明了。然而我们为了解决操作数类型不同的问题,我们又有引入了强制转换的概念。我们先看看本章的内容构成吧。

1、运算符 我们来看看一些常见的运算符:<1>条件运算符 其语法如下:

Condition ? true_Expression : false_Expression

当条件Condition为真时,其将执行true_Expression,否则执行false_Expression。<2> checked 和 unchecked运算符 使用语法如下:

checked{//代码块}

使用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的可空类型为例:

int? a = null;int b = a ?? 10;//这时b就等于10a = 3;b = a ?? 10;//这时b就等于3

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); 相信通过这个例子大家应该都了解了运算符重载的好处了吧。 现在我们来看看运算符重载的语法吧:

//参数列表中的参数个数,取决于重载的运算符是几元运算符public static [返回的类型] operator [重载的运算符] (参数列表){//processing}

知道了重载的语法我们现在来实战一下:

//我们以向量vector类为例,假设它有三个整型字段x, y, z, 定义向量加法public static vector operator + (vector lhs, vector rhs){vector ans = new vector();ans.x = lhs.x + rhs.x;ans.y = lhs.y + rhs.y;ans.z = lhs.z + rhs.z;return ans;}

这时我们就完成了vector类的+运算符的重载,现在我们就可以直接使用+进行加法运算。同时编译器还自动完成了+=的重载。 还有两个运算符我们不能直接重载,分别是索引运算符和强制转换运算符。 我们先看看索引运算符的重载吧,语法如下:

[访问属性] [返回类型] this[int index]{get { //添加返回第index个元素的代码 }set{ //设置第index个元素的值 }}己欲立先立人,已欲达先达人。

《C#高级编程》【第7章】运算符与类型强制转换

相关文章:

你感兴趣的文章:

标签云: