.NET 使用 IIF 为不同的变量赋值

.NET use IIF to assign value to different variables

我可以(如果可以的话)用 .NET 语言执行以下操作(更具体地说 VB.NET):

Dim a,b as Integer
if(somecondition=1,a,b) = 12345

或者任何带有 IIF 的变体对我来说都可以。 基本上我总是分配相同的值但从不分配给相同的变量..

不,我认为在 VB 中没有任何方法可以做到这一点。条件运算符(例如 If(x, y, z))旨在根据条件计算一个 表达式 或另一个。换句话说,是有条件的结果,而不是使用它。

只需使用正常的 If 语句:

If somecondition Then
    a = 12345
Else
    b = 12345
End If

或者为了避免重复值(例如,如果它是一个更复杂的表达式):

Dim value As Integer = 12345
If somecondition Then
    a = value
Else
    b = value
End If

不在 VB 中,但由于在 C# 中赋值 returns 赋值,您可以在 C# 中执行以下操作(因为您提到了 'any .NET language'):

int unused = (someCondition ? a = 123 : b = 123);

如果使用支持指针类型(例如 C/C++,或不安全模式下的 C#)并取消引用的语言,您的要求就可以实现; VB.NET 不会那样做。你能利用的最好的是局部变量、引用类型和(也许)ByRef

如果是Class,它的实例化是一个引用类型。 StructureInteger 都是值类型。

对于大多数引用类型,您可以只设置一个局部变量等于任何感兴趣的变量,然后继续设置它的属性或调用它的方法,确信受影响的实例化是所需的。一个例外是当引用指向不可变类型时,例如 String.

    Dim a, b As New System.Text.StringBuilder()
    Dim sb As System.Text.StringBuilder = If(somecondition = 1, a, b)
    sb.Append("OK!")

实际上,不一定需要引用类型的局部变量。

    ' Method 2
    Call If(somecondition = 1, a, b).Append("OK!")

    ' Method 3
    With If(somecondition = 1, a, b)
        .Append("OK!")
    End With

对于值类型(和不可变的 类),你相当卡住了。正如 Jon Skeet 所建议的那样,大多数人所能做的就是使用局部变量作为代理。

我自己有时会用的一个模式:

    Dim a, b As Integer
    If True Then
        Dim _v As Integer = 12345
        If somecondition = 1 Then a = _v Else b = _v
    End If

请注意 If True Then 的使用 - 这是 _v 的生命周期结束于 End If。 "so what" 是为了避免:(1) 有一长串临时变量; (2) 冒着涉及临时变量重用的常见编码错误的风险。然后可以重用临时变量名称(例如“_v”),即使作为不同的数据类型,因为它对于编译器来说是不同的变量。