加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

为什么C#System.Char方法的Unicode属性测试有两个重载?

发布时间:2020-12-16 05:21:10 所属栏目:百科 来源:网络整理
导读:在 methods of System.Char中,我们看到两个方法来检查一个字符是否是一个符号: public static bool IsSymbol(string s,int index)public static bool IsSymbol(char c) 同样为其他财产测试:IsLower,IsLetter等 为什么会出现这种重复?有什么理由喜欢Char.I
在 methods of System.Char中,我们看到两个方法来检查一个字符是否是一个符号:
public static bool IsSymbol(string s,int index)
public static bool IsSymbol(char c)

同样为其他财产测试:IsLower,IsLetter等

为什么会出现这种重复?有什么理由喜欢Char.IsSymbol(s,idx)超过Char.IsSymbol(s [idx])?

解决方法

在这两个表面上,两个重载似乎在功能上是一样的,但是下调到InternalGetUnicodeCategory的调用将会显示它们导致调用不同的重载CharUnicodeInfo.GetUnicodeCateogry.

在调用同一个单独的内部GetGetUnicodeCategory函数之前,通过InternalConvertToUtf32,字符串int过载最终通过UTF32转换运行.这解释了以UTF16编码字符解码代理对的可能性.

internal static UnicodeCategory InternalGetUnicodeCategory(String value,int index) {
        Contract.Assert(value != null,"value can not be null");
        Contract.Assert(index < value.Length,"index < value.Length");

        return (InternalGetUnicodeCategory(InternalConvertToUtf32(value,index)));
    }

Check out the Conversion implementation here if you want.

为什么这件事你可能会问?那么答案是.Net支持文本元素.微软说:

MSDN Documentation on Unicode Support for Surrogate Pairs

A text element is a unit of text that is displayed as a single character,called a grapheme. A text element can be a base character,a surrogate pair,or a combining character sequence.

虽然我不相信IsSymbol函数及其亲属可以解码格式化或组合字符序列,但是将文本元素标注的原因在于它们可以被定义为代理对,因此需要通过字符串进行解码,int重载IsSymbol(),IsLetter()等…

这意味着通过char重载传递代理对会返回错误的结果,因为字符串中的字符可能是代理对.你不能假设一个16位编码代表单个字符,并且在该索引处传递字符串的字符将会做出这样的假设.

因为代理对可以在.Net中的字符串中表示,所以如果你正在处理可能包含其中的一个的字符串,则IsSymbol(string s,int index)重载将更适合于覆盖这些对中的一个存在的情况.

结果不同的具体示例是

string s = char.ConvertFromUtf32(128204); // "                        

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读