【问题标题】:.NET use IIF to assign value to different variables.NET 使用 IIF 为不同的变量赋值
【发布时间】:2015-08-31 06:15:39
【问题描述】:

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

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

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

【问题讨论】:

  • 你不能使用这样的结构。但是,您可以使用这样的单行语句:If somecondition = 1 Then a = 12345 Else b = 12345
  • 我显然简化了我的问题(示例),但它更复杂并且涉及多个条件;加上我的值不像我的例子那样静态..因此我想实际上避免使用多个 Ifs..
  • 如果您的情况比较复杂,很难看出您希望如何以这种方式简化它。也许您应该将示例编辑得更复杂一些。

标签: .net vb.net conditional variable-assignment iif


【解决方案1】:

不,我不相信在 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

【讨论】:

  • 查看我对原帖的评论
  • @jplanglais:这并不能改变你做不到的事实。您可以避免事先使用局部变量重复该值,但仅此而已。
【解决方案2】:

不是在 VB 中,但由于 C# 中的赋值返回分配的值,您可以在 C# 中执行以下操作(因为您提到了“任何 .NET 语言”):

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

【讨论】:

  • 不太一样 - OP 希望这里有某种 DRY 模式。也许更像*((someCondition==1)? &a : &b) = 12345
【解决方案3】:

在支持指针类型(例如 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 结束。 “那又怎样”是为了避免:(1)拥有一长串临时变量;或 (2) 抓住涉及临时变量重用的常见编码错误的机会。然后可以重用临时变量名称(例如“_v”),即使作为不同的数据类型,因为它对于编译器来说是不同的变量。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-02-25
    • 2020-07-28
    • 1970-01-01
    • 2023-03-12
    • 2017-02-19
    • 2014-05-16
    • 2015-01-11
    相关资源
    最近更新 更多