繁体   English   中英

string.IsNullOrEmpty & string.IsNullOrWhiteSpace 为空字符串返回 false

[英]string.IsNullOrEmpty & string.IsNullOrWhiteSpace return false for empty string

我遇到了一个奇怪的案例,其中一段代码旨在从 MSFT Azure Phrase Breaker 处理一段文本后清除空白字符串、句号破折号等。 我可以使用帮助找出如何调试问题。

当给定值""时,以下代码块返回true 显然,期望是该方法应该在第一个if语句之后返回false 在要查看的 899 个短语中,似乎只有两个有这个问题。 也发生在另一台机器上。

public static bool IsSentenceTranslatable(string sentence)
{
    string trimmedSentence = sentence.Trim();

    if (string.IsNullOrEmpty(trimmedSentence) || string.IsNullOrWhiteSpace(trimmedSentence))
    {
        return false;
    }

    switch (trimmedSentence)
    {
        case " ":
        case ".":
        case "-":
        case "·":
            return false;
    }

    return true;
}

这是调试器的快照。

调试器快照

它可能是 Visual Studio 或 .NET 中的错误吗? 我尝试使用各种可视化工具,但仍然看不到盒子里的任何东西。 .NET 4.5 C# 7.3

尝试获取字符串的字节表示。 我怀疑它实际上包含一些在 VS 调试器中不可见但不算作空格的字符。

请参阅此问题以获取提示:

UPD:由于您的 Watch 窗口显示在调用string trimmedSentence = sentence.Trim()您已经trimmedSentence.Length == 1 ,我将我的怀疑升级为确定性。

正如我的评论中所述,在该屏幕截图中您可以看到trimmedSentence.Length为 1,因此它不是空的,其内容绝对不是标准空间。 如果字符串显示为空,那是因为它具有那些所谓的不可见字符之一。 要检查您的字符串有什么,您可以通过执行trimmedSentence[0]直接访问该字符。

如果该角色经常出现,您可能需要考虑这样做:

string trimmedSentence = sentence.Trim().Replace("<this special character>", "");

或者,您可以通过执行Char.ConvertFromUtf32(yourCharCode).ToString()从 Unicode 值创建该可替换字符串。 您不能使用使用字符参数的Replace重载,因为没有“空”字符,只有空字符串。 您应该能够在调试时获得此值。 或者,如有必要,通过执行(int)trimmedSentence[0]

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM