如何评估此字符串串联
本文关键字:字符串 评估 何评估 | 更新日期: 2023-09-27 18:00:58
我知道如何评估以下代码:
string s = "Hello";
s += " My ";
s += " World";
它基本上做3个评估(如果错误,请纠正我(:
- 将字符串"Hello"分配给变量s
- 创建另一个字符串"Hello My"并分配给变量s
- 创建另一个字符串"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 "
是可收藏的。
它的评价是一样的吗?
最终的结果肯定是一样的。这里没有评估问题(时间、依赖性(。