我相信这两条线是等价的,但在遇到一个奇怪的问题后,我不再相信这种情况。
String mimeType = context.Request.ContentType;
(String.Compare("text/xml", mimeType, true) == 0))
是相同的 :
context.Request.ContentType.ToLower().Equals("text/xml")
它们在 CLR 中的实现有什么不同吗?
我相信这两条线是等价的,但在遇到一个奇怪的问题后,我不再相信这种情况。
String mimeType = context.Request.ContentType;
(String.Compare("text/xml", mimeType, true) == 0))
是相同的 :
context.Request.ContentType.ToLower().Equals("text/xml")
它们在 CLR 中的实现有什么不同吗?
它们不是等效的,ToLower/ToUpper 可能存在一些本地化问题。在不区分大小写的情况下比较两个字符串的方法(考虑到其中一个字符串可能为空,这就是我不喜欢 str1.Equals 方法的原因)是静态 String.Equals 方法:
bool areEqual = String.Equals(str1, str2, StringComparison.OrdinalIgnoreCase);
它们并不完全等价;看这里。
这是进行不区分大小写比较的正确方法:
bool areSame = str1.Equals(str2, StringComparison.OrdinalIgnoreCase);
这种方式也将更有效,因为它不会为小写副本分配单独的字符串。
除了其他答案(@SLaks、@Serhio)之外,我还觉得有义务指出 .ToLower() 生成另一个字符串。据我所知,比较没有。如果在频繁调用的代码中,应用程序中过多的字符串生成可能会在内存使用和性能方面给您带来不利影响。
Compare(string, string, boolean) 在 .NET 中的实现:
public static int Compare(string strA, string strB, bool ignoreCase)
{
if (ignoreCase)
{
return CultureInfo.CurrentCulture.CompareInfo.Compare(strA, strB, CompareOptions.IgnoreCase);
}
return CultureInfo.CurrentCulture.CompareInfo.Compare(strA, strB, CompareOptions.None);
}
和等于
[ReliabilityContract(Consistency.WillNotCorruptState, Cer.MayFail)]
public bool Equals(string value)
{
if ((value == null) && (this != null))
{
return false;
}
return EqualsHelper(this, value);
}
所以,不是一回事。