Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/311.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
为什么Unicode属性测试的C#System.Char方法有两个重载?_C#_Unicode_Char - Fatal编程技术网

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

为什么Unicode属性测试的C#System.Char方法有两个重载?,c#,unicode,char,C#,Unicode,Char,在中,我们看到两种检查字符是否为符号的方法: public static bool IsSymbol(string s, int index) public static bool IsSymbol(char c) 对于其他属性测试也是如此:IsLower、Isleter等 为什么会有这种重复?是否有任何理由宁愿使用Char.IsSymbol(s,idx)而不是Char.IsSymbol(s[idx])?在表面上,两种重载似乎功能相同,但是,深入到调用InternalGetUnicodeCat

在中,我们看到两种检查字符是否为符号的方法:

public static bool IsSymbol(string s, int index)
public static bool IsSymbol(char c)
对于其他属性测试也是如此:IsLower、Isleter等


为什么会有这种重复?是否有任何理由宁愿使用
Char.IsSymbol(s,idx)
而不是
Char.IsSymbol(s[idx])

在表面上,两种重载似乎功能相同,但是,深入到调用
InternalGetUnicodeCategory
会发现它们会导致调用不同的
CharUnicodeInfo.GetUnicodeCateogry
重载

字符串int
重载在调用同一个
char
函数之前,通过
InternalConvertToUtf32
执行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)));
    }
内部静态UnicodeCegory InternalGetUnicodeCegory(字符串值,int索引){
Assert(value!=null,“value不能为null”);
契约.断言(索引

你可能会问,这有什么关系?答案是.Net支持文本元素。微软表示:

文本元素是显示为单个字符的文本单元,称为图示符。文本元素可以是基本字符、代理项对或组合字符序列

虽然我不相信
IsSymbol
函数及其相关函数可以解码图形或组合字符序列,但调用文本元素的原因是它们可以定义为代理对,因此需要通过
IsSymbol()的
字符串int
重载进行解码,IsLetter()

这意味着通过
char
重载传递代理项对将返回错误的结果,因为字符串中的字符可能是代理项对。您不能假设16位编码表示单个字符,而在所述索引处传递字符串的字符将产生该假设

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

结果不同的一个具体例子是


string s=char.ConvertFromUtf32(128204);//“更好地处理utf16代理项对可能是采用字符串的一个原因。@RaphaelMiedl。它使用GetUnicodegory,它使用InternalGetUnicodegory,它使用InternalGetCategoryValue,它进行utf16到UTF32的转换,这可能导致代理项对的解码。@RaymondChen:如果你能把它变成answe的话。”r、 我认为这样做会很好。看起来拉斐尔是正确的:。文档应该描述这种行为。有趣的是,一个字符可以同时被分类为高级代理和字母。Unicode需要一个或两个字符来编码一个代码点。这在编写C代码时是一个非常正确的参数。它不是唯一的一个,有些语言是d设计人员早在C#出现并决定支持System.Char之前就发现utf16是有问题的。Char很弱,要求程序员使用字符串重载。就像每个C#程序员都不喜欢的语言一样,它不应该被命名为:)更新为更简洁和尖锐的答案…希望:)您确定Char.IsSymbol()这类操作是在组合字符序列上进行的?这更令人惊讶。根据前面的讨论,我希望它们只在代码点上进行操作(即仅解码代理项对)。我不确定组合序列的情况,但是文本元素被定义为代理项对或组合字符序列,所以我只是回答他们关于重载的潜在原因。看看他们是否也对序列进行操作会很有趣。@U fish Unicode字符属性只是定义而已因此,处理整个组合字符序列/字符集簇没有多大意义。另外,快速查看链接转换函数似乎可以确认它仅通过utf32转换使用代码点。这段引文似乎更多地介绍了C#中的通用unicode支持,而不是特定于
IsSymbol()
函数。我同意。@Eval,如果您更新您的答案以反映这一点(即
IsSymbol()
和friends解码代理项),并删除对图形和文本元素的讨论,我将接受您的答案。