详细分析c# 运算符重载
您可以重定义或重载C#中内置的运算符。因此,程序员也可以使用用户自定义类型的运算符。重载运算符是具有特殊名称的函数,是通过关键字operator后跟运算符的符号来定义的。与其他函数一样,重载运算符有返回类型和参数列表。
例如,请看下面的函数:
publicstaticBoxoperator+(Boxb,Boxc) { Boxbox=newBox(); box.length=b.length+c.length; box.breadth=b.breadth+c.breadth; box.height=b.height+c.height; returnbox; }
上面的函数为用户自定义的类Box实现了加法运算符(+)。它把两个Box对象的属性相加,并返回相加后的Box对象。
运算符重载的实现
下面的程序演示了完整的实现:
usingSystem; namespaceOperatorOvlApplication { classBox { privatedoublelength;//长度 privatedoublebreadth;//宽度 privatedoubleheight;//高度 publicdoublegetVolume() { returnlength*breadth*height; } publicvoidsetLength(doublelen) { length=len; } publicvoidsetBreadth(doublebre) { breadth=bre; } publicvoidsetHeight(doublehei) { height=hei; } //重载+运算符来把两个Box对象相加 publicstaticBoxoperator+(Boxb,Boxc) { Boxbox=newBox(); box.length=b.length+c.length; box.breadth=b.breadth+c.breadth; box.height=b.height+c.height; returnbox; } } classTester { staticvoidMain(string[]args) { BoxBox1=newBox();//声明Box1,类型为Box BoxBox2=newBox();//声明Box2,类型为Box BoxBox3=newBox();//声明Box3,类型为Box doublevolume=0.0;//体积 //Box1详述 Box1.setLength(6.0); Box1.setBreadth(7.0); Box1.setHeight(5.0); //Box2详述 Box2.setLength(12.0); Box2.setBreadth(13.0); Box2.setHeight(10.0); //Box1的体积 volume=Box1.getVolume(); Console.WriteLine("Box1的体积:{0}",volume); //Box2的体积 volume=Box2.getVolume(); Console.WriteLine("Box2的体积:{0}",volume); //把两个对象相加 Box3=Box1+Box2; //Box3的体积 volume=Box3.getVolume(); Console.WriteLine("Box3的体积:{0}",volume); Console.ReadKey(); } } }
当上面的代码被编译和执行时,它会产生下列结果:
Box1的体积:210
Box2的体积:1560
Box3的体积:5400
可重载和不可重载运算符
下表描述了C#中运算符重载的能力:
运算符 | 描述 |
+,-,!,~,++,-- | 这些一元运算符只有一个操作数,且可以被重载。 |
+,-,*,/,% | 这些二元运算符带有两个操作数,且可以被重载。 |
==,!=,<,>,<=,>= | 这些比较运算符可以被重载。 |
&&,|| | 这些条件逻辑运算符不能被直接重载。 |
+=,-=,*=,/=,%= | 这些赋值运算符不能被重载。 |
=,.,?:,->,new,is,sizeof,typeof | 这些运算符不能被重载。 |
实例
针对上述讨论,让我们扩展上面的实例,重载更多的运算符:
usingSystem; namespaceOperatorOvlApplication { classBox { privatedoublelength;//长度 privatedoublebreadth;//宽度 privatedoubleheight;//高度 publicdoublegetVolume() { returnlength*breadth*height; } publicvoidsetLength(doublelen) { length=len; } publicvoidsetBreadth(doublebre) { breadth=bre; } publicvoidsetHeight(doublehei) { height=hei; } //重载+运算符来把两个Box对象相加 publicstaticBoxoperator+(Boxb,Boxc) { Boxbox=newBox(); box.length=b.length+c.length; box.breadth=b.breadth+c.breadth; box.height=b.height+c.height; returnbox; } publicstaticbooloperator==(Boxlhs,Boxrhs) { boolstatus=false; if(lhs.length==rhs.length&&lhs.height==rhs.height &&lhs.breadth==rhs.breadth) { status=true; } returnstatus; } publicstaticbooloperator!=(Boxlhs,Boxrhs) { boolstatus=false; if(lhs.length!=rhs.length||lhs.height!=rhs.height ||lhs.breadth!=rhs.breadth) { status=true; } returnstatus; } publicstaticbooloperator<(Boxlhs,Boxrhs) { boolstatus=false; if(lhs.length(Boxlhs,Boxrhs) { boolstatus=false; if(lhs.length>rhs.length&&lhs.height >rhs.height&&lhs.breadth>rhs.breadth) { status=true; } returnstatus; } publicstaticbooloperator<=(Boxlhs,Boxrhs) { boolstatus=false; if(lhs.length<=rhs.length&&lhs.height <=rhs.height&&lhs.breadth<=rhs.breadth) { status=true; } returnstatus; } publicstaticbooloperator>=(Boxlhs,Boxrhs) { boolstatus=false; if(lhs.length>=rhs.length&&lhs.height >=rhs.height&&lhs.breadth>=rhs.breadth) { status=true; } returnstatus; } publicoverridestringToString() { returnString.Format("({0},{1},{2})",length,breadth,height); } } classTester { staticvoidMain(string[]args) { BoxBox1=newBox();//声明Box1,类型为Box BoxBox2=newBox();//声明Box2,类型为Box BoxBox3=newBox();//声明Box3,类型为Box BoxBox4=newBox(); doublevolume=0.0;//体积 //Box1详述 Box1.setLength(6.0); Box1.setBreadth(7.0); Box1.setHeight(5.0); //Box2详述 Box2.setLength(12.0); Box2.setBreadth(13.0); Box2.setHeight(10.0); //使用重载的ToString()显示两个盒子 Console.WriteLine("Box1:{0}",Box1.ToString()); Console.WriteLine("Box2:{0}",Box2.ToString()); //Box1的体积 volume=Box1.getVolume(); Console.WriteLine("Box1的体积:{0}",volume); //Box2的体积 volume=Box2.getVolume(); Console.WriteLine("Box2的体积:{0}",volume); //把两个对象相加 Box3=Box1+Box2; Console.WriteLine("Box3:{0}",Box3.ToString()); //Box3的体积 volume=Box3.getVolume(); Console.WriteLine("Box3的体积:{0}",volume); //comparingtheboxes if(Box1>Box2) Console.WriteLine("Box1大于Box2"); else Console.WriteLine("Box1不大于Box2"); if(Box1 =Box2) Console.WriteLine("Box1大于等于Box2"); else Console.WriteLine("Box1不大于等于Box2"); if(Box1<=Box2) Console.WriteLine("Box1小于等于Box2"); else Console.WriteLine("Box1不小于等于Box2"); if(Box1!=Box2) Console.WriteLine("Box1不等于Box2"); else Console.WriteLine("Box1等于Box2"); Box4=Box3; if(Box3==Box4) Console.WriteLine("Box3等于Box4"); else Console.WriteLine("Box3不等于Box4"); Console.ReadKey(); } } }
当上面的代码被编译和执行时,它会产生下列结果:
Box1:(6,7,5)
Box2:(12,13,10)
Box1的体积:210
Box2的体积:1560
Box3:(18,20,15)
Box3的体积:5400
Box1不大于Box2
Box1小于Box2
Box1不大于等于Box2
Box1小于等于Box2
Box1不等于Box2
Box3等于Box4
以上就是详细分析c#运算符重载的详细内容,更多关于c#运算符重载的资料请关注毛票票其它相关文章!