【问题标题】:Checking if a Bool is Equal to an Integer检查布尔值是否等于整数
【发布时间】:2014-12-13 12:39:56
【问题描述】:

好的,所以我在一家公司工作,在我被聘用之前,该公司有一个人在用 Visual Basic 编写程序。但是,他生气了,跑了,所以我无法和他交流。我的工作是将他的程序转换为 C#。他没有接受过正式的编程培训,因此他的代码中根本没有 cmets。在他的代码中,他有以下行(用 C# 编写):

if (boolVariable == 13)

我假设我应该将 int 转换为 bool,反之亦然,但我想我会先问你们。为了给您更多信息,boolVariable 仅在另外两个地方被引用。它被设置为 false 的声明,并在另一个 if 语句中检查它是否为 true。代码中没有其他地方被定义为其他东西,所以我认为这可能是无用的代码。但是,这段代码不会导致 Visual Basics 中的错误,这也让我有些困惑。 Visual Basics 会自动为您转换吗?任何帮助将不胜感激。

【问题讨论】:

  • 当 Visual Basic 将数值数据类型值转换为布尔值时,0 变为 False,所有其他值变为 True。
  • 为什么是 13?为什么不是10?我会尝试理解 if 语句背后的逻辑并重写它,忽略愚蠢的数字。
  • boolVariable 是布尔值吗?还是他将其命名为 boolVariable 的 int,因为它返回一个布尔值。
  • 这已经存在,但看看他是否覆盖了 == 运算符 msdn.microsoft.com/en-us/library/aa288467(v=vs.71).aspx
  • 我认为这只是糟糕的编程。

标签: c# vb.net integer boolean


【解决方案1】:

是的,Visual Basic 会为您转换它。零将转换为False,所有其他整数将转换为True。

“转换”您发布的代码的最简单方法是删除“== 13”。这应该完成同样的事情。

if (boolVariable)
{ 
    // Do stuff 
}

但实际上最好的办法是了解正在发生的逻辑:

  • 当boolVariable 是true 时,下面的代码块中会执行什么代码?
  • 哪些事件会触发boolVariable 值的变化?
  • boolVariable真正代表什么(...然后改名!)

如果你能理解这些东西,那么你就可以给变量起一个更有意义的名字(也可能是一个更有意义的类型),以后代码会更容易维护。

我不羡慕你 - 转换糟糕的、未注释的代码是一项艰巨的工作。我的建议是:不要只进行直接转换。如果你这样做了,那么你只是用不同的语言编写了糟糕的、未注释的代码。一年后,我们将看到另一篇像您一样的关于您转换的代码的帖子! :)

我会确保你的老板理解并同意首先进行体面的转换所需的努力,然后再花额外的时间把它做好。

【讨论】:

    【解决方案2】:

    VB 行为:

    你说它是用 VB 编写的,所以,我假设原始代码如下所示:

        If boolVariable = 13 Then // Remeber : it was VB..
            // Code block if True
            // ...
        Else
            // Code block if False
            // ...
        End If
    

    现在让我们看一下代码的行为...

        // Remeber : it was VB..
    
        If boolVariable = 13 Then
        /* The boolVariable is a Boolean
        The "13" is an Integer
        First step is performing a Widening conversion Boolean -> Integer
        boolVariable is converted to 0 if False, or 1 if True.
    
        So, depending on the value of boolVariable, the statement is
        either : */
        If 0 = 13 Then // which is False
        // either :
        If 1 = 13 Then // which is also False
    
        // That means that writing If boolVarialbe = 13 is the same as writing :
        If False Then
            // Block of code THAT WILL NEVER BE EXECUTED
        Else
            // Block of code that will ALWAYS be executed
        End If
    

    所以恕我直言,写 If (boolVariable == 13) 没有意义(无论是 VB 还是 C#)

    当我测试某些特定的东西时,我正在做这些奇怪的事情与最终代码无关。也许前程序员做了类似的事情,但未能删除那部分代码。在不知道代码的作用及其对整体范围的影响的情况下,我不能说它是应该修复的应用程序的关键部分,还是垃圾。

    无论如何,像If (boolVar == numVar) 这样的语句在今天的编程方式中是不行的(恕我直言)前程序员未能激活Option Strict,这将阻止他编写它。

    【讨论】:

      【解决方案3】:

      我并不是假装自己是 VB 专家,但这里有一个工作示例:

      Imports System
      
      Public Class Test
          Public Shared Sub Main()
              Dim runningVB As Boolean
              ' Check to see if program is running on Visual Basic engine.
              If scriptEngine = "VB" Then
                  runningVB = 16
                  If runningVB = True Then
                      Console.WriteLine("True")
                  End If
                  runningVB = 0
                  If runningVB = False Then
                      Console.WriteLine("False")
                  End If
              End If
          End Sub
      End Class
      

      输出:

      True
      False
      

      因此,与许多其他编程语言一样,false 将代表零,否则为 true。尽管这种类型的检查在 C 中完全可以接受,但 C# 编译器可能会抱怨。

      【讨论】:

        【解决方案4】:

        也许下面的示例代码会有所帮助.. ;-)

        Option Strict Off  ' this code will not compile with (Option Strict On)
        Public Class Form1
        
            Private Sub Form1_Load(sender As Object, e As EventArgs) Handles Me.Load
                Dim boolVariable As Boolean = False
        
                boolVariable = -1   ' anything non-zero will set boolean to True
                Debug.WriteLine(boolVariable)
                boolVariable = 0    ' zero will set boolean to False
                Debug.WriteLine(boolVariable)
            End Sub
        End Class
        

        【讨论】:

          猜你喜欢
          • 2017-04-16
          • 2012-06-19
          • 1970-01-01
          • 2016-08-22
          • 1970-01-01
          • 2021-07-11
          • 1970-01-01
          • 2013-04-02
          • 1970-01-01
          相关资源
          最近更新 更多