CurrentCultureInvariantCultureは、ともに特定のカルチャでの規則に基づいた比較を行う点では同じですが、CurrentCultureでは現在のカルチャに基づいた比較を行うのに対し、InvariantCultureでは特定の文化圏や言語に依存しないインバリアントカルチャに基づいた比較を行う点が異なります。

以下はString.Compareメソッドの結果を用いてこれらの違いを見るためのサンプルです。

CurrentCultureとInvariantCultureの違い
using System;
using System.Globalization;
using System.Threading;

class Sample {
  static void Main()
  {
    Console.WriteLine(Thread.CurrentThread.CurrentCulture);

    Console.WriteLine("Compare CurrentCulture   : {0}", String.Compare("亜", "井", StringComparison.CurrentCulture));
    Console.WriteLine("Compare InvariantCulture : {0}", String.Compare("亜", "井", StringComparison.InvariantCulture));

    // 現在のスレッドのカルチャをen-US(英語/米国)に変更
    Thread.CurrentThread.CurrentCulture = CultureInfo.GetCultureInfo("en-US");

    Console.WriteLine(Thread.CurrentThread.CurrentCulture);

    Console.WriteLine("Compare CurrentCulture   : {0}", String.Compare("亜", "井", StringComparison.CurrentCulture));
    Console.WriteLine("Compare InvariantCulture : {0}", String.Compare("亜", "井", StringComparison.InvariantCulture));
  }
}
実行結果
ja-JP
Compare CurrentCulture   : -1
Compare InvariantCulture : 1
en-US
Compare CurrentCulture   : 1
Compare InvariantCulture : 1

スレッドのカルチャをen-US(英語/米国)に変更する前後の結果に注目してください。 InvariantCultureでの結果はどちらも変わらないのに対し、CurrentCultureでの結果は、スレッドのカルチャを変更する前後で異なっています。

これは、ja-JP(日本語/日本)の規則では漢字の読みによる並びとなっているために(あ)の方が(い)より小さい(前に並ぶ)、つまり"<"とされるのに対し、en-US(英語/米国)の規則では文字のコードポイントによる並びとなっているために、(U+4E95)の方が(U+4E9C)よりも小さい(前に並ぶ)、つまり">"とされるためです。 そのため、CurrentCultureによる比較の結果は、カルチャがja-JPとen-USの場合で異なります。

一方、InvariantCultureの場合は特定の言語に依存しない規則に基づいて比較されるため、カルチャがja-JPでもen-USでもの方がよりも小さいというどちらも同じ結果となります。 (参考: 固有カルチャのデータの比較と並べ替え)

CurrentCultureIgnoreCaseInvariantCultureIgnoreCaseの場合もこれと同様の動作となります。

カルチャ情報についての詳細やカルチャ情報の取得・変更に関してはカルチャの基本とカルチャ情報で詳しく解説しています。