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);