【问题标题】:Where are the operations for String , Int32, etc are defined?String、Int32 等的操作在哪里定义?
【发布时间】:2009-01-28 21:34:06
【问题描述】:

我正在通过反射器查看 String 和 Int32 类型,但找不到任何已定义的运算符。

如果没有定义,+/- 等如何作用于这些类型?

【问题讨论】:

    标签: c# .net string


    【解决方案1】:

    数字运算符是 IL 本身的一部分。不过,字符串上的“+”运算符有点特殊——它不是由字符串类型本身重载的,而是由编译器完成的。 C#编译器翻译:

    string x = a + "hello" + b;
    

    进入:

    string x = string.Concat(a, "hello", b);
    

    这比使用普通运算符完成连接更有效,因为否则每次连接都必须创建一个新字符串。

    【讨论】:

      【解决方案2】:

      String 类只有两个,它们具有符合 CLS 的名称:op_Equality 和 op_Inequality。编译器有很多关于 System.String 类的内置知识。为了能够使用 Ldstr 操作码,这是必要的。同样,它将 + 运算符转换为 String.Concat()。

      Int32 的故事差不多,运算符和 IL 操作码之间存在直接匹配。

      【讨论】:

      • 感谢 nobugz。很高兴在这里见到你。如果是这样的话,就不能从头开始重新创建这些类型,对吧?
      • @David:很高兴看到熟悉的名字。
      • @Joan:不,编译器和规范对这些类型有明确的了解。您可以编写自己的类型,它们具有类似的显示行为,但没有优化:(
      • 谢谢乔恩。所以你能说,对于其他 .NET 语言,要么必须在他们自己的编译器(如 MS)中执行此操作,要么无法完成,因此没有 .NET 语言可以在速度上击败 C#?
      • 不适用于这些操作。您可以在 C++/CLI 中执行其他一些您在 C# 中无法执行的操作,例如更改盒装结构中的值(不涉及接口)。
      【解决方案3】:

      原语的运算符很痛苦,正如我在尝试编写 generic support for operators 时发现的那样(即使用 T + T 等);还有一个讨论页here that covers this

      您可以通过使用诸如 Expression (.NET 3.5) 之类的抽象来解决此问题 - 否则,您将不得不查看原始 IL,或使用一些已知方法。

      【讨论】:

      • 谢谢马克。当您说“您将不得不查看原始 IL,或者使用一些已知的方法。”时,您的意思是这样做可以解决 T + T 问题吗?如果有怎么办?只是想知道。
      • (它没有解决语法部分,但它确实解决了使用部分。)不幸的是,我的网络服务器目前似乎已关闭,所以你不能 显然,按照链接。会调查的。
      • Re "raw IL",我的意思是你应该去看看像Reflection.EmitOpCodes.Add这样的东西; Expression 更容易使用 很多(或者只是从 MiscUtil 借用 Operator)。
      【解决方案4】:

      是的,这些操作被转换为本地 IL 指令,而不是显式调用“operator+”方法。 它可能不是执行这些操作的托管代码...

      【讨论】:

        【解决方案5】:

        c# 编译器是一个疯狂的儿子......我曾经尝试重新创建 Nullable 类型的能力,但直到在他的博客上的一些评论中,Eric Lippert 向我保证它的能力也来自于编译器在遇到可空类型时生成。

        【讨论】:

          猜你喜欢
          • 2013-03-08
          • 1970-01-01
          • 2016-02-06
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2014-07-12
          • 2020-12-06
          • 2017-12-18
          相关资源
          最近更新 更多