2009-09-11 66 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」我喜歡這個詞)