方案
请考虑以下代码段。
string s = "S";
string s1 = "S";
string s2 = string.Empty;
switch (s)
{
case "S":
s1 = "StringComparison";
break;
default:
break;
}
switch (s[0])
{
case'S':
s2 = "StringCOmpare2";
break;
default:
break;
}
第一个开关案例,导致IL内的字符串比较。
但是第二个开关案例不会导致IL内的字符串比较。
有人可以证明这一点吗?
答案 0 :(得分:13)
因为在第二个开关上你没有进行字符串比较,所以你正在进行字符比较。
答案 1 :(得分:3)
最简单的答案是你没有在第二个区块进行字符串比较;你要比较两个角色。
但是,你是对的,因为这两个代码块在功能上是等价的。一个好的优化编译器应该能够检测到's'是一个固定长度的字符串,并重写它不要使用完整的字符串比较。
答案 2 :(得分:2)
您的第二个switch语句未使用字符串,而是使用单个 char 。因此,没有字符串比较。
答案 3 :(得分:2)
您正在通过其indexer访问该字符串,该字符串返回一个字符串,因此您可以使用该字符串,就像它是一个字符数组一样。
所以,你所做的是一个字符比较。使用撇号作为'S'也会告诉你,你使用'S'作为字符而不是字符串。