Пожалуйста, объясните синтаксис C # для vb-er - PullRequest
2 голосов
/ 11 сентября 2009

У меня есть следующий фрагмент кода:

        // 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 - это перечисление. Можете ли вы дать В.Б.

Сет

Ответы [ 10 ]

15 голосов
/ 12 сентября 2009

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

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

7 голосов
/ 12 сентября 2009
If (operation = DropOperation.MoveToHere) Then
    Operation = DropOperation.MoveFromHere
Else
    Operation = DropOperation.CopyFromHere
End If
3 голосов
/ 12 сентября 2009

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

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

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

3 голосов
/ 12 сентября 2009

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

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

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

2 голосов
/ 12 сентября 2009

Это условный оператор, очень похож на функцию 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)
2 голосов
/ 12 сентября 2009

Используется оператор ? для условного присвоения. Эта строка в основном синтаксическая сахар для:

// 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
1 голос
/ 12 сентября 2009

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

1 голос
/ 12 сентября 2009

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

1 голос
/ 12 сентября 2009
operation == DropOperation.MoveToHere ? DropOperation.MoveFromHere : DropOperation.CopyFromHere

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

if (operation == DropOperation.MoveToHere)
  return DropOperation.MoveToHere;
else
  return DropOperation.CopyFromHere;
0 голосов
/ 12 сентября 2009

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

...