运算符在.NET中重载

Ant*_*ney 11 .net c# vb.net operator-overloading

在什么情况下你会考虑在.NET中重载一个运算符?

Jon*_*eet 17

  • 我强烈考虑在我覆盖的任何地方重载==和!= Equals
  • 我会考虑(更不强烈)在我实现的任何地方重载比较运算符 IComparable<T>
  • 我会考虑为基本数值类型重载算术运算符
  • 我会考虑为"包装器"类型提供显式转换(如Nullable<T>)
  • 我会非常很少考虑提供隐式转换

如果含义不是很明显,那么黄金法则不会使运营商超负荷.例如,我认为打开一个+运算符是很奇怪的Stream- 它可能意味着"在这里写一个可写的T,所以写入结果写入两者"或者它可能意味着"一个接一个地读"或者可能其他事情.

根据我的经验,除了==和!=之外的任何重载都是非常罕见的.

  • 我要说的是,如果你只为一个目的实现相等而不是通用相等,那么你应该在一个单独的(可能是嵌套的)类中实现IEqualityComparer.由于不可变而导致的字符串异常没有考虑到您也可以创建自己的不可变类的事实.事实上,我很少会为可变类重写Equals ... (8认同)
  • @silky:你不觉得使用你的代码的人可能会混淆Equals和==没有相同的行为吗?我希望他们有相同的结果...... (4认同)
  • @ silky/Stefan:为什么不呢?在另一条评论中,Silky已经将字符串作为例外 - 但为什么呢?如果两个对象具有值相等,那么为什么不希望它们通过使用==更容易比较该相等?在某些情况下,重要的是要使参考和价值平等易于区分,但我认为它至少值得强烈*考虑*否则...... (3认同)
  • 我不喜欢if ==和!=不引用参考类型的比较. (2认同)

Ric*_*dOD 16

我认为框架设计指南提供了一些不错的建议:

  • AVOID定义运算符重载,除了应该感觉像原始(内置)类型的类型.
  • CONSIDER在一个应该感觉像基本类型的类型中定义运算符重载.
  • 请在表示数字的结构中定义运算符重载(例如System.Decimal).
  • 定义运算符重载时不要太可爱.
  • 除非至少有一个操作数是定义过载的类型,否则不要提供操作符重载.
  • DO以对称方式过载运算符.
  • CONSIDER为方法提供与每个重载运算符对应的友好名称.