Spiegare la sintassi C # a un vb-er
-
06-07-2019 - |
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
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.