2009-09-11 3 views
2

У меня есть следующий фрагмент кода:Пожалуйста, объясните синтаксис C# на VB-эр

 // 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

Причина, по которой трудно понять, связана с тем, что вы не знакомы с тернарным оператором?:. В основном, это выражение выражает и возвращает одно из двух значений в зависимости от того, вернулась ли оценка true или false.

Например, следующее выражение возвращает «истина», если логическое значение истинно, и «ложь» 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 оператора является то, что IIf всегда будет оценивать как второй и третий параметр, потому что IIf является функцией вместо оператор. По этой причине многообещающий оператор предпочитает.

Примечание: Оператор тендера был добавлен в VB 9, поэтому, если вы используете предыдущие версии, вам придется полагаться на функцию IIF для этой функции.

+2

Интересно, не знал, что (я не кодировал VB.NET через пару лет). Это определенно предпочтительнее функции 'IIf', учитывая, что используется оценка короткого замыкания. –

+1

+1 за предложение Если вместо Iif !!!! Кроме того, If имеет то преимущество, что он безопасен по типу, вам не нужно делать броски. –

+0

Я думаю, что у вас есть опечатка в коде. Я не вижу 'Iif', только' If'. –

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, но ответ ква должен действительно забить выше этого. –

+0

@Joel Coehoorn: это самая странная причина, которую я когда-либо слышал, но учитывая тот факт, что я потерял всего 2 очка, я не буду суетиться по этому поводу :-) –

+0

Я всегда возвращаюсь и проверяю их. Сделайте редактирование no-op на свой пост, и теперь я могу отменить downvote. –

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

Это называется тройной оператор. Это в основном короткий путь написания:

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

В Basic нет '==' в Basic. –

+1

@Cristian: Его ответ - код C#. Все нормально. – Brian

0

Это называется ternary operator. я не думаю, что она существует в VB, но это в основном просто сокращение для если/другое.

2

Это условный оператор, он очень похож на IIf функции VB в:

Возвращает один из двух объектов, в зависимости от оценки выражения.

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, поскольку она оценивает оба выражения. Оператор тендера не делает этого. –

+0

У VB9 есть новый тройной оператор, который лучше подходит. –

+0

@ Qua: В этом случае все в порядке. Истинная и ложная часть - это просто перечисления. – Brian

1

?: конструкция является тройной оператор, в основном инлайн if (x) y else x. Преимущество встроенного интерфейса видно здесь, поскольку оно сразу назначается переменной. Вы не можете сделать это с помощью оператора if.

3

Obligatory wikipedia link. Я отказался от упоминания этой ссылки в комментарии, так что вот она в ответе. Вы можете заменить использование? оператор с вызовами функции IIF:

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

Обратите внимание, что они не являются строго эквивалентны, так как функция IIF оценивает как истинный и ложный случай, тогда как? Оператор оценивает только тот случай, который он возвращает.

+0

Если() строго эквивалентно. Нет причин использовать Iif, если вы не застряли со старой версией VB. Iif также не безопасен для типа. –

3

Это рода эквивалент функции IIf в VB.NET (см комментарий Брайана):

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

В C# это называется conditional operator, и является своего рода ярлык для простого, если/else.

+4

Обратите внимание, что они не являются строго эквивалентными, так как функция IIF ** оценивает как истинный, так и ложный случай, тогда как? ** оператор ** оценивает только тот случай, который он возвращает. – Brian

+0

@Brian: отсюда текст * вид эквивалента *, но все же ваш комментарий добавляет хорошее значение. –

+1

Если() строго эквивалентно. Нет причин использовать Iif, если вы не застряли со старой версией VB. Iif также не безопасен для типа. –

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-эр» Мне нравится этот термин)

Смежные вопросы