String.ToUpperメソッドは文字列を大文字化するメソッド、String.ToLowerメソッドは文字列を小文字化するメソッドです。

ToUpperメソッドとToLowerメソッドは現在のスレッドの(もしくは引数で指定された)カルチャの規則に基づいて大文字化・小文字化しますが、String.ToUpperInvariantメソッドString.ToLowerInvariantメソッドインバリアントカルチャ(特定の文化圏や言語に依存しない)の規則に基づいて大文字化・小文字化します。

String.ToUpper・ToLowerメソッドを使って文字列を大文字化・小文字化する
using System;

class Sample {
  static void Main()
  {
    var s = "The Quick Brown Fox Jumps Over The Lazy Dog";

    Console.WriteLine(s);
    Console.WriteLine(s.ToUpper());
    Console.WriteLine(s.ToUpperInvariant());
    Console.WriteLine(s.ToLower());
    Console.WriteLine(s.ToLowerInvariant());
  }
}
実行結果
The Quick Brown Fox Jumps Over The Lazy Dog
THE QUICK BROWN FOX JUMPS OVER THE LAZY DOG
THE QUICK BROWN FOX JUMPS OVER THE LAZY DOG
the quick brown fox jumps over the lazy dog
the quick brown fox jumps over the lazy dog

ToUpper/ToUpperInvariantToLower/ToLowerInvariantの違いは、大文字化・小文字化の際に参照される規則です。

例えば、トルコ語においては i の大文字は I(U+0049) ではなく İ(U+0131) で、I の小文字は i(U+0069) ではなく ı(U+0130) となるため、スレッドのカルチャがトルコ語の場合ToUpper/ToLowerの結果はToUpperInvariant/ToLowerInvariantと異なる結果となります。

したがって、カルチャや変換規則を強く意識する必要がある場合はToUpper/ToLowerを用いる必要があります。 一方それ以外の多くの場合はToUpperInvariant/ToLowerInvariantで十分と言えます。 特に、単にASCIIの範囲の文字だけを大文字/小文字にしたいという目的であれば、カルチャと変換規則に影響されないToUpperInvariant/ToLowerInvariantのほうが適切かつパフォーマンス的にも優れると考えられます。

カルチャと変換規則については、カルチャによる動作の違いとインバリアントカルチャ §.文字列比較の規則・ソート順定義(CompareInfo)としてのCurrentCultureStringComparisonとStringComparerでも詳しく説明しています。 ToUpper/ToLowerメソッド以外でカルチャによって異なる動作となる場合については、カルチャによる動作の違いとインバリアントカルチャを参照してください。