字符串重载+运算符用于字符串串联

本文关键字:字符串 用于 运算符 重载 | 更新日期: 2023-09-27 18:20:15

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

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

字符串重载+运算符用于字符串串联

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加法运算符,尽管它并没有谈到对String.Concat的调用。我们可以假设它是实现细节。

此报价来自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,则为空字符串被取代。

我不知道为什么会提到过载。。因为我们没有看到任何运营商过载。