---------------------- Windows Phone 7手机开发、.Net培训、期待与您交流! ----------------------
运算符的重载是C#中一个重要的功能,使得实际操作带来巨大直观易懂的便利。
像+和*这样的运算符只能用于预定义的数据类,原因很简单:编译器认为所有常见的运算符都是用于这些数据类型;例如,它知道如何让把两个long类型数据加起来,或如何从一个double减去另一个double,并生成合适的中间语言代码。但是定义自己的类或结构时,必须告诉编译器:什么方法可以调用,每个实例存储了什么字段等所有的信息;同样,如果要在自己的类上使用运算符,就必须告诉编译器相关的运算符在这个类中的含义。此时就要定义运算符重载。
代码及例子:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace operator运算符重载
{
class Program
{
static void Main(string[] args)
{
Struct st1, st2, st3, st4, st5, st6, st7;
st1 = new Struct(2.5, 3.6, 8.25);
st2 = new Struct(50.1, 36.2, 10);
st3 = st1 + st2; //如果没有写运算符重载,编译器遇到+ - * / %就会报错
st4 = st2 - st1;
int a = 10;
st5 = a * st1;
//st5 = st1 * a; //调用的顺序要和定义运算符重载要一致,否则编译报错
st6 = a / st5;
long l1 = 500;
st7 = l1 % st2;
Console.WriteLine(st3.ToString());
Console.WriteLine(st4.ToString());
Console.WriteLine(st5.ToString());
Console.WriteLine(st6.ToString());
Console.WriteLine(st7.ToString());
//Console.WriteLine(st5 == st6);
Class1 c1, c2, c3;
c1 = new Class1(st1, a * 2);
c2 = new Class1(st2, a * 3);
c3 = c1 + c2;
Console.WriteLine("{0}---{1}", c3.Str, c3.Age);
Console.ReadKey();
}
}
#region 结构的运算符重载
struct Struct //定义结构类型
{
private double x;
private double y;
private double z;
public Struct(double x, double y, double z)
{
this.x = x;
this.y = y;
this.z = z;
}
public override string ToString()
{
return string.Format("(x={0},y={1},z={2})", this.x, this.y, this.z);
}
public static Struct operator +(Struct lst, Struct rst) //必须是static及访问级别为 public的
{
return new Struct(lst.x + rst.x, lst.y + rst.y, lst.z + rst.z);
}
public static Struct operator *(double rb, Struct lst) //可以一个预定义类型和一个结构类型
{
return new Struct(lst.x * rb, lst.y * rb, lst.z * rb);
}
public static Struct operator *(Struct ls, Struct rs)
{
return new Struct(ls.x + rs.x, ls.y * rs.y, ls.z / rs.z);
}
public static Struct operator -(Struct lst, Struct rst)
{
return new Struct(rst.x * lst.x, lst.y - rst.y, rst.z + lst.z);
}
public static Struct operator /(int a, Struct b)
{
return new Struct(a * b.x, b.y / a, a + b.z);
}
public static Struct operator %(long ll, Struct a)
{
return new Struct(ll * a.x, ll + a.y, a.z * ll);
}
//>、<、>=、<=、==、!= 比较重载返回的是bool类型且要成对的重载
/*不要通过调用从System.Object中继承的Equals()方法的实例版本来重载比较运算符,如果这么做,在objA是null时,
*计算(objA==objB),就会产生一个异常,因为.NET运行库会试图计算null.Equals(objB).采用其他
*方法(重写Equals()方法,调用比较运算符)比较安全
*/
//public static bool operator ==(Struct lst, Struct rst)
//{
// return Equals(lst.x, rst.x);
//}
//public static bool operator !=(Struct lst, Struct rst)
//{
// return !Equals(lst.z, rst.z);
//}
}
#endregion
#region 类的运算符重载
class Class1
{
public Struct Str { set; get; } //把结构类型嵌套到类中
private int age;
public int Age
{
set
{
if (value >= 0 && value <= 120)
{
age = value;
}
else
{
throw new Exception("输入的年龄有误!");
}
}
get
{
return age;
}
}
public Class1(Struct s1, int i)
{
this.Str = s1;
this.Age = i;
}
//其他的- * / %差不多都是这样写,主要注意调用时一定要匹配类型及参数
public static Class1 operator +(Class1 lc, Class1 rc)
{
return new Class1(lc.Str * rc.Str, rc.Age + lc.Age);
}
}
#endregion
}
---------------------- Windows Phone 7手机开发、.Net培训、期待与您交流! ----------------------