C# 为什么不';t运算符重载使用得更频繁?

C# 为什么不';t运算符重载使用得更频繁?,c#,operator-overloading,C#,Operator Overloading,在许多情况下,运算符重载允许您更好地表达自己。为什么它们很少在C#中使用?它们不经常使用,因为通常对大多数对象类进行数学运算(大多数运算符都是这样)是没有意义的。所需操作的语义通常在某些方面有所不同。例如,当您实际需要聚合或分组时,您不会对一组OrderLine对象使用加法 使用您现在在问题注释中提供的示例,“+”似乎是将子元素放入父元素的一种不错的方式,但操作具有完全不同的语义。“+”表示您将从数学上把它们相加,而实际上您的目标是在两者之间建立层次关系。这可能对您有意义,但我想在第一次阅读时,

在许多情况下,运算符重载允许您更好地表达自己。为什么它们很少在C#中使用?

它们不经常使用,因为通常对大多数对象类进行数学运算(大多数运算符都是这样)是没有意义的。所需操作的语义通常在某些方面有所不同。例如,当您实际需要聚合或分组时,您不会对一组OrderLine对象使用加法

使用您现在在问题注释中提供的示例,“+”似乎是将子元素放入父元素的一种不错的方式,但操作具有完全不同的语义。“+”表示您将从数学上把它们相加,而实际上您的目标是在两者之间建立层次关系。这可能对您有意义,但我想在第一次阅读时,很多程序员可能并不清楚这一点


它们很少被使用,因为它们很少适合使用。

它们罕见的另一个原因是,虽然函数重载可以通过函数名和上下文进行自我记录,但运算符通常只有一到两个字符长


因此,无法明确说明重载的确切目的。例如字符串!=比较运算符重载没有空间来说明它是在比较长度、进行不区分大小写的逐字符比较,还是在静态索引数组中查找值并进行比较(尽管这是一个可笑的例子)。

我发现它们更多地用于语言中,从而使DSL更容易实现(特定于域的语言)。
一个很好的例子是,它使用了BNF的close符号:在这里,使用操作符是非常自然和富有表现力的。

Lua和NimLoad的PEG模块的LPEG库都使用了这种能力,除此之外,我想。

< P>关于.NET中运算符重载的另一个大问题是,不能重载所有运算符。因此,操作符<代码> >代码或代码> <代码>是可用的。另外,一些C++类中使用的还有一些。不能过载

因此,在大多数情况下,这是没有意义的,因为不幸的是,您无法访问所有操作员

来自:


用户定义的类型可能会过载。您能举几个例子说明它们在哪些方面更具表现力吗?我马上想到:XmlDocument completemml=customers+orders;//而不是创建一个XmlDocument并添加子元素。谢谢Gary。我在XmlDocument示例中的意思是将它们连接在一个xml容器中呃,一个更好的例子可能是:var completeMl=knifes+forks+spoons;你必须解释你的意思这一事实本身就表明,这可能不是一个好主意——好的代码应该是自文档化的。你可以在C#中重载>操作符。@dan04:no。比较这两个列表。