2012-12-19 3 views
15

http://msdn.microsoft.com/en-us/library/1x308yk8.aspxなぜすべてのChar静的な "Is ..."は文字列の過負荷を持っていますか? IsWhiteSpace(string、Int32)?

これは私がこれを行うことができます:

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. 私は一般的な話を読んだことがありますが、ここで何をしているのか、また上限チェックにリンクされているかはまだ分かりません。
  3. TargetedPatchingOptOutAttributeは、他の方法には存在しない。例IsLetterIsNumberなど

答えて

18

ないすべての文字はC#文字に収まるので。たとえば、""は2つのC#charsを受け取り、char過負荷ではその文字に関する情報を取得できませんでした。 Stringと索引を使用すると、索引iの文字が高代理charであるかどうかを確認し、次の索引で低代理charを読み取ってadd them up according to the algorithmとし、コード・ポイントU+20000に関する情報を取得できます。

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

4

上限チェックのみを行うのはなぜですか?

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

+0

ああ、いいキャッチ、ありがとう。人々はこれをupvoteする必要があります、それはチェックアウト! 'IL_0015:blt.un.s IL_0022' – weston

関連する問題