如何评估此字符串串联

本文关键字:字符串 评估 何评估 | 更新日期: 2023-09-27 18:00:58

我知道如何评估以下代码:

string s = "Hello";
s += " My ";
s += " World";

它基本上做3个评估(如果错误,请纠正我(:

  1. 将字符串"Hello"分配给变量s
  2. 创建另一个字符串"Hello My"并分配给变量s
  3. 创建另一个字符串"Hello My World"并分配给变量s

其中CCD_ 1和CCD_。

我不知道的是,他们是如何评估以下代码的?

string s = "Hello" + " My " + " World";

它的评价是一样的吗?

更新

答案给了我另一个问题。下面的代码怎么样?

string s = "Hello" + EvaluateJoin() + " World";

其中

private string EvaluateJoin(){ return " My "; }

如何评估此字符串串联

到第一位,"是的,基本上",直到

这基本上留下了"Hello"answers"Hello My"的弱引用,可以进行GC编辑。

不,它们不再被引用。

编辑:Henk正确地指出,"Hello"" My "是被拘留的(由于ldstr(,因此不会被收集。然而,组合的"Hello My "而不是内部的,将是可收集的。

对于第二个例子:因为这些都是单个表达式中的常数,所以编译器在编译时将常数组合在一起;它表示单个中间字符串"Hello My World",您可以在IL中看到它。

例如:

static void Main()
{
    string s = "Hello";
    s += " My ";
    s += " World";
    System.Console.WriteLine(s);
    s = "Hello" + " My " + " World";
    System.Console.WriteLine(s);
}

编译为:

.method private hidebysig static void Main() cil managed
{
    .entrypoint
    .maxstack 8
    L_0000: ldstr "Hello"
    L_0005: ldstr " My "
    L_000a: call string [mscorlib]System.String::Concat(string, string)
    L_000f: ldstr " World"
    L_0014: call string [mscorlib]System.String::Concat(string, string)
    L_0019: call void [mscorlib]System.Console::WriteLine(string)
    L_001e: ldstr "Hello My  World"
    L_0023: call void [mscorlib]System.Console::WriteLine(string)
    L_0028: ret 
}

在这里,您可以清楚地看到第一个示例的"Hello"0s和第二个示例的单个预组合字符串。

这基本上留下了"Hello"answers"Hello My"的弱引用,可以进行GC编辑。

不,字符串是中间的,常量字符串永远不会被GC-ed。所以只有"Hello My "是可收藏的。

它的评价是一样的吗?

最终的结果肯定是一样的。这里没有评估问题(时间、依赖性(。