如何在dotnet中进行字符串比较?

时间:2011-02-04 07:42:22

标签: c# string

我说

var str1 = "Name1"; 
var str2 = "Name1";

如果我str1 == str2输出将为真(如预期的那样)。

但我的问题是它是如何进行比较的..它是字符的特征还是如何?

那么string.Intern如何帮助改善性能?

5 个答案:

答案 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。