【发布时间】:2011-01-19 05:02:45
【问题描述】:
我喜欢 C#,但我希望它能够在类上定义我自己的运算符,例如 A => B,而不必执行 A.Implies(B)。我认为,如果您可以将 [+-*/&^|%$#@>
【问题讨论】:
标签: c# operators operator-overloading
我喜欢 C#,但我希望它能够在类上定义我自己的运算符,例如 A => B,而不必执行 A.Implies(B)。我认为,如果您可以将 [+-*/&^|%$#@>
【问题讨论】:
标签: c# operators operator-overloading
这不是语言内置的。您被语言附带的预定义运算符重载所困 (overloadable operators)。
如果您喜欢这种调试方式,您可能需要考虑F#。它是一种在 .NET 框架之上运行的函数式语言,让您能够定义所需的任何运算符。
【讨论】:
可以重载的运算符列表是here。
运算符重载只允许您更改运算符的行为,而不是定义新的运算符。
虽然A => B 和A.Implies(B) 一样听起来很酷,但它会在以后给您带来问题(6 个月后,当您试图弄清楚您的代码应该做什么时)。
【讨论】:
a.Plus(b),以防我们忘记+在算术或字符串连接中的含义。如果您可以确定域中符号的含义,然后经常使用它,那么非常很容易记住它的含义。如果你不打算经常使用它,那么发明这个符号是不值得的。所以在实践中,这不是问题。
+ 被普遍理解。虽然=> 对您来说可能很有意义,但如果其他人出现并且必须维护您的代码,他们可能会发现意识到或记住正在发生的事情并不容易。
+ 表示 C# 中的字符串连接。它不在 VB.NET 中。因此,它的所有含义并没有被普遍理解。您假设编写代码更好,以便消息灵通的人可以慢慢阅读 - 考虑编写代码可能更好,以便消息灵通的人可以快速阅读。在 C# 3 出来之后,大多数 C# 程序员都不知道 => 在 lambda 中的含义。 C# 团队使用该符号是错误的吗?不,他们希望社区吸收新的含义。同样,发明自己的符号的图书馆服务于一个社区,你可以加入也可以不加入。
businessObj1 % businessObj2 或~businessObj3。每一行代码都必须参考手册两次是没有好处的,因为到处都有运算符重载。另一方面,我经常在 4 种语言之间切换,具体取决于一天中的什么时间,所以我非常努力地让事情尽可能保持一致。 (而+ 确实表示 VB.Net 中的字符串连接)。
Method1、Method2 等。同时,请查看 Irony 解析器库,这是在 C# 中创建“内部 DSL”的运算符重载的理想示例,在这种情况下类似于 BNF:irony.codeplex.com/wikipage?title=expression%20grammar%20sample
简而言之,没有。您将不得不查看另一种语言。您可以重载许多 现有 运算符,或定义任何其他 方法(包括非常方便的扩展方法) - 但您不能在任何变体中定义自定义运算符我知道的 C#。
【讨论】:
==,你必须定义!=等,并且参数/返回类型并不是在所有情况下都是完全开放的。
不,这是不可能的,除非您自己制作类似 C# 的编译器。
只能覆盖部分内置运算符,不能新建,不能覆盖 lambda 运算符 (=>)。
【讨论】: