我说
var str1 = "Name1";
var str2 = "Name1";
如果我str1 == str2
输出将为真(如预期的那样)。
但我的问题是它是如何进行比较的..它是字符的特征还是如何?
那么string.Intern如何帮助改善性能?
答案 0 :(得分:7)
对于字符串,==
比较字符串的值(see this)。但是,在这种情况下,由于字符串实习,引用将是相同的,因为默认情况下所有文字字符串都是实例化的。如果您查看==
的实现,您会看到它调用string.Equals
,它首先进行参考比较。
答案 1 :(得分:1)
字符串相等性将首先检查要比较的字符串是否是同一个对象。在这种情况下,由于字符串实习将是真的,比较将无意中返回而不是任何类型的字符比较。
字符串实习可以在代码中进行操作,但更常见的是在编译过程中执行的某些操作。所有字符串文字都被编译成表,并且对字符串文字的引用将替换为对这些表中的条目的引用。这有助于汇集字符串,因此可能会减少内存。副作用是具有相同值的字符串文字现在具有相同的引用,因此比较将非常有效。
尽管作为编译的一部分,实习过程最为熟悉,但字符串可以以编程方式实现。
答案 2 :(得分:1)
当你这样做时
string x = "hello";
string y = "world";
bool result = x == y;
你正在调用String :: op_Equality,它反过来调用 static String.Equals方法,如下所示:
if ((Object)a==(Object)b) {
return true;
}
if ((Object)a==null || (Object)b==null) {
return false;
}
return EqualsHelper(a, b);
EqualsHelper方法逐字符比较。
这意味着它首先检查引用是否相等。
答案 3 :(得分:0)
首先,它检查对象引用是否相同(由其他答案解释共振),如果不是,那么它将通过char比较来进行char。
答案 4 :(得分:0)
首先,如果字符串引用相同的对象(如示例中的情况),则比较可以立即返回true
。其次,如果字符串的长度不同,则比较可以立即返回false
。在那之后,它确实是逐个字符的比较。
这是基于Reflector的输出,查看.NET 4.0。