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