Pergunta

Eu tenho o seguinte trecho de código:

        // 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);
        }

Eu não entendo o
linha Operation = operation == DropOperation.MoveToHere ? DropOperation.MoveFromHere : DropOperation.CopyFromHere.

Alguém pode explicar isso? Para o registro ... dropOperation é uma enumeração. Pode você dar vb sintática equivalente é tudo necessidade I.

Seth

Foi útil?

Solução

A razão é difícil de entender é devido ao fato de que você não estiver familiarizado com o operador ternário?:. Basicamente o que ele faz é avaliar uma expressão, e retornar um dos dois valores, dependendo se a avaliação retornou true ou false .

Por exemplo, a seguinte expressão retornará "true" se o booleano é verdadeiro, e "false" elsewise:

bool test = false;
string testString = test ? "true" : "false";

Ele faz em exist fato em VB.NET bem - expressa um pouco diferente embora. Estas duas declarações em, respectivamente, C # e VB.NET são na verdade a mesma

Dim s As String = If(True, "kek", "lol")
string s = true ? "kek" : "lol";

A diferença entre IIf eo operador tenary é que IIf sempre vai avaliar tanto o segundo e terceiro parâmetro porque IIf é uma função em vez de um operador. Por esta razão, o operador tenary é muito preferir.

Nota : O operador tenary foi adicionado no VB 9, por isso, se você estiver usando versões anteriores você terá que contar com a função IIF para essa funcionalidade.

Outras dicas

If (operation = DropOperation.MoveToHere) Then
    Operation = DropOperation.MoveFromHere
Else
    Operation = DropOperation.CopyFromHere
End If

obrigatório wikipedia ligação . Eu desisti de mencionar este link em um comentário, por isso aqui está em uma resposta. Você pode substituir usos do? operador com chamadas para a função IIF:

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

Note que não são estritamente equivalente, desde o IIF função avalia tanto o verdadeiro eo falso caso, enquanto que o? operador avalia apenas o caso ele retorna.

É tipo de equivalente do IIf função em VB.NET (veja o comentário de Brian):

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

Em C # isso é chamado de condicional operador , e é uma espécie de atalho para um simples if / else.

Este é o operador condicional, é muito semelhante à do VB IIf função:

Retorna um dos dois objetos, dependendo da avaliação de uma expressão.

Public Function IIf( _
   ByVal Expression As Boolean, _ 
   ByVal TruePart As Object, _ 
   ByVal FalsePart As Object _ 
) As Object

Neste exemplo em particular a função IIf seria escrito assim:

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

Isso é usar o operador ? para atribuição condicional. Esta linha é o açúcar, basicamente, sintático para:

// C# expanded example
if (operation == DropOperation.MoveToHere)
{
   Operation = DropOperation.MoveFromHere;
}
else
{
   Operation = DropOperation.CopyFromHere;
}

O que, em VB, seria equivalente a:

If operation = DropOperation.MoveToHere Then
   Operation = DropOperation.MoveFromHere
Else
   Operation = DropOperation.CopyFromHere
End If
operation == DropOperation.MoveToHere ? DropOperation.MoveFromHere : DropOperation.CopyFromHere

Este é chamado o operador ternário. É basicamente uma pequena maneira de escrever:

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

A construo ?: é o operador ternário, basicamente um if (x) y else x em linha. O benefício da linha é visto aqui na medida em que é atribuído imediatamente a uma variável. Você não pode fazer isso com uma declaração se.

C # Bloggers usar o "?" muito. Olhe este código:

int Foo(int x, int y){
return x==y? 10: 11;
}

é igual a:

int Foo(int x, int y){
if (x==y)
return 10; 
else
return 11;
}

Basta ler o bem explicado resposta de Donut !!

( "VB-er" Eu gosto do termo)

É o chamado ternário operador. Eu não acho que ela existe em VB, mas é basicamente um atalho para um if / else.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top