web-dev-qa-db-ja.com

C#文字列の比較:CurrentCultureIgnoreCaseとInvariantCultureIgnoreCaseの違い

C#で文字列比較を行うとき、

string test = "testvalue";
test.Equals("TESTVALUE", StringComparison.CurrentCultureIgnoreCase);

そして

string test = "testvalue";
test.Equals("TESTVALUE", StringComparison.InvariantCultureIgnoreCase);

...とにかく、その追加パラメーターを含めることが重要ですか?

35
Dan Esparza

マイクロソフトは、InvariantCultureプロパティをいつ使用するかについて、適切なガイダンスを提供しています。

MSDN:CultureInfo.InvariantCultureプロパティ

...アプリケーションは、ファイルに永続化されるデータのフォーマットや解析など、カルチャに依存しない結果を必要とするプロセスに対してのみ、インバリアントカルチャを使用する必要があります。他の場合では、それは言語的に不正確または文化的に不適切であるかもしれない結果を生み出します。

セキュリティに関する考慮事項

文字列比較または大文字小文字の変更の結果に基づいてセキュリティを決定する場合、アプリケーションでは、InvariantCultureを使用する代わりに、大文字小文字を無視する序数比較を使用する必要があります。 [...]

文字列操作

アプリケーションでCurrentCultureの値に影響されないカルチャ依存の文字列操作を実行する必要がある場合は、CultureInfoパラメーターを受け入れるメソッドを使用する必要があります。 [...]

永続データ

InvariantCultureプロパティは、ユーザーに直接表示されないデータを保存するのに役立ちます。カルチャに依存しない形式でデータを保存すると、変更されない既知の形式が保証されます。異なる文化のユーザーがデータにアクセスする場合、特定のユーザーに基づいて適切にフォーマットできます。 [...]

27
Michael Burr

他の投稿は良いアドバイスを与えてくれましたが、それが間違いなく違いを生む場所の例を示すのはいいことだと思いました:

using System;
using System.Globalization;
using System.Threading;

class Test
{
    static void Main()
    {
        CultureInfo turkish = CultureInfo.CreateSpecificCulture("tr");
        Thread.CurrentThread.CurrentCulture = turkish;                

        // In Turkey, "i" does odd things
        string lower = "i";
        string upper = "I";

        Console.WriteLine(lower.Equals(upper, 
            StringComparison.CurrentCultureIgnoreCase));
        Console.WriteLine(lower.Equals(upper, 
            StringComparison.InvariantCultureIgnoreCase));
    }
}

(間違いなく他の多くのケースがある-これは私が考えた最初のケ​​ースにすぎなかった。)

32
Jon Skeet