C# 字符串比较等价物

C# 字符串比较等价物,c#,.net,string,clr,string-comparison,C#,.net,String,Clr,String Comparison,我相信这两条线是相等的,但在遇到一个奇怪的问题后,我不再相信这是事实 String mimeType = context.Request.ContentType; (String.Compare("text/xml", mimeType, true) == 0)) 同: context.Request.ContentType.ToLower().Equals("text/xml") 它们在CLR中的实现有什么不同吗?它们不是完全相同的;看 下面是进行不区分大小写比较的正确方法: bool a

我相信这两条线是相等的,但在遇到一个奇怪的问题后,我不再相信这是事实

String mimeType = context.Request.ContentType;
(String.Compare("text/xml", mimeType, true) == 0))
同:

context.Request.ContentType.ToLower().Equals("text/xml")

它们在CLR中的实现有什么不同吗?

它们不是完全相同的;看

下面是进行不区分大小写比较的正确方法:

bool areSame = str1.Equals(str2, StringComparison.OrdinalIgnoreCase);

这种方法也会更有效,因为它不会为小写副本分配单独的字符串。

在.NET中实现比较(字符串、字符串、布尔值):

等于

[ReliabilityContract(Consistency.WillNotCorruptState, Cer.MayFail)]
public bool Equals(string value)
{
    if ((value == null) && (this != null))
    {
        return false;
    }
    return EqualsHelper(this, value);
}

因此,不是相同的东西。

它们不是等价的,ToLower/ToUpper可能有一些本地化问题。比较两个不区分大小写的字符串的方法(考虑其中一个字符串可能为null,这就是我不喜欢str1.Equals方法的原因)是静态字符串。Equals方法:

bool areEqual = String.Equals(str1, str2, StringComparison.OrdinalIgnoreCase);

除了其他答案(@SLaks,@Serhio),我还觉得有义务指出.ToLower()生成另一个字符串。据我所知,比较并不重要。如果应用程序在频繁调用的代码中生成过多的字符串,那么它可能会在内存使用和性能方面对您造成不利影响。

这将适用于99.999%的情况,但有时可能会失败。请参阅
土耳其语-I问题
@SLaks:我不确定重点是什么,但
OrdinalingOrecase
不能解决土耳其语-I问题。在比较mime类型时,您不应该“解决”土耳其语-I问题!这个答案不是零安全的。如果str1是null@Simon:正确
String.Equals(a,b,StringComparison.OrdinalIgnoreCase)
does。由于安全
null
处理,首选版本,但Gonzalo对另一个答案的评论也适用于此,应予以考虑。
bool areEqual = String.Equals(str1, str2, StringComparison.OrdinalIgnoreCase);