请向 vb-er 解释 C# 语法

Posted

技术标签:

【中文标题】请向 vb-er 解释 C# 语法【英文标题】:Please explain C# syntax to a vb-er 【发布时间】: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 语法等价的东西是我所需要的。

赛斯

【问题讨论】:

【参考方案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 的简写。

【讨论】:

以上是关于请向 vb-er 解释 C# 语法的主要内容,如果未能解决你的问题,请参考以下文章

请向我解释以下自动布局行为

Perl:请向我解释一下 while() 的以下行为

请向我解释错误的性质:由于未捕获的异常“NSInvalidArgumentException”而终止应用程序

请向我解释 AWS 服务每 GB IN 带宽 0.00 美元的定价

=> 语法的用法和解释[重复]

ExpressionChangedAfterItHasBeenCheckedError 解释