39

C# で文字列比較を行う場合、比較を行う場合の違いは何ですか?

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

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

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

4

2 に答える 2

37

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

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";
        
        // Prints False
        Console.WriteLine(lower.Equals(upper, 
            StringComparison.CurrentCultureIgnoreCase));
        // Prints True
        Console.WriteLine(lower.Equals(upper, 
            StringComparison.InvariantCultureIgnoreCase));
    }
}

(間違いなく他にも多くのケースがあります - これは私が最初に思いついたものです。)

于 2009-01-06T20:50:38.730 に答える
29

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

MSDN:CultureInfo.InvariantCultureプロパティ

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

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

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

文字列操作

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

データの永続化

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

于 2009-01-06T20:27:24.923 に答える