Domanda

Ho il seguente frammento di codice:

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

Non capisco la
Operazione = operazione == DropOperation.MoveToHere? DropOperation.MoveFromHere: riga DropOperation.CopyFromHere .

Qualcuno può spiegarlo? Per la cronaca ... dropOperation è un enum. Riesci a dare l'equivalente sintattico in vb è tutto ciò di cui ho bisogno.

Seth

È stato utile?

Soluzione

Il motivo per cui è difficile da capire è dovuto al fatto che non hai familiarità con l'operatore ternario?:. Fondamentalmente ciò che fa è valutare un'espressione e restituire uno dei due valori a seconda che la valutazione abbia restituito vero o falso .

Ad esempio, la seguente espressione restituirà " true " se il valore booleano è true e "false" elsewise:

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

In realtà esiste anche in VB.NET, espresso in modo leggermente diverso. Queste due affermazioni rispettivamente in C # e VB.NET sono in realtà le stesse

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

La differenza tra IIf e l'operatore tenario è che IIf valuterà sempre sia il secondo che il terzo parametro poiché IIf è una funzione anziché un operatore. Per questo motivo l'operatore tenore è molto da preferire.

Nota : l'operatore tenore è stato aggiunto in VB 9, quindi se stai utilizzando versioni precedenti dovrai fare affidamento sulla funzione IIF per questa funzionalità.

Altri suggerimenti

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

Link wikipedia obbligatorio . Ho rinunciato a menzionare questo link in un commento, quindi eccolo in una risposta. È possibile sostituire gli usi del? operatore con chiamate alla funzione IIF:

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

Nota che non sono strettamente equivalenti, dal momento che la funzione IIstrong valuta sia il caso vero che falso, mentre il? operatore valuta solo il caso restituito.

È una specie di equivalente del < code> IIf in VB.NET (vedi il commento di Brian):

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

In C # questo è chiamato operatore condizionale , ed è una sorta di scorciatoia per una semplice istruzione if / else.

Questo è l'operatore condizionale, è molto simile al IIf funzione:

  

Restituisce uno dei due oggetti, a seconda della valutazione di un'espressione.

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

In questo esempio particolare la funzione IIf verrebbe scritta in questo modo:

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

Questo utilizza ? operatore per assegnazione condizionale. Questa linea è sostanzialmente zucchero sintattico per:

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

Che, in VB, equivarrebbe a:

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

Questo si chiama operatore ternario. Fondamentalmente è un modo breve di scrivere:

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

Il costrutto ?: è l'operatore ternario, sostanzialmente un in linea se (x) y else x . Il vantaggio dell'inline è visto qui in quanto è assegnato immediatamente a una variabile. Non puoi farlo con un'istruzione if.

I blogger di C # usano "? " Un sacco. Guarda questo codice:

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

È uguale a:

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

Basta leggere la risposta ben spiegata di Donut !!

(" VB-er " mi piace il termine)

Si chiama operatore ternario. Non penso che esista in VB ma è fondamentalmente solo una scorciatoia per un if / else.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top