Question

I have the following code snippet:

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

I do not understand the
Operation = operation == DropOperation.MoveToHere ? DropOperation.MoveFromHere : DropOperation.CopyFromHere line.

Can someone explain it? For the record...dropOperation is an enum. Can you give vb syntactical equivalent is all I need.

Seth

Was it helpful?

Solution

The reason it's hard to understand is due to the fact that you're unfamiliar with the ternary operator ?:. Basically what it does is evaluate an expression, and return one of two value depending on whether the evaluation returned true or false.

For example, the following expression will return "true" if the boolean is true, and "false" elsewise:

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

It does in fact exist in VB.NET as well - expressed a bit differently though. These two statements in respectively C# and VB.NET are in fact the same

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

The difference between IIf and the tenary operator is that IIf will always evaluate both the second and third parameter because IIf is a function instead of an operator. For this reason the tenary operator is much to prefer.

Note: The tenary operator was added in VB 9, so if you're using previous versions you'll have to rely on the IIF function for this functionality.

OTHER TIPS

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

Obligatory wikipedia link. I gave up on mentioning this link in a comment, so here it is in an answer. You can replace uses of the ? operator with calls to the IIF function:

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

Note that they are not strictly equivalent, since the IIF function evaluates both the true and the false case, whereas the ? operator only evaluates the case it returns.

It is sort of equivalent of the IIf function in VB.NET (see Brian's comment):

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

In C# this is called the conditional operator, and is a sort of shortcut for a simple if/else statement.

This is the conditional operator, it is very similar to VB's IIf function:

Returns one of two objects, depending on the evaluation of an expression.

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

In this particular example the IIf function would be written like this:

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

This is using the ? operator for conditional assignment. This line is basically syntactic sugar for:

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

Which, in VB, would be equivalent to:

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

This is called the ternary operator. It's basically a short way of writing:

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

The ?: construct is the ternary operator, basically an inline if (x) y else x. The benefit of the inline is seen here in that it is assigned immediately to a variable. You can't do that with an if statement.

C# Bloggers use the "?" a lot. Look this code:

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

Is equal to:

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

Just read the well explained Donut's answer!!

("VB-er" I like the term)

It's called the ternary operator. I don't think it exists in VB but it's basically just a shorthand for an if/else.

Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top