【问题标题】:Help with a C# conditional statement dealing with Strings帮助处理字符串的 C# 条件语句
【发布时间】:2010-12-20 03:20:26
【问题描述】:

在我尝试剖析一点 C# 时,恐怕我不了解这段代码的目标或逻辑:

if (!string.IsNullOrEmpty(str2) && (Strings.UCase(Strings.Left(str2, 1)) != Strings.Left(str2, 1)))
    {
        return false;
    }

我知道第一部分是检查 str2 是否为“非空”,但是第二部分有点不稳定。所以我们UCase str2的第一个字符,如果它不等于str2的第一个字符(不是“UCase”d),那么返回“false”?

也许我没有遗漏任何东西,而我上面描述的实际上就是代码正在做的事情。如果是这种情况,我们是否可以将其改造成提供相同结果的其他内容,例如检查 str2 是否为大写?我觉得这是最终目标。

你觉得呢?

【问题讨论】:

    标签: c# string conditional


    【解决方案1】:

    当您说:“我不了解这段代码的目标或逻辑”时,我与您有相同的看法:) 仅返回 'false 的测试是“可疑的”:大概是“某事”在等待用于返回一个布尔值,如果 this 的结果为“真”,则不返回任何内容。

    但如果我必须编写这样一个函数,我会使用替代 OR 逻辑:

    return (! (String.IsNullOrEmpty(testString) || testString.ToUpper()[0] == testString[0]));
    

    【讨论】:

      【解决方案2】:

      这是相同的,但被重构了:

      if (!string.IsNullOrEmpty(str2)) {
        string s = Strings.Left(str2, 1);
        if (Strings.UCase(s) != s) {
          return false;
        }
      }
      

      很明显,这段代码测试str2的第一个字母在有任何字符时是否为大写。

      【讨论】:

      • 这并没有提高代码的可读性和可维护性。
      【解决方案3】:

      是的,你理解的代码是正确的。

      它看起来像是使用翻译工具从 VB 翻译出来的东西,因为它使用了 VisualBasic 命名空间中的函数。我宁愿用字符串方法写它:

      if (!String.IsNullOrEmpty(str2) && str2.Substring(0,1).ToUpper() != str2.SubString(0,1)) {
        return false;
      }
      

      或者简单地将第一个字符作为字符而不是字符串,并使用Char 类的IsLower 方法:

      if (!string.IsNullOrEmpty(str2) && Char.IsLower(str2[0])) {
        return false;
      }
      

      【讨论】:

      • 你是对的,我使用 .NET Reflector 剖析了一个 .dll。也就是说,这是 Visual Basic 中的代码: If (Not String.IsNullOrEmpty(str2) AndAlso (Strings.UCase(Strings.Left(str2, 1)) Strings.Left(str2, 1))) Then Return False End If -- 我的下一步是了解 .NET Reflector 是如何真正发挥其魔力的。感谢您的帮助!
      【解决方案4】:

      英文代码目标:)

      如果非空字符串以小写字符开头,则返回 false

      【讨论】:

      • 如果你把这个英文句子作为注释放在代码块之前,你会做你自己和下一个将剖析这个的人:)
      • @Xencor:更重要的是,如果可以的话,他应该将代码重写为更清晰的内容(参见 Guffa 的建议)。
      • 我愿意,但是 Guffa 是正确的:代码是使用 .NET Reflector 从 dll 中获取的。我确信真正的代码中有很多 cmets,但是我相信 Reflector 会忽略 cmets,不是吗?作为这些东西的“新手”,我不确定我是否有信心去开发并说“嘿!评论你的代码!”。我已经对他们的代码产生了足够的错误......
      • @jJack:忽略 cmets 的不是反射器,它们只是不包含在编译代码中。实际上原始源代码中没有任何内容在 dll 中,Reflector 只是重新创建与原始代码产生相同结果的代码。
      【解决方案5】:

      我敢打赌,他们实际上只是在测试第一个字符是否为大写。最初的“IsNullOrEmpty”测试只是为了确保真正的测试不会抛出异常。

      最大的问题:如果没有字符串值(null 或空),这将不会返回 false。这是预期的结果吗?

      【讨论】:

      • 是的,这是预期的结果。一些上下文:这段代码只是一个更大的函数的许多条件之一,它检查 Word 文档中的回车是否“有效”。所以,如果没有字符串值,代码“不关心”。
      猜你喜欢
      • 2010-09-24
      • 1970-01-01
      • 1970-01-01
      • 2011-11-26
      • 1970-01-01
      • 2011-03-20
      • 1970-01-01
      • 2011-12-13
      • 2014-10-03
      相关资源
      最近更新 更多