C#学习笔记——(八)
一、运算符重载
- 重载运算符是具有特殊名称的函数,是通过关键字 operator 后跟运算符的符号来定义的。 与其他函数一样,重载运算符有返回类型和参数列表。
- 语法:
public ~ static ~ 返回值类型 ~ operator ~ 一元运算符 ~ (参数类型 ~ 参数名)
public ~ static ~ 返回值类型 ~ operator ~ 二元运算符 ~ (参数1类型 ~ 参数1名,参数2类型 ~ 参数2名)
1、可重载和不可重载运算符
using System;
namespace Day10
{
public class Fraction
{
private int num1;
private int num2;
public Fraction (int num1,int num2)
{
this.num1 = num1;
this.num2 = num2;
}
public static Fraction operator +(Fraction f1,Fraction f2)//重载+法
{
return new Fraction(f1.num1 + f2.num1, f1.num2 + f2.num2);
}
public static bool operator ==(Fraction f1,Fraction f2)
{
if (f1.num1 == f2.num1 && f1.num2 == f2.num2)
return true;
return false;
}
//委托给==
public static bool operator !=(Fraction f1,Fraction f2)
{
return !(f1 == f2);
}
//判断是否为同一类型,再执行委托
public override bool Equals(object obj)
{
if (!(obj is Fraction)) //检查对象运行时类型
return false;
return this == (Fraction)obj;//比较this == obj ,比较前先将obj强制转换为Fraction
}
public override string ToString()//复写Tostring
{
return String.Format("({0},{1})", num1, num2);
}
}
public class Tester
{
public void Run()
{
Fraction f1 = new Fraction(3, 4);
Console.WriteLine("f1:{0}",f1.ToString());
Fraction f2 = new Fraction(5, 6);
Console.WriteLine("f2:{0}",f2.ToString());
Fraction f3 = f1 + f2;
Console.WriteLine("f3:{0}",f3.ToString());
Fraction f4 = new Fraction(8, 10);
if(f1==f2)
Console.WriteLine("f1:{0}==f2:{1}",f1.ToString(),f2.ToString());
else
Console.WriteLine("f1:{0}!=f2:{1}", f1.ToString(), f2.ToString());
if(f4.Equals(f3))
Console.WriteLine("f4:{0}Equalsf3:{1}",f4.ToString(),f3.ToString());
}
}
class Program
{
static void Main(string[] args)
{
Tester t = new Tester();
t.Run();
}
}
}
注意:
1、如果重载了等于(==)运算符,那么也必须重载不等(!=)运算符,类似地有小于(<)和大于(>)必须成对,小于等于(<=)和大于等于(>=)必须成对。
2、如果重载了等于运算符,那么建议也要重载Equals()方法。
3、比较运算符必须返回bool类型的值,这是与其他算术运算符的根本区别。
4、运算符只能采用值参数,不能采用ref 或out 参数。
2、转换运算符
- implicit 和 explicit通常叫作转换运算符,当转换能够成功并且不会发生信息丢失时,使用关键字implicit;如果存在丢失信息的风险,则需要使用关键字explicit。
- 语法:
public ~ static ~ implicit ~ operator ~ 转换运算符的目标类型 ~ (参数输入类型 ~ 参数名)
public