絶対。MSDN(http://msdn.microsoft.com/en-us/library/d93tkzah.aspx)ごとに、
このメソッドは、現在のカルチャを使用して単語(大文字と小文字を区別し、カルチャを区別する)検索を実行します。
そのため、異なるカルチャで実行すると(コントロールパネルの地域と言語の設定を介して)、異なる結果が得られる可能性があります。
この特定のケースでは、おそらく問題はありませんがi
、検索文字列を挿入してトルコで実行すると、おそらく1日が台無しになります。
MSDNを参照してください:http://msdn.microsoft.com/en-us/library/ms973919.aspx
これらの新しい推奨事項とAPIは、デフォルトの文字列APIの動作に関する誤った仮定を軽減するために存在します。非言語文字列データが言語的に解釈される場合に発生するバグの標準的な例は、「トルコ語-I」問題です。
アメリカ英語を含むほぼすべてのラテンアルファベットでは、文字i(\ u0069)は文字I(\ u0049)の小文字バージョンです。このケーシングルールは、そのような文化でプログラミングする人にとってはすぐにデフォルトになります。ただし、トルコ語( "tr-TR")には、大文字の "i with a dot"文字(\ u0130)があります。これはiの大文字バージョンです。同様に、トルコ語では、小文字の「ドットのないi」または(\ u0131)があり、これはIを大文字にします。この動作はアゼルバイジャン文化(「az」)でも発生します。
したがって、iの大文字化またはIの小文字化について通常行われる仮定は、すべての文化で有効というわけではありません。文字列比較ルーチンのデフォルトのオーバーロードが使用される場合、それらはカルチャ間の差異の影響を受けます。次の例のように、非言語データの場合、これにより望ましくない結果が生じる可能性があります。
Thread.CurrentThread.CurrentCulture = new CultureInfo("en-US")
Console.WriteLine("Culture = {0}",
Thread.CurrentThread.CurrentCulture.DisplayName);
Console.WriteLine("(file == FILE) = {0}",
(String.Compare("file", "FILE", true) == 0));
Thread.CurrentThread.CurrentCulture = new CultureInfo("tr-TR");
Console.WriteLine("Culture = {0}",
Thread.CurrentThread.CurrentCulture.DisplayName);
Console.WriteLine("(file == FILE) = {0}",
(String.Compare("file", "FILE", true) == 0));
Iの比較の違いにより、スレッドカルチャを変更すると比較結果が変わります。これは出力です:
Culture = English (United States)
(file == FILE) = True
Culture = Turkish (Turkey)
(file == FILE) = False
大文字と小文字を区別しない例を次に示します。
var s1 = "é"; //é as one character (ALT+0233)
var s2 = "é"; //'e', plus combining acute accent U+301 (two characters)
Console.WriteLine(s1.IndexOf(s2, StringComparison.Ordinal)); //-1
Console.WriteLine(s1.IndexOf(s2, StringComparison.InvariantCulture)); //0
Console.WriteLine(s1.IndexOf(s2, StringComparison.CurrentCulture)); //0