簡體   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