从这段源码中我们看到net 在字符串等号操作符中调用了 SystemString::Equals 这个静态方法来比较这个静态方法的代码如下 // Determines whether two Strings match public static bool Equals(String a String b) { if ((Object)a==(Object)b) { return true; } if ((Object)a==null || (Object)b==null) { return false; } return EqualsHelper(a b); } 从这个代码我们可以看出两个string 类型在进行==操作符比较时先比较引用是否相等如果不等会调用EqualsHelper比较值是否相等这也就是我们看到用==操作符比较两个引用不同但值相同的string时得到true的原因 一点建议 从时间角度考虑性能如果字符串是驻留的那么用==操作符比较起来在被比较的两个字符串相等的情况下将会非常快但从空间效率考虑 如果对所有字符串都驻留势必导致大量内存无法被释放折中一下可以在构造字符串后进行如下操作这样构造出来的字符串如果 已经驻留则使用驻留后的字符串引用否则使用原来引用这样除了可以提高比较的效率还可以减少内存的开销因为该字符串之前已经被驻留过了 我们没有必要再重新申请其它的内存来存储相同的字符串 当然调用TryIntern本身会有一些性能损失所以还要视具体情况使用如果该字符串构造出来后 被频繁用于比较则在第一次构造时使用TryIntern损失一些性能是值得的否则就不值得建议直接使用构造出来的字符串 string s = MyTest; string s = new StringBuilder()Append(My)Append(Test)ToString(); s = TryIntern(s); public static string TryIntern(string str) { internStr = stringIsInterned(str); return internStr == null? str: internStr; } [] [] |