每种语言都会提供一定量的操作符,C#也不例外。
我们知道,C#提供的这些操作符只能用于系统预定义的数据类型。
其实,我们通过操作符重载可以使这些操作符作用于我们自己定义的类或者结构。
下面将以一个向量结构体作为实例来演示操作符重载的使用方法。
首先给出代码,如下:
struct Vector
{
public float x,y;
//重写ToString(),用于查看向量内容
public override string ToString()
{
return "("+x+","+y+")";
}
//构造函数
public Vector(float x, float y)
{
this.x = x;
this.y = y;
}
//向量的加法
public static Vector operator + (Vector a, Vector b)
{
Vector result = new Vector(0,0);
result.x = a.x + b.x;
result.y = a.y + b.y;
return result;
}
//向量的减法
public static Vector operator - (Vector a, Vector b)
{
Vector result = new Vector(0, 0);
result.x = a.x - b.x;
result.y = a.y - b.y;
return result;
}
//数乘向量
public static Vector operator * (float lambda, Vector a)
{
Vector result = new Vector(0, 0);
result.x = lambda * a.x;
result.y = lambda * a.y;
return result;
}
//向量的数量积
public static float operator * (Vector a, Vector b)
{
return a.x * b.x + a.y * b.y;
}
}
static void Main(string[] args)
{
Vector a = new Vector(1, 2);
Vector b = new Vector(3, 4);
//保存向量和,差,数乘结果
Vector sum, gap, multiVector;
//保存向量数量积
float multiNum;
sum = a + b;
Console.WriteLine("sum=" + sum.ToString());
gap = a - b;
Console.WriteLine("gap=" + gap.ToString());
multiVector = 3 * a;
Console.WriteLine("multiVector=" + multiVector.ToString());
multiNum = a * b;
Console.WriteLine("multiNum=" + multiNum.ToString());
}
该实例中,定义了结构体Vector,该结构体包含成员字段x/y,构造函数及一个ToString()重写方法。并通过操作符重载实现了向量的加法,减法,数乘,数量积运算。通过阅读代码发现,操作符重载的声明方式与方法的声明方式相同,只是使用了operator 关键字,通过operator 关键字可以告诉编译器此处为一个操作符重载,后面是相关操作的符号,在本例中使用了+,-,*。另外,C#要求所有的操作符重载都声明为public和static,表示他们与类和结构体有关,不与类或结构体的实体相关。
在Main函数中演示了操作符重载的使用,跟运算符使用于系统类型的方法相同。
最后给出结果,如下:
一切如你所料。