【问题标题】:Streamlining If statement c# [closed]简化 If 语句 c# [关闭]
【发布时间】:2012-07-12 14:30:19
【问题描述】:

我正在尝试使用此语句

status_label.Text = err.Message + " || " + err.InnerException == null ? " " : err.InnerException.Message;

基本上如果有 InnerException 因为它不为空,则显示它,如果为空则不输出任何内容。

这是我认为可以做到的精简

 status_label.Text = err.Message;
 if (err.InnerException != null)
     status_label.Text += " || " + err.InnerException.Message;

干杯。

【问题讨论】:

  • 你的问题是?
  • 好像没有问题。
  • 我更喜欢你未精简的代码。更容易阅读,这将使其更易于维护和理解。
  • 我没有看到重构代码有很大的好处。不过,您的连接应该变成 string.Format(),因为字符串在 .Net 中是不可变的......(请参阅 J Torres 的帖子)。
  • 很抱歉在工作,我没有多少时间,所以在这个特殊的场合我没有正确阅读这个问题,但它仍然得到了真正的回答,我得到了需要的确切答案.谢谢大家

标签: c# visual-studio-2010 object if-statement


【解决方案1】:

改用这个:

status_label.Text =  err.InnerException == null 
    ? err.Message
    : err.Message + " || " + err.InnerException.Message;

【讨论】:

  • 感谢@NominSim 的编辑。
  • 当 InnerException 不为空时,这不包括“||”。
  • 这可能是建议的解决方案中最干净的,除非您是“无串联”的纯粹主义者。
  • 问题是它,它不需要高度可读,简短的评论会准确说明它的作用,所以这是完美的解决方案!输出到标签的代码的可读性不是必需的,但这仍然很好地涵盖了这方面!
  • @No1_Melman 你的逻辑有问题——使用 cmets 代替可读代码是一个糟糕的策略。然而,这个答案不需要额外的评论。
【解决方案2】:

您缺少三元运算符周围的括号

status_label.Text = err.Message + " || " + (err.InnerException == null ? " " : err.InnerException.Message); 

或者,如果你不想要 ||在 null 内部异常的情况下

status_label.Text = err.Message + (err.InnerException == null ? "" : " || " + err.InnerException.Message); 

【讨论】:

  • 这将包括“||”,即使 InnerException 为空。
【解决方案3】:

首先,你的 if 语句应该是这样的

status_label.Text = err.Message;
 if (err.InnerException != null)
     status_label.Text += " || " + err.InnerException.Message;

至于让它比这更精简,您可以使用条件和/或空值合并,但这是完全可读的。

但是,如果您愿意,也可以这样做。

status_label.Text = string.Concat(err.Message, err.InnerException == null ? string.Empty : " || " + err.InnerException.Message);

是不是更简洁了?不是真的。

【讨论】:

    【解决方案4】:

    这应该可以解决问题:

    status_label.Text = string.Format("{0}{1}", err.Message, err.InnerException != null ? string.Format(" || {0}", err.InnerException.Message) : string.Empty);
    

    【讨论】:

    • +1:哈。我正在输入这个 -exact- 答案。
    • 我想知道为什么有人不赞成这个......
    • 不是一个downvoter,但我发现这里的可读性受到影响:string.Format 嵌套在一个嵌套在另一个 string.Format 中的三元组中。
    • 我同意这不是有史以来最优雅的代码,但 OP 并没有要求优雅......他们要求“如何”。当提供的解决方案是最节省内存和最正确的解决方案时,人们投反对票有点粗鲁。它就是这样。
    【解决方案5】:

    只是一个想法,如果您不介意打印完整的异常,您可以这样做:

    status_label.Text = err.ToString();
    status_label.Text += err.InnerException;
    

    (请记住,这将在每个异常前面放置一个“系统异常:”或类似内容。)

    否则,您的代码看起来已经足够精简了。 (可读性有时比紧凑性更可取。)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-12-01
      • 2019-04-12
      • 2015-09-12
      • 1970-01-01
      相关资源
      最近更新 更多