C# String、Int32等的操作定义在哪里?

C# String、Int32等的操作定义在哪里?,c#,.net,string,C#,.net,String,我通过reflector查看字符串和Int32类型,但找不到任何已定义的运算符 如果未定义它们,+/-,etc如何在这些类型上工作?字符串类只有两个符合CLS的名称:op_Equality和op_Equality。编译器有很多关于System.String类的内置知识。必要时,才能使用Ldstr操作码。同样,它将+运算符转换为String.Concat() 与Int32的情况差不多,运算符和IL操作码之间存在直接匹配。数字运算符是IL本身的一部分。字符串上的“+”运算符有点特殊——它不是由字符串

我通过reflector查看字符串和Int32类型,但找不到任何已定义的运算符


如果未定义它们,+/-,etc如何在这些类型上工作?

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


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

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

string x = a + "hello" + b;
进入:


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

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

c#编译器是b的疯狂儿子…我曾经尝试重新创建可空类型的功能,但未能成功,直到Eric Lippert在其博客上的一些评论中向我保证,它的功能也源自编译器遇到可空类型时生成的功能类型。

原语的运算符是一个难题,正如我在尝试写入(即使用T+T等)时发现的那样;还有一个讨论页


您可以通过使用诸如
Expression
(.NET3.5)之类的抽象来解决这个问题,否则,您必须查看原始IL,或者使用一些已知的方法。

谢谢nobugz。很高兴在这里见到你。如果是这样,就不能从头开始重新创建这些类型,对吗?@David:很高兴看到熟悉的名称。@Joan:不,编译器和规范对这些类型有明确的了解。您可以编写自己的类型,这些类型具有类似的显示行为,但没有优化:(谢谢Jon。那么你能说,对于其他.NET语言,要么必须在自己的编译器(如MS)中完成这项工作,要么这项工作无法完成,因此没有任何.NET语言可以在速度上超过C#吗?不是因为这些操作。但是,在C++/CLI中还可以做一些在C#中无法做的事情,比如在盒式结构中更改值(没有涉及到接口)。谢谢Marc。当你说“你必须查看原始IL,或者使用一些已知的方法”时,你的意思是说,通过这样做,你可以解决T+T问题吗?如果是,怎么解决?只是想知道。(它不解决语法部分,但解决了使用部分。)不幸的是,我的web服务器目前似乎已关闭,因此您显然无法跟踪链接。我将查看它。Re“raw IL”,我的意思是您可以查看诸如反射、发射和操作码等内容。添加;使用表达式(或者从MiscUtil借用操作符)。
string x = string.Concat(a, "hello", b);