これらの 2 つの行は同等であると信じていますが、奇妙な問題に遭遇した後は、そうではないと信じています。
String mimeType = context.Request.ContentType;
(String.Compare("text/xml", mimeType, true) == 0))
と同じです:
context.Request.ContentType.ToLower().Equals("text/xml")
CLR での実装に違いはありますか?
これらの 2 つの行は同等であると信じていますが、奇妙な問題に遭遇した後は、そうではないと信じています。
String mimeType = context.Request.ContentType;
(String.Compare("text/xml", mimeType, true) == 0))
と同じです:
context.Request.ContentType.ToLower().Equals("text/xml")
CLR での実装に違いはありますか?
これらは同等ではなく、ToLower/ToUpper にはローカライズの問題がある可能性があります。大文字と小文字を区別せずに 2 つの文字列を比較する方法 (文字列の 1 つが null である可能性があるため、str1.Equals メソッドは好きではありません) は、静的な String.Equals メソッドです。
bool areEqual = String.Equals(str1, str2, StringComparison.OrdinalIgnoreCase);
それらは完全に同等ではありません。ここを参照してください。
大文字と小文字を区別しない比較を行う正しい方法は次のとおりです。
bool areSame = str1.Equals(str2, StringComparison.OrdinalIgnoreCase);
この方法は、小文字のコピーに別の文字列を割り当てないため、より効率的です。
他の回答 (@SLaks、@Serhio) に加えて、.ToLower() が別の文字列を生成することを指摘する義務があると感じています。私が知る限り、比較はしません。アプリでの過剰な文字列生成は、頻繁に呼び出されるコードで行われると、メモリの使用量とパフォーマンスの面で問題を引き起こす可能性があります。
.NET での Compare(string, string, boolean) の実装:
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);
}
だから、同じことではありません。