【问题标题】:Why does String.IsBOMWhitespace() method always return false?为什么 String.IsBOMWhitespace() 方法总是返回 false?
【发布时间】:2016-10-19 02:31:59
【问题描述】:

在 .NET Framework 4.5 中,由 Trim() 方法调用的私有 TrimHelper() 方法使用以下条件来确定字符是否需要修剪:(.NET Reflector 的反编译代码)

if (!char.IsWhiteSpace(this[start]) && !IsBOMWhitespace(this[start]))

我想知道为什么 IsBOMWhitespace 方法总是返回 false?

private static bool IsBOMWhitespace(char c)
{
    return false;
}

这是微软计划在未来改变/扩展的东西吗?例如通过检查字符是否为例如'\uFEFF' 并在这种情况下返回 true?

【问题讨论】:

  • 如答案所示,您发布的好像是源代码的内容并不是源代码。这是由反编译器生成的代码,除非这样呈现,否则会使问题非常具有误导性。
  • 看起来像是错误修复的副作用。 SSCLI20 发行版中可用的 String.cs 的早期副本错误地将 '\ufeff' 归类为空白。对该代码的注释表明此错误是由 Resgen.exe 问题的解决方法引起的
  • @Hans Passant:为什么将 \uFEFF 归类为空白是不正确的?
  • 它是一个格式化字符,它不会产生可见的空白。
  • @Hans Passant:谢谢。然而,他们删除了更多的字符,例如来自 Trim() 的 '\u200C' 我相信这会给许多客户带来问题。

标签: c# .net


【解决方案1】:

来源:http://referencesource.microsoft.com/#mscorlib/system/string.cs,bbf058af7f3f71df

private static bool IsBOMWhitespace(char c)
{
     #if FEATURE_LEGACYNETCF
     if (CompatibilitySwitches.IsAppEarlierThanWindowsPhone8 && c == '\xFEFF')
     {
         // Dev11 450846 quirk:
         // NetCF treats the BOM as a whitespace character when performing trim operations.
         return true;
     }
     else
     #endif
     {
         return false;
     }
}

如果兼容性测试 #if FEATURE_LEGACYNETCF 返回 true,那么您可能会得到不同的结果。

【讨论】:

  • 但为什么只有 NetCF? Framework 3.5 也将 BOM 视为空白,而不仅仅是在 NetCF 上。
  • @Kr15 如果您查看代码中的评论:// NetCF treats the BOM as a whitespace character when performing trim operations. 如果您认为有问题,为什么不向微软提出支持票?
【解决方案2】:

如果你检查the original code source

    private static bool IsBOMWhitespace(char c)
    {
#if FEATURE_LEGACYNETCF
        if (CompatibilitySwitches.IsAppEarlierThanWindowsPhone8 && c == '\xFEFF')
        {
            // Dev11 450846 quirk:
            // NetCF treats the BOM as a whitespace character when performing trim operations.
            return true;
        }
        else
#endif
        {
            return false;
        }
    }

这只是为 .NET Compact Framework 启用的一项兼容性功能。

【讨论】:

  • 但为什么只有 NetCF?框架 3.5 也将 BOM 视为空白,而不仅仅是在 NetCF 上。
  • 谢谢,但 user1666620 更快。
猜你喜欢
  • 1970-01-01
  • 2014-06-15
  • 2018-10-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-10-23
  • 1970-01-01
相关资源
最近更新 更多