字符串连接+字符串连接的运算符在哪里?

时间:2014-09-02 11:18:02

标签: c# .net string operator-overloading

我最近想知道+运算符在哪里string重载。我能看到的唯一方法是== and !=。为什么两个字符串可以与+连接,即使该运算符没有重载?这只是一个魔术编译器技巧还是我错过了什么?如果是前者,为什么以这种方式设计字符串?

这个问题来自this。很难解释某人他不能使用+来连接两个对象,因为如果object不关心运算符的重载,string不会重载此运算符。

2 个答案:

答案 0 :(得分:8)

String不会重载+运算符。它是c#编译器,它将调用转换为+运算符到String.Concat方法。

请考虑以下代码:

void Main()
{
    string s1 = "";
    string s2 = "";

    bool b1 = s1 == s2;
    string s3 = s1 + s2;
}

生成IL

IL_0001:  ldstr       ""
IL_0006:  stloc.0     // s1
IL_0007:  ldstr       ""
IL_000C:  stloc.1     // s2
IL_000D:  ldloc.0     // s1
IL_000E:  ldloc.1     // s2
IL_000F:  call        System.String.op_Equality //Call to operator
IL_0014:  stloc.2     // b1
IL_0015:  ldloc.0     // s1
IL_0016:  ldloc.1     // s2
IL_0017:  call        System.String.Concat // No operator call, Directly calls Concat
IL_001C:  stloc.3     // s3

Spec在这里调用7.7.4 Addition operator,但它没有谈到对String.Concat的调用。我们可以假设它是实现细节。

答案 1 :(得分:1)

此引用来自C# 5.0 Specification 7.8.4 Addition operator

字符串连接:

string operator +(string x, string y); 
string operator +(string x, object y); 
string operator +(object x, string y); 
  

二进制+运算符的这些重载执行字符串   级联。如果字符串连接的操作数为null,则为空   字符串被替换。否则,将转换任何非字符串参数   通过调用虚拟ToString方法来表示其字符串表示形式   继承自类型对象。如果ToString返回null,则为空字符串   被替代。

我不确定为什么会提到重载但是..因为我们没有看到任何运营商超载。