c#进阶 methods中2overload methods
2010-12-25 12:05 撞破南墙 阅读(1277) 评论(1) 编辑 收藏 举报CLR并不知道发生了操作符重载这回事,因为在编译的过程中
各种操作符都被生产了对应的代码。比如说+被生产为一个加法函数
public sealed class Complex {
public static Complex operator+(Complex c1, Complex c2) {
//TO DO
}
}
public static Complex operator+(Complex c1, Complex c2) {
//TO DO
}
}
自己动手为 类A重载一个操作符
public class ClassA {
public static int operator +(ClassA c1, int c2) {
return ++c2;
//TO DO
}
}
public static int operator +(ClassA c1, int c2) {
return ++c2;
//TO DO
}
}
static void Main(string[] args) {
int a = 0;
int b = 0;
int c = 0;
c = a + b;
ClassA ca = new ClassA();
Console.WriteLine(ca + 1);
Console.Read();
}
int a = 0;
int b = 0;
int c = 0;
c = a + b;
ClassA ca = new ClassA();
Console.WriteLine(ca + 1);
Console.Read();
}
能够允许重载的操作符非常有限,只是一般的+ - 等等。
CLR中更多的重载的可以参看
ECMA specifications
(www.ecma-international.org/publications/standards/Ecma-335.htm)
书中说到其实他调用了
op_Addition method,
但使用 reflactor和IL DASM都看不到那个方法。。。
查看的结果
private static void Main(string[] args) { int a; int b; int c; a = 0; b = 0; c = 0; c = a + b; return; }
.method private hidebysig static void Main(string[] args) cil managed
{
.entrypoint
// Code size 12 (0xc)
.maxstack 2
.locals init ([0] int32 a,
[1] int32 b,
[2] int32 c)
IL_0000: nop
IL_0001: ldc.i4.0
IL_0002: stloc.0
IL_0003: ldc.i4.0
IL_0004: stloc.1
IL_0005: ldc.i4.0
IL_0006: stloc.2
IL_0007: ldloc.0
IL_0008: ldloc.1
IL_0009: add
IL_000a: stloc.2
IL_000b: ret
} // end of method Program::Main
{
.entrypoint
// Code size 12 (0xc)
.maxstack 2
.locals init ([0] int32 a,
[1] int32 b,
[2] int32 c)
IL_0000: nop
IL_0001: ldc.i4.0
IL_0002: stloc.0
IL_0003: ldc.i4.0
IL_0004: stloc.1
IL_0005: ldc.i4.0
IL_0006: stloc.2
IL_0007: ldloc.0
IL_0008: ldloc.1
IL_0009: add
IL_000a: stloc.2
IL_000b: ret
} // end of method Program::Main
我的个人观点:
操作符重载通常会造成歧义而不被推崇,除非是为了性能特殊地方使用。如某些基础数据类型中需要重写比较==和!=等等。
作者:撞破南墙
出处:http://www.cnblogs.com/facingwaller/
关于作者:本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。