【问题标题】:C# conditional operator - Call method if condition is true else do nothingC# 条件运算符 - 如果条件为真则调用方法,否则什么也不做
【发布时间】:2016-08-23 17:04:47
【问题描述】:

C# 提供conditional operator (?:),它根据布尔表达式的值返回两个值之一。例如

condition ? first_expression : second_expression;

我的问题是,当条件为真时,我们可以使用相同的语法来调用方法吗?当条件为假时什么都不做

 public void Work(int? val)
 {
   var list = new List<int>();

   //ofcourse line below doesn't work
   //but is it possible to call method when condition is true and else do  nothing

   val.HasValue? list.Add(val.value) : else do nothing
} 

【问题讨论】:

  • 你为什么想要那个?只需使用简单的if
  • 是的,你可以这样做......
  • @TylerNichols 看看你将如何完成它会很有趣......(因为你不能使用 ?: 而不将结果分配给开始的东西)
  • 如果您想内联,如果条件检查和设置变量或默认值但对于方法只需使用简单的If condition,我可以看到想要这样做
  • 你试过了吗?我认为你应该在问之前做出努力

标签: c#


【解决方案1】:

?: 过去也被称为三元运算符。三元,三个。如果是这样,那么就这样做,否则就这样做。

你有两个表达式。如果是这样,请执行此操作。这正是if 声明的重点。您正在尝试将您的案例放入一个并非设计用于的构造中。 不要这样做

对作业使用正确的操作:

if(val.HasValue)
{
    list.Add(val.value)
}

【讨论】:

  • OP 拥有正确的名称。它是 条件 运算符,而不是三元运算符。它是 a 三元运算符,因为它接受三个操作数,就像 + - * / 等都是二元运算符一样,因为它们接受两个操作数。
  • @Servy 在 VS2010 之后看起来像 changed the name。我仍然可以互换使用这些术语
  • 该页面将其称为条件运算符。它并没有说名称已更改。
【解决方案2】:

C# 条件运算符用于根据条件的评估返回不同的值。它并不意味着习惯于以您在问题中尝试的方式使用。它应该像这样使用:

int test = i > 3 ? 0 : 1;

如果i 小于(或等于)3,则test 将等于0,或者如果3 大于3,test 将等于1。

要做你想做的事,你必须使用常规的if 语句(顺便说一句,你仍然可以写在一行中):

if (val.HasValue) list.Add(val.value);

【讨论】:

  • 感谢大家的回复。那真是很好的信息。我以更一般的方式问了这个问题,看看我是否可以在条件运算符中调用任何方法。但对于这种特殊情况,我最终在列表上创建了扩展方法,在添加 public static void AddIfNotNull&lt;TValue&gt;(this IList&lt;TValue&gt; list, TValue val) { if (val != null) { list.Add(val); } } 之前检查值是否为空
【解决方案3】:

条件/三元运算符应该返回一个值,并且必须将非常具体的值分配回某个地方。

所以,在这种情况下,您可以这样做,是的。但是,这会导致糟糕的设计。

在一般情况下,人们会这样做:

int x = (a > b) ? a : b;

现在,假设 AddToList() 是条件呈现为 true 时所需的方法,而 DoRest() 是条件结果为 false 时要调用的方法。

在上述情况下,你最终会做这样的事情:

int result = val.HasValue? AddToList(val.value) : DoRest(); 

现在您必须依靠 result 来找出调用了哪一个(如果您需要的话),而且它的表达能力不是很强,也不能指出正确的代码设计。

如果你敢于冒险,你最终会得到:

var actionToInvoke = val.HasValue ? (Action)AddToList: (Action)DoRest;
actionToInvoke();

无论如何,这些都不会导致非常可读的代码。

所以,坚持使用简单的if(val.HasValue) 是最简单的方法。

【讨论】:

    【解决方案4】:

    空条件运算符的工作方式是您必须为分配给它的变量返回一个值。因此,如果您想要一个字符串值或 void 以外的其他值,您可以毫无问题地调用该方法。但是要调用void 方法,您可以使用委托。

      delegate void DelMethod();
    
            void Method() { }
    
            void MethodTwo() { }
    
            private void MyMethod()
            {
    
                DelMethod x;
    
                x = condition == true ? (DelMethod)Method : (DelMethod)MethodTwo;
    
            }
    

    【讨论】:

    • 虽然不禁止仅使用代码的答案,但请理解这是一个问答社区,而不是众包社区,并且通常,如果 OP 理解作为答案发布的代码,他/她会自己想出一个类似的解决方案,并且不会一开始就发布问题。同样的原则也适用于任何可能不熟悉所呈现代码的未来读者。因此,请通过解释其工作原理和/或原因来为您的答案和/或代码提供上下文。
    • @AlmightyR 抱歉。我认为这是一个简单易懂的代码。尽管如此编辑。
    • 哦,别误会我的意思;它是! (易于理解)但是,这仅适用于熟悉所使用的编程语言、原理和/或方法的人。不是每个人,或者至少不是提供代码的简单解释时可能的那么多人。这是在 SO 中没有完全禁止纯代码答案但仍然不推荐使用的众多原因之一,即使对于基本代码也是如此。 =) --- 无论如何,我认为你可以解释得更好,但这是一个好的开始。 +1 努力。
    猜你喜欢
    • 2017-05-13
    • 2015-01-24
    • 1970-01-01
    • 2022-01-04
    • 2020-05-29
    • 1970-01-01
    • 2019-01-17
    • 2020-06-25
    • 2022-10-24
    相关资源
    最近更新 更多