【问题标题】:Define new operators in C#? [duplicate]在 C# 中定义新的运算符? [复制]
【发布时间】:2011-01-19 05:02:45
【问题描述】:

可能重复:
Is it possible to create a new operator in c#?

我喜欢 C#,但我希望它能够在类上定义我自己的运算符,例如 A => B,而不必执行 A.Implies(B)。我认为,如果您可以将 [+-*/&^|%$#@>

【问题讨论】:

    标签: c# operators operator-overloading


    【解决方案1】:

    这不是语言内置的。您被语言附带的预定义运算符重载所困 (overloadable operators)。

    如果您喜欢这种调试方式,您可能需要考虑F#。它是一种在 .NET 框架之上运行的函数式语言,让您能够定义所需的任何运算符。

    【讨论】:

    • 经过多年的 C++ 项目和项目,我不得不非常不同意您使用“悲伤”这个词。
    • 遗憾地删除了这个词。最近,我在 F# 和 ruby​​ 的内联 DSL 魔法中获得了太多乐趣。
    【解决方案2】:

    可以重载的运算符列表是here

    运算符重载只允许您更改运算符的行为,而不是定义新的运算符。

    虽然A => BA.Implies(B) 一样听起来很酷,但它会在以后给您带来问题(6 个月后,当您试图弄清楚您的代码应该做什么时)。

    【讨论】:

    • 通过这个论点,我们应该使用a.Plus(b),以防我们忘记+在算术或字符串连接中的含义。如果您可以确定域中符号的含义,然后经常使用它,那么非常很容易记住它的含义。如果你不打算经常使用它,那么发明这个符号是不值得的。所以在实践中,这不是问题。
    • @Earwicker:我不买。 + 被普遍理解。虽然=> 对您来说可能很有意义,但如果其他人出现并且必须维护您的代码,他们可能会发现意识到或记住正在发生的事情并不容易。
    • @David Brown:+ 表示 C# 中的字符串连接。它不在 VB.NET 中。因此,它的所有含义并没有被普遍理解。您假设编写代码更好,以便消息灵通的人可以慢慢阅读 - 考虑编写代码可能更好,以便消息灵通的人可以快速阅读。在 C# 3 出来之后,大多数 C# 程序员都不知道 => 在 lambda 中的含义。 C# 团队使用该符号是错误的吗?不,他们希望社区吸收新的含义。同样,发明自己的符号的图书馆服务于一个社区,你可以加入也可以不加入。
    • @Earwicker 最好编写易于阅读的代码。每次我看到代码中使用的运算符重载时,总是很奇怪,比如businessObj1 % businessObj2~businessObj3。每一行代码都必须参考手册两次是没有好处的,因为到处都有运算符重载。另一方面,我经常在 4 种语言之间切换,具体取决于一天中的什么时间,所以我非常努力地让事情尽可能保持一致。 (而+ 确实表示 VB.Net 中的字符串连接)。
    • 滥用证据不排除存在适当使用。任何适当的白痴都可以滥用任何技术:假设您坚持使用命名方法。白痴可以使用名称Method1Method2 等。同时,请查看 Irony 解析器库,这是在 C# 中创建“内部 DSL”的运算符重载的理想示例,在这种情况下类似于 BNF:irony.codeplex.com/wikipage?title=expression%20grammar%20sample
    【解决方案3】:

    简而言之,没有。您将不得不查看另一种语言。您可以重载许多 现有 运算符,或定义任何其他 方法(包括非常方便的扩展方法) - 但您不能在任何变体中定义自定义运算符我知道的 C#。

    【讨论】:

    • 你可以用现有的操作符做些什么是有限制的——例如如果你定义了==,你必须定义!=等,并且参数/返回类型并不是在所有情况下都是完全开放的。
    【解决方案4】:

    不,这是不可能的,除非您自己制作类似 C# 的编译器。

    只能覆盖部分内置运算符,不能新建,不能覆盖 lambda 运算符 (=>)。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-11-10
      • 1970-01-01
      • 2011-09-01
      • 2013-11-07
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多