代码之家  ›  专栏  ›  技术社区  ›  Dariusz Woźniak

string=string+int:幕后是什么?

  •  47
  • Dariusz Woźniak  · 技术社区  · 15 年前

    在C中,可以隐式连接字符串,例如,整数:

    string sth = "something" + 0;
    

    我的问题是:

    1. 为什么,假设您可以隐式连接一个字符串和一个int,c不允许这样初始化字符串:

      string sth = 0; // Error: Cannot convert source type 'int' to target type 'string'
      
    2. C如何将0转换为字符串。它是 0.ToString() (string)0 或者别的什么?

    3. 如何找到前面问题的答案?
    2 回复  |  直到 11 年前
        1
  •  49
  •   SLaks    15 年前

    它编译为调用 String.Concat(object, object) ,像这样:

    string sth = String.Concat("something", 0);
    

    (注意,编译器实际上会对这一行进行优化)

    此方法定义如下:(取自.NET引用源)

        public static String Concat(Object arg0, Object arg1) {
            if (arg0==null) {
                arg0 = String.Empty; 
            }
    
            if (arg1==null) { 
                arg1 = String.Empty;
            } 
            return Concat(arg0.ToString(), arg1.ToString());
        }
    

    (这个电话 String.Concat(string, string) )


    要发现这一点,您可以使用 ildasm 或反射器(在IL或C中,没有优化)查看 + 行编译为。

        2
  •  22
  •   Jon Skeet    15 年前

    C 4规范第7.8.4节规定:

    对于窗体的操作 x + y , 二元运算符过载分辨率 (_7.3.4)用于选择 具体的操作员实施。这个 操作数转换为 所选的参数类型 运算符和结果类型 是运算符的返回类型。

    预定义的加法运算符是 以下列出。对于数字和 枚举类型,预定义的 加法运算符计算 两个操作数。当一个或两个 操作数的类型为string, 预定义的加法运算符 连接字符串表示形式 操作数。

    最后一句话是与这种情况最相关的。

    然后:

    字符串连接

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

    二进制文件的这些重载+ 运算符执行字符串串联。 如果字符串串联的操作数 为空,空字符串为 取代的否则,任何非字符串 参数转换为其字符串 通过调用虚拟 ToString 从类型继承的方法 对象。如果 弦线 返回空值,一个 空字符串被替换。

    指定如何将整数转换为字符串。

    结果:

    字符串串联的结果 运算符是一个字符串,由 左操作数的字符 后面是 右操作数。弦 串联运算符从不返回 空值。

    执行连接的实际方法是特定于实现的,但如其他答案中所述,MS实现使用 string.Concat .