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);
}
有三件事让我感到震惊:
ArgumentOutOfRangeException
,而索引低于0将给出字符串的标准IndexOutOfRangeException
SecuritySafeCriticalAttribute
的前提,我读过一般的blerb,但仍然不清楚它在这里做了什么以及它是否与上限检查有关。TargetedPatchingOptOutAttribute
方法中不存在Is...(char)
。示例IsLetter
,IsNumber
等。答案 0 :(得分:18)
因为不是每个角色都适合C#
个字符。例如,""
需要2 C#chars
,而您只能通过char
重载获得有关该字符的任何信息。使用String
和索引,方法可以查看索引i
处的字符是否为高代理char
,然后在下一个索引处读取低代理char
{ {3}},并检索有关代码点add them up according to the algorithm的信息。
这就是UTF-16可以编码100万个不同代码点的方式,它是一种可变宽度编码。编码字符需要2-4个字节,或1-2 C#字符。
答案 1 :(得分:4)
为什么只在上限进行限制检查呢?
没有。它执行无符号比较,因此每个负数将比长度大,并导致抛出相应的异常。这恰好不能准确反编译。