在System.Char的方法中,我们看到两种方法来检查字符是否是符号:
public static bool IsSymbol(string s, int index)
public static bool IsSymbol(char c)
Run Code Online (Sandbox Code Playgroud)
同样适用于其他财产测试:IsLower,IsLetter等
为什么会出现这种重复?没有任何理由,更喜欢Char.IsSymbol(s, idx)了Char.IsSymbol(s[idx])?
Eva*_*n L 12
在表面上,两个重载似乎在功能上是相同的,但是向下钻取InternalGetUnicodeCategory将显示它们导致调用不同的重载CharUnicodeInfo.GetUnicodeCateogry.
所述string,int过载结束了通过UTF32转换经由运行InternalConvertToUtf32在调用相同的单一char InternalGetUnicodeCategory功能.这解释了以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)));
}
Run Code Online (Sandbox Code Playgroud)
为什么你可能会问这个问题?那么答案就是.Net支持文本元素.微软表示:
文本元素是一个文本单元,显示为单个字符,称为字形.文本元素可以是基本字符,代理对或组合字符序列.
虽然我不相信IsSymbol函数及其亲属可以解码字形或组合字符序列,但是文本元素标注的原因是它们可以被定义为代理对,因此需要通过string,int重载IsSymbol(), IsLetter()等来解码....
这意味着通过char重载传递代理对会返回错误的结果,因为字符串中的字符可能是代理对.您不能假设16位编码表示单个字符,并且在所述索引处传递字符串的字符将作出该假设.
因为代理对可以用.Net中的字符串表示,所以如果你正在处理一个可能包含其中一个字符串的字符串,那么IsSymbol(string s, int index)过载会更合适,以便覆盖其中一对存在的情况. .
结果不同的具体示例是
string s = char.ConvertFromUtf32(128204); // ""
Debug.Assert(char.IsSymbol(s[0]) == char.IsSymbol(s, 0)); // Fails
Run Code Online (Sandbox Code Playgroud)