【问题标题】:Please explain C# syntax to a vb-er请向 vb-er 解释 C# 语法
【发布时间】:2010-11-27 15:10:01
【问题描述】:

我有以下代码sn-p:

        // Notify the source (the other control).
        if (operation != DropOperation.Reorder) {
            e = new DroppedEventArgs()
            {
                Operation = operation == DropOperation.MoveToHere ? DropOperation.MoveFromHere : DropOperation.CopyFromHere,
                Source = src,
                Target = this,
                DroppedItems = srcItems
            };
            src.OnDropped(e);
        }

我不明白
Operation = operation == DropOperation.MoveToHere ? DropOperation.MoveFromHere : DropOperation.CopyFromHere 行。

谁能解释一下?作为记录... dropOperation 是一个枚举。 你能不能给 vb 语法等价的东西是我所需要的。

赛斯

【问题讨论】:

    标签: c# vb.net syntax ternary-operator


    【解决方案1】:

    之所以难以理解,是因为你对三元运算符 ?: 不熟悉。基本上它所做的是评估一个表达式,并根据评估是返回 true 还是 false 返回两个值之一。

    例如,如果布尔值为真,则以下表达式将返回“真”,否则返回“假”:

    bool test = false;
    string testString = test ? "true" : "false";
    

    它实际上也存在于 VB.NET 中——尽管表达方式有所不同。这两条分别在C#和VB.NET中的语句其实是一样的

    Dim s As String = If(True, "kek", "lol")
    string s = true ? "kek" : "lol";
    

    IIf 和三元运算符的区别在于 IIf 将始终计算第二个和第三个参数,因为 IIf 是一个函数而不是一个运算符。出于这个原因,三元运算符更受欢迎。

    注意:三元运算符是在 VB 9 中添加的,因此如果您使用以前的版本,则必须依赖 IIF 函数来实现此功能。

    【讨论】:

    • 有趣,不知道(我已经有几年没有编写过 VB.NET 了)。鉴于使用短路评估,这绝对比IIf 函数更受欢迎。
    • +1 用于建议 If 而不是 Iif !!!此外,如果具有类型安全的优点,则不需要进行强制转换。
    • 我认为您的代码中有错字。我没有看到Iif,只有If
    • 不是错字,if()是VB9的三元运算符。
    • 谢谢夸...做到了。并感谢 vb 的三元运算课程。我对iif非常熟悉。很高兴知道现在有一个简短的版本。赛斯
    【解决方案2】:
    If (operation = DropOperation.MoveToHere) Then
        Operation = DropOperation.MoveFromHere
    Else
        Operation = DropOperation.CopyFromHere
    End If
    

    【讨论】:

    • 很抱歉投了反对票,但 Qua 的回答确实应该高于这个。
    • @Joel Coehoorn:这是我听过的最奇怪的原因,但考虑到我只丢了 2 分,我不会对此大惊小怪 :-)
    • 我总是回来检查这些。对您的帖子进行无操作编辑,我现在可以撤消反对票。
    【解决方案3】:

    Obligatory wikipedia link。我放弃了在评论中提到这个链接,所以这里是一个答案。您可以替换 ?调用 IIF 函数的运算符:

    Operation = IIF(operation = DropOperation.MoveToHere, DropOperation.MoveFromHere, DropOperation.CopyFromHere)
    

    请注意,它们并不是严格等价的,因为 IIF 函数 会同时评估真假情况,而 ? operator 只评估它返回的情况。

    【讨论】:

    • If() 是严格等价的。没有理由使用 Iif,除非你被旧版本的 VB 卡住了。 Iif 也不是类型安全的。
    【解决方案4】:

    有点相当于 VB.NET 中的 IIf 函数(参见 Brian 的评论):

    Operation = IIf(operation = DropOperation.MoveToHere, _
                    DropOperation.MoveFromHere, _
                    DropOperation.CopyFromHere)
    

    在 C# 中,这称为 conditional operator,是一种简单 if/else 语句的快捷方式。

    【讨论】:

    • 请注意,它们并不是严格等价的,因为 IIF 函数 会同时评估真假情况,而 ? operator 只评估它返回的情况。
    • @Brian:因此文本相当于,但您的评论仍然增加了很好的价值。
    • If() 是严格等价的。没有理由使用 Iif,除非你被旧版本的 VB 卡住了。 Iif 也不是类型安全的。
    【解决方案5】:

    这是条件运算符,很像VB的IIf函数:

    根据表达式的计算返回两个对象之一。

    Public Function IIf( _
       ByVal Expression As Boolean, _ 
       ByVal TruePart As Object, _ 
       ByVal FalsePart As Object _ 
    ) As Object
    

    在这个特定的例子中,IIf 函数可以这样写:

    Operation = IIF((operation = DropOperation.MoveToHere), _
        DropOperation.MoveFromHere, _
        DropOperation.CopyFromHere)
    

    【讨论】:

    • 不应使用 IIF 函数,因为它会计算两个表达式。三元运算符没有。
    • VB9 有一个新的三元 If 运算符,这是一个更好的匹配。
    • @Qua:在这种情况下很好。真假部分只是枚举。
    • 确实如此,无需过多关注优化,值得一提的是,三元运算符是 ... 运算符,这意味着与 IFF 相比没有函数开销
    【解决方案6】:

    这是使用? operator 进行条件赋值。这一行基本上是语法糖:

    // C# expanded example
    if (operation == DropOperation.MoveToHere)
    {
       Operation = DropOperation.MoveFromHere;
    }
    else
    {
       Operation = DropOperation.CopyFromHere;
    }
    

    这在 VB 中相当于:

    If operation = DropOperation.MoveToHere Then
       Operation = DropOperation.MoveFromHere
    Else
       Operation = DropOperation.CopyFromHere
    End If
    

    【讨论】:

      【解决方案7】:
      operation == DropOperation.MoveToHere ? DropOperation.MoveFromHere : DropOperation.CopyFromHere
      

      这称为三元运算符。这基本上是一种简短的写作方式:

      if (operation == DropOperation.MoveToHere)
        return DropOperation.MoveToHere;
      else
        return DropOperation.CopyFromHere;
      

      【讨论】:

        【解决方案8】:

        ?: 构造是三元运算符,基本上是内联if (x) y else x。在这里可以看到内联的好处,因为它可以立即分配给一个变量。你不能用 if 语句来做到这一点。

        【讨论】:

          【解决方案9】:

          C# Blogger 使用“?”很多。看这段代码:

          int Foo(int x, int y){
          return x==y? 10: 11;
          }
          

          等于:

          int Foo(int x, int y){
          if (x==y)
          return 10; 
          else
          return 11;
          }
          

          只需阅读详细解释的甜甜圈的答案!

          (“VB-er”我喜欢这个词)

          【讨论】:

            【解决方案10】:

            它被称为ternary operator.,我认为它在 VB 中不存在,但它基本上只是 if/else 的简写。

            【讨论】:

              猜你喜欢
              • 2013-03-19
              • 1970-01-01
              • 1970-01-01
              • 2014-12-08
              • 1970-01-01
              • 1970-01-01
              • 2015-06-10
              • 2021-09-29
              相关资源
              最近更新 更多