C# 运算符重载篇

运算符重载的关键是在对象上不能总是只调用方法或属性, 有时还需要做一些其他工作,例如对数值进行相加,相乘或逻辑(比较对象)等。 

假定已经定义了一个表示数学矩阵类。 在数学领域中,矩阵可以相加和相乘, 就像数字一样。所以可以编写下面的代码:

Matrix a,b,c;

Matrix d = c * ( a + b );

通过运算符重载,就可以告诉编译器 " + "  和  " * " 对Matrix对象执行什么操作, 以便编写类似于上面的代码。 如果用不支持运算符重载的语言编写代码,就必须定义一个方法, 以执行这些操作。但结果肯定是不太直观的,可能如下:

Matrix d = c.Multiply( a.Add(b) );

 学习到现在可以知道, 像  " + "  和  " * " 这样的运算符只能用于预定义的数据类型, 例如它知道如何把两个 long 数据加起来, 或者如何对两个 double 数据执行相除操作, 并且可以生成合适的中间语言代码。

但在定义自己的类或结构时, 必须告诉编译器, 什么方法可以调用,每个实例存储了什么字段等所有信息。同样,如果要对自定义的类使用运算符,就必须告诉编译器相关的运算符在这个类的上下文中的含义,此时就要定义运算符的重载。

要强调的另一个问题是重载不仅仅限于算术运算符。 还要考虑比较运算符 如 ==, != , >= 等等。。。。 例如,考虑语句 if(a==b)  对于类,这条语句默认状态下会比较引用。 检测两个引用是否指向内存的同一个地址, 而不是检测他们是否包含相同的数据。 对于string类, 这种行为就会重写, 于是比较字符串实际上就是比较每个字符的内容。 对于结构, == 运算符在默认状态下不工作,试图比较两个结构看看他们是否相等,就会产生一个错误, 除非显示的重载了 == 告诉编译器如何进行比较。

 

小提示: 想要吃透运算符重载的具体工作流程和使用,靠这一篇文章还是不够的,后面会分出好几个章节来进行详细的讲解

 

你可能感兴趣的:(c#)