如何在C#中重载&,|和^运算符,以及重载是如何工作的?
一段时间以来,我一直在努力寻找一些好的答案,但一直没有找到。我会分享任何有用的文章。
发布于 2011-11-10 03:03:04
通过在C#中实现类的运算符,您实际上并没有重载运算符。您只是第一次实现它们。它们是方法,就像任何其他方法一样,但具有特殊的语法。不调用c = Add(a, b),而是调用c = 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;重载是在编译时执行的。它确保根据方法的名称、参数类型和计数来调用特定的方法。
覆盖是在运行时执行的。它允许调用子类的方法而不是父方法,即使实例被视为父类也是如此。
发布于 2011-11-10 02:35:03
有关运算符重载的一些文章/教程/参考资料,包括二进制/位运算符和示例源代码,请参阅:
至于“如何使用它们”,基本规则是重载操作符在实现它们的域中应该是有意义的……
例如,您可以构建一个遗传/进化算法,并以与该算法的“重组/突变”步骤(即从当前种群创建下一代)一致的方式定义部分/所有位/二进制运算符--这将使该特定上下文中的代码相当优雅。
发布于 2011-11-10 02:43:17
如何使用它们?小心点。它们需要有意义。例如,定义一个类型来保存ComplexNumber或矩阵,然后重载算术运算符是有意义的。
不要因为不喜欢打字而走重载操作符的愚蠢路线。
例如,MyThingyList + SomeFileName从文件中加载MyThingyList。
或
MyThingyList--调用MyThingsList.Clear()。
https://stackoverflow.com/questions/8069665
复制相似问题