OR(|),XOR(^),AND(&)重载
如何重载&,| C#中的^和^运算符以及重载如何工作?
我一直试图找到一些好的答案,但没有找到任何答案。 我将分享任何有用的文章。
通过在C#中为您的类实现运算符,您实际上并没有超载运算符。 您只是第一次实施它们。 它们是方法,就像任何其他方法一样,但具有特殊的语法。 您可以调用c = a + b
,而不是调用c = Add(a, b)
,其中+
是返回值的运算符(方法)。
通过实现以下方法,自动实现了&=
|=
和^=
方法。
public class MyClass { public static MyClass operator &(MyClass left, MyClass right) { return new MyClass(); } public static MyClass operator |(MyClass left, MyClass right) { return new MyClass(); } public static MyClass operator ^(MyClass left, MyClass right) { return new MyClass(); } } var a = new MyClass(); var b = new MyClass(); var c = a & b; var d = a | b; var e = a ^ b; a &= b; // a = a & b; c |= d; // c = c & d; e ^= e; // e = e ^ e;
重载在编译时执行。 它确保根据方法的名称和参数类型和计数调用特定方法。
覆盖是在运行时执行的。 它允许调用子类的方法而不是父方法,即使实例被视为父类。
有关运算符重载的一些文章/教程/参考,包括二进制/位运算符和示例源代码,请参阅:
- http://www.codeproject.com/KB/cs/introtooperatoroverloads.aspx
- http://www.dotnetperls.com/operator
- http://msdn.microsoft.com/en-us/library/aa691324%28v=vs.71%29.aspx
- http://msdn.microsoft.com/en-us/library/aa288467%28v=vs.71%29.aspx
至于“如何使用它们”,基本规则是重载运算符应该在你实现它们的域中有意义…
例如,您可以构建遗传/进化算法并以与该算法的“重组/突变”步骤(即从当前群体创建下一代)一致的方式定义一些/所有按位/二元运算符 – 这将使在特定的上下文中使用相当优雅的代码。
怎么用? 小心。 他们需要有意义。 例如,定义一个Type来保存ComplexNumber或Matrix,然后重载算术运算符是有道理的。
因为你不喜欢打字,所以不要贬低操作员超载的愚蠢路线。
例如,MyThingyList + SomeFileName从文件中加载MyThingyList。
要么
MyThingyList–调用MyThingsList.Clear()。