15

http://msdn.microsoft.com/en-us/library/1x308yk8.aspx

これにより、次のことが可能になります。

var str = "string ";
Char.IsWhiteSpace(str, 6);

それよりも:

Char.IsWhiteSpace(str[6]);

珍しいように見えるので、反射を見ました:

[TargetedPatchingOptOut("Performance critical to inline across NGen image boundaries")]
public static bool IsWhiteSpace(char c)
{
    if (char.IsLatin1(c))
    {
        return char.IsWhiteSpaceLatin1(c);
    }
    return CharUnicodeInfo.IsWhiteSpace(c);
}

[SecuritySafeCritical]
public static bool IsWhiteSpace(string s, int index)
{
    if (s == null)
    {
        throw new ArgumentNullException("s");
    }
    if (index >= s.Length)
    {
        throw new ArgumentOutOfRangeException("index");
    }
    if (char.IsLatin1(s[index]))
    {
        return char.IsWhiteSpaceLatin1(s[index]);
    }
    return CharUnicodeInfo.IsWhiteSpace(s, index);
}

印象に残ったのは次の 3 点です。

  1. わざわざ上限だけチェックするのはなぜですか?をスローするArgumentOutOfRangeExceptionと、インデックスが0未満の場合、文字列の標準が得られますIndexOutOfRangeException
  2. 一般的なブレブを読んだプレセンスSecuritySafeCriticalAttributeですが、ここで何をしているのか、上限チェックにリンクされているのかはまだ不明です。
  3. TargetedPatchingOptOutAttribute他のIs...(char)メソッドには存在しません。例などIsLetter_IsNumber
4

2 に答える 2

18

C#すべての文字がcharに収まるわけではないためです。たとえば、""は 2 つの C#charsを必要とし、オーバーロードだけではその文字に関する情報を取得できませんでしたchar。とインデックスを使用Stringすると、メソッドは index の文字iが High Surrogateであるかどうかを確認し、次の index でcharLow Surrogate を読み取り、アルゴリズムに従ってそれらを合計し、コード ポイントに関する情報を取得できます。charU+20000

これは、UTF-16 が 100 万の異なるコード ポイントをエンコードできる方法です。これは可変幅のエンコードです。文字をエンコードするには 2 から 4 バイト、または 1 から 2 の C# 文字が必要です。

于 2012-12-19T15:47:23.073 に答える
4

わざわざ上限だけチェックするのはなぜですか?

そうではありません。符号なしの比較を実行するため、すべての負の数は長さよりも大きく比較され、適切な例外がスローされます。これはたまたま正確に逆コンパイルされません。

于 2012-12-19T15:49:02.493 に答える