繁体   English   中英

为什么每个Char静态“Is ...”都有一个字符串重载,例如IsWhiteSpace(string,Int32)?

[英]Why does every Char static “Is…” have a string overload, e.g. IsWhiteSpace(string, Int32)?

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的前提,我已经阅读了一般的blerb,但仍然不清楚它在这里做了什么以及它是否与上限检查相关联。
  3. 其他Is...(char)方法中不存在TargetedPatchingOptOutAttribute 示例IsLetterIsNumber

因为不是每个角色都适合C# char。 例如, "𠀀"需要2个C# chars ,并且您只能通过char重载获得有关该字符的任何信息。 使用String和索引,方法可以查看索引i处的字符是否为High Surrogate char ,然后在下一个索引处读取Low Surrogate char根据算法将其添加 ,并检索有关代码点U+20000

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

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

它没有。 它执行无符号比较,因此每个负数将比长度大,并导致抛出相应的异常。 这恰好不能准确地反编译。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM