C# 编译时连接字符串

问题描述 投票:0回答:2

请帮助理解这种行为。当我使用这个时:

bool a1 = (object)("string" + 1) == ("string" + 1);

结果是

false

但是当我使用这个

bool a2 = (object)("string" + "1") == ("string" + "1"); 

结果是

true

那么,为什么

a1 != a2

c# .net string concatenation
2个回答
34
投票

强制转换为

object
强制进行参考相等比较。

在第一种情况下,在运行时生成两个不同的

string
对象。由于它们是不同的实例,因此结果是错误的。

在第二种情况下,编译器注意到

"string" + "1"
始终是
"string1"
并实习该字符串并在两个地方使用相同的引用。由于是相同的字符串引用,因此结果为 true。


19
投票

这里发生了两件重要的事情:

首先,表达式

"string" + 1
在运行时计算,而
"string" + "1"
在编译时计算。

其次,您正在使用参考比较。运行时生成的字符串实际上引用了不同的对象,而编译时生成的字符串引用了同一个对象,因此第一个表达式是

false
,第二个表达式是
true

如果你有兴趣,生成的IL是:

// bool a1 = (object)("string" + 1) == ("string" + 1);
// bool a2 = (object)("string" + "1") == ("string" + "1");

IL_0000:  ldstr       "string"
IL_0005:  ldc.i4.1    
IL_0006:  box         System.Int32
IL_000B:  call        System.String.Concat
IL_0010:  ldstr       "string"
IL_0015:  ldc.i4.1    
IL_0016:  box         System.Int32
IL_001B:  call        System.String.Concat
IL_0020:  ceq         
IL_0022:  stloc.0     // a1
IL_0023:  ldstr       "string1"
IL_0028:  ldstr       "string1"
IL_002D:  ceq         
IL_002F:  stloc.1     // a2
© www.soinside.com 2019 - 2024. All rights reserved.