【问题标题】:Parse to Boolean or check String Value解析为布尔值或检查字符串值
【发布时间】:2013-08-22 03:31:53
【问题描述】:

如果我有一个变量可以从数据库中提取 truefalse 字符串,
哪种方法是检查其值的首选方式?

string value = "false";

if(Boolean.Parse(value)){
   DoStuff();
}

我知道有不同的方式解析为 bool - 这是一个示例

string value = "false";

if(value == "true"){
   DoStuff();
}

我从数据库中提取了很多 string 格式的真/假值,想知道这些方法是否会产生任何性能差异?

【问题讨论】:

  • 任何一种方法都可以,但许多开发人员会更喜欢 Bool.TryParse()。第二种方法是字符串比较,会稍微慢一些,o(n^2)

标签: c# boolean


【解决方案1】:

在 C# 7.0+ 中,您可以使用 inline variable declaration.

string value = "false";

if (bool.TryParse(value, out bool parsedValue))
{
    if (parsedValue)
    {
        // do stuff
    }
    else
    {
        // do other stuff
    }
}
else
{
    // unable to parse
}

【讨论】:

    【解决方案2】:
    string value = "your text"
    bool outresult = false;
    bool resultado = false;
    
    resultado = bool.TryParse(value, out outresult);
    

    try parse函数会尝试将字符串的值转换为布尔值,如果它不能返回变量outresult的值。

    【讨论】:

    • 这不能回答所提出的问题。也请使用英语发布到 StackOverflow。
    【解决方案3】:

    请务必使用Boolean.TryParse(),您将避免可能弹出的区分大小写的问题。

    【讨论】:

    • 我可以看到区分大小写 - 但是文化问题?
    • @JonSkeet 你是对的,我对避免解析布尔值的文化问题的个人扩展方法感到困惑。有时值可能会在系统文化中“翻译”出来(例如,意大利语中的 Vero-Falso),具体取决于它们的编写方式。我已经更新了答案。
    【解决方案4】:

    当要求性能时,没有解析的版本可能会更快。但正如其他人已经建议的那样,我也更喜欢解析解决方案。

    【讨论】:

      【解决方案5】:

      使用Boolean.TryParse:

      string value = "false";
      Boolean parsedValue;
      
      if (Boolean.TryParse(value, out parsedValue))
      {
            if (parsedValue)
            {
               // do stuff
            }
            else
            {
               // do other stuff
            }
      }
      else
      {
         // unable to parse
      }
      

      【讨论】:

      • 原来的 if/else 不应该是 try/catch 吗?
      • @NewAmbition:不,因为TryParse如果转换成功则返回true,如果无法解析则返回false。
      • 一个速记替代方案是bool parsed = Boolean.TryParse(stringToParse, out parsedValue) && parsedValue;
      • @NewAmbition:是的,这将是一个替代方案。但是,如果您使用替代方案,您将无法确定转换是否成功。如果转换不成功,它只会返回 false。如果你使用我的代码,你就能知道转换是否成功。
      • 好吧,如果转换不成功,它将返回 false。我根本不想争论你的观点,但如果一个人只是想得到结果,你可以这样做;)你的版本允许用户在尝试转换后做“任何事情”。
      【解决方案6】:

      我总是会解析它——你的应用程序应该对无效值具有鲁棒性(即使你“知道”你的数据库总是有效的):

      bool myVal;
      if (!Boolean.TryParse(value, out myVal))
      {
          throw new InvalidCastException(...); // Or do something else
      }
      

      【讨论】:

        【解决方案7】:

        如果您知道字符串将是有效的"true""false" 字符串,则首选您的第一种方法。

        否则,您可以使用Boolean.TryParse

        【讨论】:

          【解决方案8】:

          我在这里看到的唯一问题是 C# 会进行区分大小写的比较,所以如果数据库值为“True”

          (value == "true")
          

          将返回 false。

          但是看例子Boolean.Parse Method

          string[] values = { null, String.Empty, "True", "False", 
                                "true", "false", "    true    ", "0", 
                                "1", "-1", "string" };
            foreach (var value in values) {
               try {
                  bool flag = Boolean.Parse(value);
                  Console.WriteLine("'{0}' --> {1}", value, flag);
               }
               catch (ArgumentException) {
                  Console.WriteLine("Cannot parse a null string.");
               }   
               catch (FormatException) {
                  Console.WriteLine("Cannot parse '{0}'.", value);
               }         
            }            
          
          // The example displays the following output: 
          //       Cannot parse a null string. 
          //       Cannot parse ''. 
          //       'True' --> True 
          //       'False' --> False 
          //       'true' --> True 
          //       'false' --> False 
          //       '    true    ' --> True 
          //       Cannot parse '0'. 
          //       Cannot parse '1'. 
          //       Cannot parse '-1'. 
          //       Cannot parse 'string'.
          

          Bool.Parse 似乎更健壮一些。

          【讨论】:

          • 你应该使用 string.Equals()
          • @SamLeach - 我认为这不是练习的重点。其次,在这种情况下你不应该使用 TryParse 吗(从其他答案来看?)
          • 你绝对应该使用Boolean.TryParse()(见我的回答)但是如果你要比较字符串,你应该使用string.Equals()而不是==。这就是我的观点。
          • @SamLeach 既然字符串的== 运算符只调用string.Equals(),那么您为什么认为应该使用它呢?这同样适用于使用int.Equals() 而不是==
          • @SamLeach 在这个例子中我们没有使用对象;我们使用的是string,因此不适用多态差异。因此,使用string 时,Equals()== 完全相同。
          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2011-06-14
          • 2019-02-10
          • 2011-07-10
          • 1970-01-01
          • 2021-02-10
          • 1970-01-01
          • 2018-07-15
          相关资源
          最近更新 更多