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);
}

三件事让我印象深刻:

  1. 为什么只对上限进行限制检查?抛出ArgumentOutOfRangeException, 而低于 0 的索引将给出字符串的标准IndexOutOfRangeException
  2. 我已经阅读了一般性SecuritySafeCriticalAttribute的问题,但仍然不清楚它在这里做什么以及它是否与上限检查相关联。
  3. TargetedPatchingOptOutAttributeIs...(char)在其他方法上不存在。例子IsLetterIsNumber_
4

2 回答 2

18

因为不是每个字符都适合一个C#字符。例如,""需要 2 个 C# ,并且仅通过重载chars就无法获得有关该字符的任何信息。char有了String索引,这些方法可以查看索引i处的字符是否为高代理char,然后读取char下一个索引的低代理,根据算法将它们相加,并检索有关代码点的信息U+20000

这就是 UTF-16 可以编码 100 万个不同代码点的方式,它是一种可变宽度编码。编码一个字符需要 2-4 个字节,或 1-2 个 C# 字符。

于 2012-12-19T15:47:23.073 回答
4

为什么只对上限进行限制检查?

它没有。它执行无符号比较,因此每个负数都将比较大于长度并引发相应的异常。这恰好没有被准确地反编译。

于 2012-12-19T15:49:02.493 回答