カルチャを認識しない大文字と小文字の変更の実行

String.ToUpperString.ToLowerChar.ToUpperChar.ToLower の各メソッドには、パラメーターを受け取らないオーバーロードが用意されています。 既定では、パラメーターを使用しないこれらのオーバーロードは、CultureInfo.CurrentCulture の値に基づいて大文字と小文字の変更を実行します。 このため、大文字と小文字を区別する結果がカルチャによって異なる場合があります。 大文字と小文字の変更がカルチャに依存するかどうかを明確にするには、culture パラメーターを明示的に指定する必要があるこれらのメソッドのオーバーロードを使用する必要があります。 大文字と小文字の変更がカルチャに依存する場合は、CultureInfo.CurrentCulture パラメーターとして culture を指定します。 大文字と小文字の変更がカルチャに依存しない場合は、CultureInfo.InvariantCulture パラメーターとして culture を指定します。

後で検索しやすいように文字列の大文字と小文字を変換する場合があります。 文字列をこのように使用する場合は、CultureInfo.InvariantCulture パラメーターとして culture を指定する必要があります。Thread.CurrentCulture の値が、大文字と小文字を変更してから検索が実行されるまでの間に変更される可能性があるからです。

セキュリティに関する決定が文字列の大文字と小文字の変更操作に基づいて行われる場合は、この操作がカルチャに依存しないようにして、操作の結果が CultureInfo.CurrentCulture の値により影響されないようにする必要があります。 カルチャに依存した文字列操作によって矛盾した結果がどのように生成されるかを示す例については、「文字列を使用するためのベスト プラクティス」の記事の「現在のカルチャを使用する文字列比較」の記事を参照してください。

String.ToUpper と String.ToLower

コードをわかりやすくするために、カルチャを明示的に指定できる String.ToUpperString.ToLower のメソッドのオーバーロードを常に使用することをお勧めします。 識別子の検索を実行するコード例を次に示します。 key.ToLower 操作は既定ではカルチャを認識しますが、この動作はコードを見ても明確ではありません。

Shared Function LookupKey(key As String) As Object
   Return internalHashtable(key.ToLower())
End Function
static object LookupKey(string key)
{
    return internalHashtable[key.ToLower()];
}

key.ToLower 操作がカルチャに依存しないようにする場合は、前の例を次のように変更して、大文字と小文字を変更するときに明示的に CultureInfo.InvariantCulture を使用します。

Shared Function LookupKey(key As String) As Object
    Return internalHashtable(key.ToLower(CultureInfo.InvariantCulture))
End Function
static object LookupKey(string key)
{
    return internalHashtable[key.ToLower(CultureInfo.InvariantCulture)];
}

Char.ToUpper と Char.ToLower

Char.ToUpper および Char.ToLower メソッドはそれぞれ String.ToUpper および String.ToLower メソッドと同じ特性を持っていますが、影響を受けるカルチャはトルコ語 (トルコ) およびアゼルバイジャン語 (ラテン、アゼルバイジャン) だけです。 単一の文字の大文字と小文字の区別が異なるのは、この 2 つのカルチャだけです。 この固有の大文字と小文字の対応の詳細については、「String クラス」のドキュメントの「大文字小文字の区別」を参照してください。 コードをわかりやすくし、結果を一貫性のあるものにするには、CultureInfo パラメーターを許可するこれらのメソッドのオーバーロードを常に使用することをお勧めします。

関連項目