Пожалуйста, объясните синтаксис C # для vb-er
-
06-07-2019 - |
Вопрос
У меня есть следующий фрагмент кода:
// 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 - это все, что мне нужно.
Сет
Решение
Причина, по которой это трудно понять, заключается в том, что вы не знакомы с троичным оператором ?:.В основном то, что он делает, это вычисляет выражение и возвращает одно из двух значений в зависимости от того, вернула ли оценка верно или ложь.
Например, следующее выражение вернет "true", если логическое значение равно 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 - это функция, а не оператор.По этой причине гораздо предпочтительнее использовать тенарный оператор.
Примечание:Оператор tenary был добавлен в VB 9, поэтому, если вы используете предыдущие версии, вам придется полагаться на функцию IIF для этой функциональности.
Другие советы
If (operation = DropOperation.MoveToHere) Then
Operation = DropOperation.MoveFromHere
Else
Operation = DropOperation.CopyFromHere
End If
Обязательная ссылка на википедию.Я отказался от упоминания этой ссылки в комментарии, так что вот она в ответе.Вы можете заменить использование ?оператор с вызовами функции IIF:
Operation = IIF(operation = DropOperation.MoveToHere, DropOperation.MoveFromHere, DropOperation.CopyFromHere)
Обратите внимание, что они не являются строго эквивалентными, поскольку IIF функция оценивает как истинный, так и ложный случай, тогда как ? оператор оценивает только тот случай, который он возвращает.
Это так вроде того эквивалент IIf
функция в VB.NET (см. Комментарий Брайана):
Operation = IIf(operation = DropOperation.MoveToHere, _
DropOperation.MoveFromHere, _
DropOperation.CopyFromHere)
В C # это называется условный оператор, и является своего рода сокращением для простого оператора if /else .
Это условный оператор, он очень похож на VB's 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)
Это использование ?
оператор для условного присвоения.Эта строка в основном является синтаксическим сахаром для:
// 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
operation == DropOperation.MoveToHere ? DropOperation.MoveFromHere : DropOperation.CopyFromHere
Это называется троичным оператором.По сути, это краткий способ написания:
if (operation == DropOperation.MoveToHere)
return DropOperation.MoveToHere;
else
return DropOperation.CopyFromHere;
В ?:
construct - это троичный оператор, в основном встроенный if (x) y else x
.Преимущество inline здесь проявляется в том, что оно немедленно присваивается переменной.Вы не можете сделать это с помощью оператора if .
Блоггеры 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" Мне нравится этот термин)
Это называется троичный оператор. Я не думаю, что это существует в VB, но по сути это просто сокращение для if / else .