【问题标题】:Understanding assignment/comparison vb.net了解分配/比较 vb.net
【发布时间】:2013-01-21 19:23:46
【问题描述】:

这是我第一次使用 Stack Overflow,我想了解这段代码最后一行中“=”的含义:

Dim label As Label = Me.labels.Item(String.Concat(New Object() { movimiento.Sector1.ID, "-", movimiento.X1, "-", movimiento.Y1 }))
Dim dictionary As Dictionary(Of Label, Integer)
Dim label3 As Label
dictionary = Me.demandas2.Item(label3 = label) = (dictionary.Item(label3) - 1)

欢迎任何形式的帮助,在此先感谢!

【问题讨论】:

    标签: vb.net comparison-operators


    【解决方案1】:

    等号 (=) 用于 VB.NET 中两个完全不同的运算符。它用作赋值运算符以及相等测试运算符。字符求值的运算符取决于上下文。所以,例如,在这个例子中:

    Dim x As Integer = 1
    Dim y As Integer = 2
    Dim z As Integer = x = y
    

    您可能会认为,与在其他语言(例如 C#)中一样,在执行该代码后,xyz 都将等于 2。但是,VB 将第二个等号视为相等测试运算符。因此,实际上,它是这样做的:

    If x = y Then
        z = True
    Else
        z = False
    End If
    

    不过,您会注意到,我们正在尝试将布尔值分配给整数变量。如果你有Option Strict On(你应该),它不会允许你这样做。如果这真的是你想要做的,它会强制你将它转换为一个整数,这使得它稍微更明显:

    z = CInt(x = y)
    

    但是,它仍然令人困惑,因此通常情况下,这种事情在 VB.NET 中是不鼓励的。所以,我怀疑如果 Option Strict 已打开,您发布的代码甚至不会编译。但是,这正是它真正想要做的:

    Dim temp1 As Boolean = (label3 = label) ' Evaluates to False
    Dim temp2 As Boolean = (Me.demandas2.Item(temp1) = (dictionary.Item(label3) - 1)) ' Likely evaluates to False
    dictionary = temp2 ' Couldn't possibly be a valid assignment
    

    【讨论】:

      【解决方案2】:

      我们来看这行代码:

      dictionary = Me.demandas2.Item(label3 = label) = (dictionary.Item(label3) - 1)
      

      第一个= 是一个赋值。所以我们将正确的部分分配给字典。现在是正确的部分:

      Me.demandas2.Item(label3 = label) = (dictionary.Item(label3) - 1)
      

      两个表达式之间的= 是一个比较,所以它返回一个布尔值。因此,假定的“字典”被分配了一个布尔值。如果我们检查那个表达式的左边部分:

      Me.demandas2.Item(label3 = label)
      

      再一次,这里的= 符号是在进行比较,所以如果label3label 相同,那么代码将等同于Me.semandas2.Item(True)。这看起来很奇怪。

      总的来说,这段代码没有多大意义,如果它编译我会感到惊讶,因为它试图将布尔值分配给字典。它肯定不会用Option Strict On 编译。

      【讨论】:

      • +1 表示this code doesn't make much sense。尝试研究不良代码的良好做法被认为是一种不良做法。
      【解决方案3】:

      非常感谢大家。 sn-p 是反编译 dll 的结果。我试图帮助一个合作伙伴。

      .Net反射器基于VB.Net代码反编译,这是一个错误。 最后我们看到,首先它应该使用 C# 代码进行反编译,这给代码赋予了完全不同的含义:

      if (movimiento.Contenedor.Demanda2)
          {
              Dictionary<Label, int> dictionary;
              Label label3;
              (dictionary = this.demandas2)[label3 = label] = dictionary[label3] - 1;
              if (this.demandas2[label] == 0)
              {
                  label.ForeColor = Color.Black;
              }
              (dictionary = this.demandas2)[label3 = label2] = dictionary[label3] + 1;
              label2.ForeColor = Color.DarkOrange;
          }
      

      【讨论】:

        猜你喜欢
        • 2017-08-04
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多