四、操作符重载方法
要想实现操作符重载,只需要保证以下两点,其他的话都是浮云:
操作符重载方法必须是public和static方法
操作符重载方法至少有一个参数的类型与当前定义这个方法的类型相同。之所以是要这个条件是为了使编译器在合理的时间内找到要绑定的操作方法,实例如下
public class Complex
{
public int data;
public Complex(int data)
{ this.data = data;
}
public static Complex operator +(Complex c1, Complex c2)
{
return new Complex(c1.data+c2.data);
}
public void Test()
{
Complex c1 = new Complex(1);
Complex c2 = new Complex(2);
Complex c3 = c1 + c2;
Console.WriteLine(c3.data);//输出3
}
}
{
public int data;
public Complex(int data)
{ this.data = data;
}
public static Complex operator +(Complex c1, Complex c2)
{
return new Complex(c1.data+c2.data);
}
public void Test()
{
Complex c1 = new Complex(1);
Complex c2 = new Complex(2);
Complex c3 = c1 + c2;
Console.WriteLine(c3.data);//输出3
}
}
五、转换操作符方法
要实现转换操作符方法,条件和操作符重载方法的条件是一样的,实例如下:
public class Rational
{
public Rational(int data)
{
this.data = data;
}
public Rational(char data)
{
this.data = (int)data;
}
//隐式类型转换:int->Rational
{
public Rational(int data)
{
this.data = data;
}
public Rational(char data)
{
this.data = (int)data;
}
//隐式类型转换:int->Rational
public static implicit operator Rational(int data)
{
return new Rational(data);
}
//隐式类型转换:char->Rational
{
return new Rational(data);
}
//隐式类型转换:char->Rational
public static implicit operator Rational(char data)
{
return new Rational(data);
}
//显示类型转换 Rational->int
{
return new Rational(data);
}
//显示类型转换 Rational->int
public static explicit operator int(Rational val)
{
return val.data;
} //显示类型转换 Rational->char
public static explicit operator char(Rational val)
{
return Convert.ToChar(val.data);
}
public void Test()
{
Rational r1 = 1;//将int类型隐式转换成Rational
Rational r2 = '2';//将char类型隐式转换成Rational
int i = (int)r1;//将Rational类型显示转换成int
char c = (char)r2;//将Rational类型显示转换成char
Console.WriteLine("i=" + i);//输出:i=1
Console.WriteLine("c=" + c);//输出:c=2
}
int data;
}
{
return val.data;
} //显示类型转换 Rational->char
public static explicit operator char(Rational val)
{
return Convert.ToChar(val.data);
}
public void Test()
{
Rational r1 = 1;//将int类型隐式转换成Rational
Rational r2 = '2';//将char类型隐式转换成Rational
int i = (int)r1;//将Rational类型显示转换成int
char c = (char)r2;//将Rational类型显示转换成char
Console.WriteLine("i=" + i);//输出:i=1
Console.WriteLine("c=" + c);//输出:c=2
}
int data;
}
隐式和显示类型转换的实现原理就这么简单,在C++中隐式类型转换根本不需要你写代码,只要有相应的public构造函数就可以了,如int转换成Rational,只需要有构造函数public Rational(int data)就可以了,如Rational r=1;编译器会尽一切努力寻找将int类型转换成Rational的方法,当它发现这个构造函数,他说都不说就帮你进行转换了,就因为这样有时候非常坑爹,你一个int类型无缘无故的就变成Rational了,而你却根本不知道怎么回事,有时候为了解决这个问题,还得自己定义一个类(Uint)来封装int,然后构造函数改成Rational(Uint data),C#就没有这个问题,当然你要想实现隐式类型转换就自己写代码吧。
六、扩展方法
实现扩展方法的条件:
①定义扩展方法的类必须是非泛型静态类
②这个类必须有自己的作用域,即不能是内部类
③方法必须是public和static
④方法的第一个参数必须用this修饰,第一个参数就是你要扩展的类型,实例如下:
public static class StringExtensions
{
public static int ToInt(this string s)
{
return Convert.ToInt32(s);
}
public void Test()
{
string s = "2";
Console.WriteLine(s.ToInt());
}
}
{
public static int ToInt(this string s)
{
return Convert.ToInt32(s);
}
public void Test()
{
string s = "2";
Console.WriteLine(s.ToInt());
}
}
七、部分方法
这一部分就不多说了。