【问题标题】:string to bool inline conversion字符串到布尔内联转换
【发布时间】:2013-03-23 14:09:27
【问题描述】:

我目前拥有的:

bool okPress = !string.IsNullOrEmpty(Ctx.Request["okPress"]) &&
    Convert.ToBoolean(Ctx.Request["okPress"]);

如果我在这里错了,请纠正我,但如果字符串不是“true/True”或“false/False”,这不会抛出FormatException吗?有什么方法可以在一行中处理转换,而不必担心异常?还是我需要使用Boolean.TryParse

【问题讨论】:

  • 你已经回答了你自己的问题:使用Boolean.TryParse :-)
  • @dtb 好的,但是我不能使用上面的“内联解决方案”,对吧?
  • Boolean.TryParse 返回truefalsecannot parse。因此,您需要一行来进行通话,但要妥善处理每种情况,需要多行。
  • 不,那将是 2 线解决方案...你为什么这么关心它呢?您的主要优先事项应该是可读性和效率。
  • 但是您将如何使用 Boolean.TryParse 内联呢?你不能。是的,这就是你会得到的例外。

标签: c# asp.net string boolean


【解决方案1】:

你可以使用Boolean.TryParse:

bool okPress;
bool success = Boolean.TryParse(Ctx.Request["okPress"]), out okPress);

为了它的价值,这里是一个“单行”,创建以下扩展,这可能对 LINQ 查询特别有用:

public static bool TryGetBool(this string item)
{
    bool b;
    Boolean.TryParse(item, out b);
    return b; 
}

然后写:

bool okPress = Ctx.Request["okPress"].TryGetBool();

【讨论】:

  • 有什么理由一开始就声明 bool b 为假?它总是会被 TryParse 设置,不是这样,所以在传递它之前根本不需要初始化它......
  • @Chris:疼吗?我已经用false 对其进行了初始化,以显示TryGetBool 的默认值。
  • 它做了一点点......对我来说这意味着它正在做某事。例如,它正在设置默认值,因此如果您将其更改为 true,那么这就是新的默认值。话虽如此,您已经回答了我为什么要这样做的问题。我可能不同意你的观点,但我认为这可能只是个人编码偏好。 :)
  • 我不得不修复开发人员使用 intent 初始化变量的代码以丢弃初始化值(比上面的简单 out 稍微复杂一点),但忽略了一条从未重新分配的逻辑路径。当然,编译器并不关心,因为他们确实分配了一个默认的 invalid 值。我都赞成只分配重要的值。我还看到了很多类似上面的用法,其中没有经验的程序员分配一个初始值,认为这将是“解析失败时的默认值”,当然不是这样。
【解决方案2】:

如果你不想使用TryParse,你可以这样做

bool okPress = !string.IsNullOrEmpty(Ctx.Request["okPress"]) &&
(Ctx.Request["okPress"].ToLower()=="true");

这样,如果字符串不是真/假,它只会为您假定为假,不会抛出异常。

这当然假设您很高兴“鱼”的值被视为假而不是例外。

不过最好不要将其作为单行进行。您通常没有最大代码行数,因此两三行简单的代码通常比一行复杂的代码要好...

【讨论】:

    【解决方案3】:

    为什么不将字符串与true 进行比较?

    bool okPress = !string.IsNullOrEmpty(Ctx.Request["okPress"]) &&
        String.Compare(Ctx.Request["okPress"], "true", StringComparison.OrdinalIgnoreCase) == 0
    

    【讨论】:

    • 它基于 javascript confirm() 将返回“true”或“false”。
    【解决方案4】:

    你可以按照你说的使用Boolean类的TryParse方法。

    尝试将指定的字符串表示形式转换为逻辑 值到它的布尔等效值。返回值指示是否 转换成功或失败。

    bool result = Boolean.TryParse(Ctx.Request["okPress"]), out okPress);
    

    如果值转换成功,则返回true;否则,false

    【讨论】:

      【解决方案5】:

      您的内联转换。

          public static bool TryParseAsBoolean(this string expression)
          {
              bool booleanValue;
      
              bool.TryParse(expression, out booleanValue);
      
              return booleanValue;
          }
      
          bool okPress =  Ctx.Request["okPress"].TryParseAsBoolean();
      

      【讨论】:

      • TryParse 的全部目的是避免可能的异常。所以你的代码没有多大意义。你永远不会进入Catch 块。
      • 你是对的,当你同时做很多事情时会发生这种情况。感谢您指出这一点:)
      • 既然是在字符串上使用,不应该是this string吗?
      猜你喜欢
      • 2015-11-30
      • 2014-09-21
      • 2018-09-07
      • 2014-06-02
      • 1970-01-01
      • 2021-05-07
      • 2012-03-10
      • 2015-02-23
      • 2012-12-16
      相关资源
      最近更新 更多