2009-09-11 51 views
2

我有下面的代码片段:请解释C#语法到VB-ER

 // 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语法等价是我需要的吗?

赛斯

回答

15

难以理解的原因是因为您不熟悉三元运算符?:。基本上它是评估表达式,并返回两个值中的一个,具体取决于评估是否返回truefalse

例如,下面的表达式将返回“真”如果布尔是真实的,“假” elsewise:

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和在tenary运营商之间的不同之处在于I如果将始终评估第二和第三个参数,因为I如果是一个函数,而不是一个运营商。基于这个原因,这位十字运营商非常喜欢。

:本tenary运营商在VB 9增加,所以如果你使用以前的版本,你必须依靠IIF函数实现此功能。

+2

有趣,不知道(我几年来没有编写过VB.NET)。这个肯定比'IIf'功能更适合使用短路评估。 – 2009-09-11 20:18:18

+1

+1表示如果不是Iif !!!!另外,如果具有类型安全的优点,则不需要执行演员表演。 – 2009-09-11 20:21:53

+0

我认为你在代码中有一个错字。我没有看到'Iif',只有'If'。 – 2009-09-11 20:25:16

2

这是使用? 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
If (operation = DropOperation.MoveToHere) Then 
    Operation = DropOperation.MoveFromHere 
Else 
    Operation = DropOperation.CopyFromHere 
End If 
+0

对不起downvote,但第四纪的回答确实应该得分高于此一个。 – 2009-09-11 20:18:12

+0

@Joel Coehoorn:这是我听过的最奇怪的原因,但考虑到我只输了2分,我不会在这里大惊小怪:-) – 2009-09-11 20:35:39

+0

我总是回来看看这些。对你的帖子做一个无操作编辑,我现在可以撤消downvote。 – 2009-09-11 23:42:24

1
operation == DropOperation.MoveToHere ? DropOperation.MoveFromHere : DropOperation.CopyFromHere 

这就是所谓的三元运算符。它基本上写的一小段路:

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

在Basic中没有'=='。 – 2009-09-11 20:07:53

+1

@Cristian:他的回应是C#代码。没关系。 – Brian 2009-09-11 20:11:38

0

这就是所谓的ternary operator.我不认为它存在于VB,但它基本上只是一个if/else语句的简写。

2

这是有条件的经营者,这是非常类似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) 
+1

不应使用IIF函数,因为它会评估两个表达式。运营商不会。 – 2009-09-11 20:11:36

+0

VB9有一个新的三元如果运算符是一个更好的匹配。 – 2009-09-11 20:13:05

+0

@ Qua:在这种情况下很好。真假部分只是枚举。 – Brian 2009-09-11 20:13:18

1

?:构建体是三元运算符,基本上直列if (x) y else x。内联的好处在于它被立即分配给一个变量。你不能用if语句来做到这一点。

3

Obligatory wikipedia link。我放弃了在评论中提及这个链接,所以在这里有一个答案。您可以替换使用?操作者调用的IIF函数:

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

注意,他们不是完全等同,因为IIF 功能会评估真实与虚假的情况下,而? 运营商只评估它返回的情况。

+0

If()虽然是严格等价的。没有理由使用Iif,除非你使用老版本的VB。 Iif也不安全。 – 2009-09-11 20:18:49

3

这是排序相当于IIf功能的VB.NET(见布赖恩的评论)的:

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

在C#这就是所谓的conditional operator,并且是一种快捷的一个简单的,如果/ else语句。

+4

请注意,它们不是完全等价的,因为IIF **函数**既评估真实情况,也评估错误情况, **运算符**仅评估返回的情况。 – Brian 2009-09-11 20:08:33

+0

@Brian:因此文本*等价的*种类,但你的评论仍然增加了很好的价值。 – 2009-09-11 20:10:44

+1

If()虽然严格等价。没有理由使用Iif,除非你使用老版本的VB。 Iif也不安全。 – 2009-09-11 20:19:45

1

C#博主使用“?”很多。看看下面的代码:

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”我喜欢这个词)