【问题标题】:Return False if variable isn't boolean如果变量不是布尔值,则返回 False
【发布时间】:2010-11-30 18:11:27
【问题描述】:

如果usable 不是Truebool 以外的任何东西),我如何使用下面的代码返回False,目前我的代码抛出异常usable 不是布尔值。

if (!Boolean.Parse(readValue("Useable"))) return true;
return (defined.ContainsKey(key) || (key == "Useable"));

【问题讨论】:

  • 你错了啊...拼写不正确...
  • 代码来自以前的员工,但我没有发现拼写错误!谢谢

标签: c# boolean


【解决方案1】:
bool isUseable;
bool.TryParse(readValue("Useable"), out isUseable);

【讨论】:

  • 应该是 bool.TryParse(readValue("Useable"), out isTrue),否则我会这样做。
  • 在这段代码中初始化isUseable 是没有意义的。您可以删除该作业——它具有误导性。
  • @Drew:不确定“误导”。如果有的话,它更明确,但也许是多余的。我已将其删除。
  • @Andrew:查看反射器中的 Boolean.TryParse,它与您正在执行的字符串比较完全相同,所以我不得不质疑您的基准测试结果。
  • @Kent -- 我选择了误导这个词,因为它暗示(也许对于新手程序员来说)如果解析失败,初始化程序中指定的值仍然存在。考虑一下您将其初始化为 true 的场景。由于这个原因,我在其他人的代码中调试过几次错误,这就是我提到它的原因。
【解决方案2】:

怎么样:

return (readValue("Useable") == "TRUE");

根据 Drew 的评论编辑

【讨论】:

  • 这是一个非常好的观点,德鲁......在其他事情的中间回答!
  • 您也可以使用 string.Equals(readValue("Useable"), "TRUE", StringComparison.OrdinalIgnoreCase) 因为海报没有说明返回值是什么情况。序数比较也更快。
【解决方案3】:

这是最简单最快的方法:

return "True".Equals(readValue("Useable"), StringComparison.OrdinalIgnoreCase);

注意:Boolean.TryParse 不是一个好的选择,因为它比简单的字符串比较慢得多。请查看本次测试的结果(使用Jon Skeet's BenchmarkHelper):

using System;
using BenchmarkHelper;

class Example
{
    static void Main()
    {
        var results = TestSuite.Create
                ("Boolean.TryParse vs. String comparison", "True", true)
            .Add(tryParse)
            .Add(stringComparison)
            .RunTests()
            .ScaleByBest(ScalingMode.VaryDuration);

        results.Display(ResultColumns.NameAndDuration | ResultColumns.Score,
                results.FindBest());        
    }

    static Boolean tryParse(String input)
    {
        Boolean result;
        Boolean.TryParse(input, out result);
        return result;
    }

    static Boolean stringComparison(String input)
    {
        return "True".Equals(input, StringComparison.OrdinalIgnoreCase); 
    }
}

输出:

============ Boolean.TryParse vs. String comparison ============
tryParse         12.118 6.03
stringComparison 21.895 1.00

【讨论】:

  • +1 此处无需进行解析(如果我正确理解了原始问题)。使用这个 sn-p,我可能会反转语法,因此不会对字符串文字进行函数调用。
  • 可能是一个愚蠢的问题,但时间价值的单位是什么?似乎 stringComparison 使用的时间比 tryParse 更多,还是我读错了?
  • @Jon - 对字符串文字的方法调用有什么问题?如果你反转语法,如果readValue("Useable") 的结果是null,你可能最终得到NullReferenceException
  • @Lazarus - 这根本不是一个愚蠢的问题。来自msmvps.com/blogs/jon_skeet/archive/2009/01/26/…:“基准测试结果具有持续时间和迭代计数,以及为产生结果而运行的测试的描述性名称。结果可以缩放,以便持续时间或迭代计数与另一个结果匹配. 同样,结果有一个分数,它只是持续时间(以滴答为单位,但它非常随意)除以迭代次数......
  • tsk tskm,魔法常数。这就是 Boolean.TrueString 的用途。
【解决方案4】:
bool isUseable;
if (bool.TryParse(readValue("Useable"), out isUseable))
    return isUseable;
return false;

【讨论】:

  • 您可以将此代码缩短为:return bool.TryParse(readValue("Useable"), out isUseable) && isUseable; ...我个人觉得这样更具可读性。
【解决方案5】:
var result = Equals(true, myobject);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-11-23
    • 2017-06-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-02-07
    • 1970-01-01
    相关资源
    最近更新 更多