Reputation: 77
Could I (and if so how) do the following in .NET language (more specifically VB.NET):
Dim a,b as Integer
if(somecondition=1,a,b) = 12345
Or any variant with IIF would be fine by me. Basically I'm always assign the same value but never to the same variable..
Upvotes: 0
Views: 688
Reputation: 4657
What you're asking to do would have been possible in a language that supports pointer types (such as C/C++, or C# in unsafe mode) with dereferencing; VB.NET doesn't do that. The best you got to leverage is local variables, reference types, and (perhaps) ByRef
.
If it's a Class
, its instantiation is a reference type. Structure
and Integer
are each a value type.
For most reference types, you could just set a local variable equal to whichever variable was of interest, and then go ahead and set its properties or call its methods confident that the instantiation affected is the one desired. The one exception to this is when the reference is to an immutable type, such as String
.
Dim a, b As New System.Text.StringBuilder()
Dim sb As System.Text.StringBuilder = If(somecondition = 1, a, b)
sb.Append("OK!")
Actually, one doesn't necessarily need a local variable with reference types.
' Method 2
Call If(somecondition = 1, a, b).Append("OK!")
' Method 3
With If(somecondition = 1, a, b)
.Append("OK!")
End With
For value types (and immutable classes), you're rather stuck. Mostly all one can do is make use of a local variable as a proxy, just as Jon Skeet has suggested.
A pattern I sometimes use myself:
Dim a, b As Integer
If True Then
Dim _v As Integer = 12345
If somecondition = 1 Then a = _v Else b = _v
End If
Note the use of If True Then
- this is so the lifetime of _v
ends at the End If
. The "so what" of that is to avoid either: (1) having a long list of temporary variables; or (2) taking the chance of common coding mistakes that involve the reuse of temporary variables. The temporary variable name (e.g. "_v") can then be reused, even as a different data type, because it will be a different variable to the compiler.
Upvotes: 2
Reputation: 6542
Not in VB, but since assignment in C# returns the value assigned, you can do the following in C# (since you mentioned 'any .NET language'):
int unused = (someCondition ? a = 123 : b = 123);
Upvotes: 0
Reputation: 1500215
No, I don't believe there's any way of doing that in VB. Conditional operators (such as If(x, y, z)
) are designed to evaluate one expression or the other based on a condition. In other words, it's the result that's conditional, not the use of it.
Just use a normal If
statement:
If somecondition Then
a = 12345
Else
b = 12345
End If
Or to avoid repeating the value (e.g. if it's a more complicated expression):
Dim value As Integer = 12345
If somecondition Then
a = value
Else
b = value
End If
Upvotes: 3