首先说明操作符重载不是CLR的特性,或者说CLR对此一无所知,它由各自的语言来规范。
写这个主要是因为一个特殊的类令我对称产生了好奇,这个类就是String。
String是应用类型,但是很多特性取和值类型一样,这导致了很多的语言初学者对String类又爱又恨,爱其提供的方便操作,很其不安套路出牌,拿最常见的==和equals()来说,我们明明知道==用于比较两个对象是否相等,对象相等涉及到判引用类型是否相等,其次是对hashcode值的比较,再次那就是每个字段值的比较。但是,我们发现对于一个string的变量,用==和equals结果都一样!我的天,这是逆天的节奏。
其实不然,今天我们就来解释这个问题, 这个就是操作符的重装。如果知道了他的使用,编程对你来说将会增添新的乐趣。
这里只简单说明其实现,关于更深层次的东西,请君一步MSDN。
前面说了CLR对操作符重装是一无所知的,那么编程语言比较有个标识来说明这是一个操作符重载,或者说要告诉编译器我该怎样处理你这个语句吧,所以CLR给出一个规范,操作符重载必须是public和static方法,这个很容易理解,第一,操作符重装的目的即是为了对该类的实例进行操作,那么你就应该在实例对象构建之前就已加载,所以必须是static。第二,提供操作符重装当然是为了告诉调用者自己多操作符进行的操作,你弄成了private不是自娱自乐吗?基于两点好理解了吧。第三,这点不是CLR说的,这个是C#语言自己的一个标识符operator表示操作符关键字,然后该操作符后接上你要重装的操作符,好,看示例代码吧。示例代码无实际意义。
class OperatorOverried
{
private string id=string.Empty;
public string Id
{
get { return id; }
set { id = value; }
}
//对象的相等有id来确定
public override bool Equals(object obj)
{
OperatorOverried overried= (obj as OperatorOverried);
if (overried != null)
return overried.GetHashCode()==this.GetHashCode();
return false;
}
//获得id的hashcode,只要id一样,hashcode就一样
public override int GetHashCode()
{
return this.id.GetHashCode();
}
//重装+
public static string operator +(OperatorOverried overried1,OperatorOverried overried2)
{
return overried1.id.ToString() + overried2.id.ToString();
}
//重装==
public static bool operator ==(OperatorOverried overried1, OperatorOverried overried2)
{
return overried1.GetHashCode().Equals(overried2.GetHashCode());
}
//重装!=
public static bool operator !=(OperatorOverried overried1, OperatorOverried overried2)
{
return !(overried1 == overried2);
}
}
调用代码:
OperatorOverried objOne=new OperatorOverried(); objOne.Id = "Oversky";
OperatorOverried objTwo=new OperatorOverried();
objTwo.Id = "Oversky";
Console.WriteLine(objOne==objTwo);
Console.WriteLine(objOne+objTwo);
objOne = new OperatorOverried();
objOne.Id = "Oversky";
objTwo = new OperatorOverried();
objTwo.Id = "kxl";
Console.WriteLine(objOne == objTwo);
Console.WriteLine(objOne + objTwo);
有图有真相:

操作符的重装方法的参数必须是提供改写操作符类本身对应的对象,原因很简单,不说也罢。
这里告诉大家一个有趣的事,成对匹配的操作符,改写其中一个必须改写另一个,不行你试试看,改写了==编译器一定会提示你改写!=,微软的这种设计很棒,个人觉得,这其实在避免粗心的程序员忘记对同一类操作用不同的算法或者予以不同的实现。
本文出自 “碧雪青天” 博客,请务必保留此出处http://oversky.blog.51cto.com/1026601/1381292
浅谈操作符的重载,布布扣,bubuko.com
浅谈操作符的重载
原文:http://oversky.blog.51cto.com/1026601/1381292