运算符重载
所谓的运算符重载是指允许用户使用用户定义的类型编写表达式的能力.
例如,通常需要编写类似与以下内容的代码,入江两个数字相加,很明显,sum是两个数字之和.
int i=5,j=4;
int sum = i+j;
如果可以使用代表附属的用户定义的类型来编写相同类型的表达式,那当然是最好不过的了:
Complex i=5;
Complex sum=i+j;
运算符重载允许为用户定义的类型重载(即指明明确的含义)诸如”+”这样的运算符.如果不进行重载,则用户需要编写以下代码:
Complex i= new Complex();
Complex j= new Complex();
Complex sum=Complex.Add(i,j);
这样的代码可以很好的运行,但Complex类型并不能像语言中的预定义类型那样发挥作用.
在我看来所谓的运算符重载就是让struct,class,Interface等能够进行运算.
实现C#操作符重载
先写关键字public和static,后跟返回类型,后跟operator关键字,后跟要声明的操作符符号,最后在对一对圆括号中添加恰当的参数.
C#操作符重载方法
1.编写操作符重载方法
2.实例化后,进行操作符运算
案例:
struct Hour
{
//定义一个属性,便于取得value值
private int value;
public int Value
{
get { return this.value; }
set { this.value = value; }
}
//该构造函数很据int值创建Hour类,C#操作符重载
public Hour(int value)
{
this.value = value;
}
//声明一个二元操作符,将两个Hour类加到一起
public static Hour operator +(Hour lhs, Hour rhs)
{
return new Hour(lhs.value + rhs.value);
}
//将一个int类型的值和一个Hour类相加
public static Hour operator +(Hour lhs, int rhs)
{
return lhs + new Hour(rhs);
}
public static Hour operator +(int lhs, Hour rhs)
{
return new Hour(lhs) + rhs;
}
}
分析:操作符是public的,搜有的操作符必须都是public的.
操作符是static的.所有的操作符都必须是static的,操作符永远不具有多态性.
而且不能使用virtual,abstract,override或者sealed修饰符.
二元操作符(比如+)有两个显示参数;以元操作符有一个显式的参数.我们有了public Hour(int value)构造函数,就可以将一个int与Hour相加,只是首先要将int转换为Hour
int a;
Hour b=new Hour(b);
Hour sum=new Hour(a);
虽然上述代码完全有效,但相较于让一个Hour和一个int直接相加它即不清晰也不准确.
为了使Hour可以+int,必须声明一个二元操作符+,他的第一个参数是Hour,第二个参数是一个int.
编写测试代码:
class Program
{
static void Main(string[] args)
{
Hour h = new Hour(10);
Hour sum = h + 10;
Console.WriteLine(sum.Value);
Console.ReadKey();
}
}
案例2:
struct Hour
{
//定义一个属性,便于取得value值
private int value;
public int Value
{
get { return this.value; }
set { this.value = value; }
}
//该构造函数很据int值创建Hour类,C#操作符重载
public Hour(int value)
{
this.value = value;
}
//声明一个二元操作符,将两个Hour类加到一起
public static Hour operator +(Hour lhs, Hour rhs)
{
return new Hour(lhs.value + rhs.value);
}
//将一个int类型的值和一个Hour类相加
public static Hour operator +(Hour lhs, int rhs)
{
return lhs + new Hour(rhs);
}
public static Hour operator +(int lhs, Hour rhs)
{
return new Hour(lhs) + rhs;
}
//定义操作符重载(一元操作符),++操作符有前缀和后缀两种形式,C#能智能的为前缀和后缀使用同一个操作符.
public static Hour operator ++(Hour hValue)
{
hValue.value++;
return hValue;
}
//==是而元操作符,必须带有两个参数
public static bool operator ==(Hour lhs, Hour rhs)
{
return lhs.value == rhs.value;
}
public static bool operator != (Hour lhs, Hour rhs)
{
return lhs.value != rhs.value;
}
}
但是不是所有的操作符都能被重载,下列运算符不能被重载:[]索引运算符不能被重载,但可以定义索引器;(T)x不能重载转换 运算符,但可以定义新的转换运算符;=(赋值运算符)不能被重载.
=, ., ?:, ??, ->, =>, f(x), as,checked, unchecked, default,delegate, is, new, sizeof, typeof这些运算符不能被重载.
说明,比较运算符(如果重载)必须成对重载;也就是说,如果重载==,也必须重载!=.反之亦然,<和>UI及<=和>=同样如此.
若要在 自定义类中重载运算符,需要在该类中创建具有正确签名的方法,该方法必须命名为”operator X”,其中X是正在重载的运算符的名称或符号.一元运算符具有一个参数,二元运算符具有两个参数.在每种情况下,参数的类型必须与声明该运算符的类或结构的类型相同,如下:
public static Complex operator + (Complex c1,Complex c2)