运算符在.NET中重载

时间:2009-09-09 11:55:24

标签: c# .net vb.net operator-overloading

在什么情况下你会考虑在.NET中重载操作符?

5 个答案:

答案 0 :(得分:17)

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

如果含义不是很明显,那么黄金法则来重载运算符。例如,我认为在Stream上有一个+运算符会很奇怪 - 它可能意味着“在这里写一个可写的T,所以写入结果写入两者”或者它可能意味着“读取一个其他“或可能是其他事情。”

根据我的经验,除了==和!=。

之外,很少重载

答案 1 :(得分:16)

我认为Framework design guidelines提供了一些不错的建议:

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

答案 2 :(得分:3)

我确实要求关闭它,但也许它可以保持开放(我试图改变主意,但显然你不能撤销一个关闭请求:P)

我将亲自回答:从不

我从不认为实现运算符重载是个好主意。只有一个例外:如果我正在编写某种集合(它不常发生)并且我想实现索引器[]

我个人认为,我认为推翻==和其他此类事情并不合适。但话说回来,我并不是在复杂的数学和金融领域工作,而这些东西可能有用。但是我不能从这个问题的经验谈起(实际上,我可以在金融界,我们没有在那里做)。

答案 3 :(得分:3)

我考虑在这种情况下覆盖运算符:

  • ==和!=当它是一个简单的值类型,并实现值比较。在其他类型中,我希望==和!=所以参考比较并且也不贵。
  • 比较运算符(&gt;,&gt; = etc)与上述情况相同,如果它只是一个数值。
  • 我实际上从不过载aritmetic运算符,但是如果它会增强可用性,它会为相同类型的数值执行此操作。
  • 如果类型可以无损转换为适当的其他类型,则转换为运算符。

答案 4 :(得分:2)

我会考虑对表示逻辑值的类型使用运算符重载进行算术运算。例如,有些时候我希望Point +-运算符过载{{1}}。