VB.net逻辑错误

VB.net逻辑错误,vb.net,Vb.net,这应该是一个程序,它告诉你在用户输入下载速度后,下载给定大小的文件需要多长时间。我创建了一个函数来确定intOne的值应该是什么,它似乎一点也不影响intOne。我有理由相信我使用的方程式是正确的 Public Class Form1 Private tSize As System.Drawing.Size Private checkUserSpeed As Long = 0 Private checkBitByte As Integer = 0 Private

这应该是一个程序,它告诉你在用户输入下载速度后,下载给定大小的文件需要多长时间。我创建了一个函数来确定intOne的值应该是什么,它似乎一点也不影响intOne。我有理由相信我使用的方程式是正确的

Public Class Form1

    Private tSize As System.Drawing.Size
    Private checkUserSpeed As Long = 0
    Private checkBitByte As Integer = 0
    Private setSize As Integer = 0
    Private checkUserSize As String = ""
    Private Answer As Double = 0

    Private ReadOnly Property checkDwnldSize() As String
        Get
            Return ComboBox1.Text
        End Get
    End Property

    Function checkDownloadSize(ByVal checkUserSize As String)
        Dim suffixes As New List(Of String)({"b", "k", "m", "g", "t", "p", "e", "z"})
        Dim index As Long = suffixes.IndexOf(checkUserSize.Substring(0, 1).ToLower) > -1
        If index > -1 Then
            Return checkUserSpeed / 1024 ^ index
        Else
            Return False
        End If
    End Function

    Function checkForByte(ByVal checkUserSize)
        If Microsoft.VisualBasic.Right(checkUserSize.ToLower, 7) = "byte(s)" Then
            checkBitByte = 1
            checkDownloadSize(checkUserSize)
            Return True
            End
        Else
            Return False
        End If
        Return checkBitByte
        Return checkUserSpeed
    End Function

    Function checkForBit(ByVal checkUserSize)
        If Microsoft.VisualBasic.Right(checkUserSize.ToLower, 6) = "bit(s)" Then
            checkBitByte = 8
            checkDownloadSize(checkUserSize)
            Return True
            End
        Else
            checkForByte(checkUserSize)
            Return False
        End If
        Return checkBitByte
        Return checkUserSpeed
    End Function

    Function Calculate(ByVal checkUserSpeed, ByVal checkUserSize)
        checkForBit(checkUserSize)

        Return Answer
    End Function

    Private Sub FitContents()
        tSize = TextRenderer.MeasureText(TextBox3.Text, TextBox3.Font)
        TextBox3.Width = tSize.Width + 10
        TextBox3.Height = tSize.Height
    End Sub

    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
        Calculate(Convert.ToInt32(TextBox3.Text), ComboBox3.Text)
        Answer = checkBitByte * ((1024 ^ setSize) / checkUserSpeed)
        TextBox1.Text = Answer
    End Sub

    Private Sub TextBox3_TextChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles TextBox3.TextChanged
        Call FitContents()
    End Sub

    Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click
        Form2.Show()
    End Sub

    Private Sub Button3_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button3.Click
        Form3.Show()
    End Sub
End Class

非常感谢您的帮助。

您从未为音调指定任何值,因此它以值0开头。因此:

intOne = intOne / 1024 ^ 3
与此相同:

intOne = 0 / 1024 ^ 3
这当然是:

intOne = 0
旁白:

  • 不要在类/窗体级别使用Dim,请使用Private

  • 贴花功能时始终使用
    作为

  • 在语言设置中启用“选项严格”

  • Dim intTwo As Integer=Nothing
    没有做任何有用的事情。使用
    改为将intTwo设置为整数=0

  • 始终将变量声明为类型(
    Dim tSize
    缺少其类型)


编辑后的后续操作:

这:

应该是这样的:

Function checkForByte(ByVal checkUserSize As Long)
在代码中的所有位置修复此问题。所有内容都应该有一个作为数据类型。如果您打开了optionexplict和optionstrict,编译器将为您定位这些问题

接下来,不要将局部变量和/或参数命名为与类/表单级私有变量相同的名称。我个人将我的实例变量作为前缀,如下所示:

Private _checkUserSpeed As Long = 0
Function checkDownloadSize(ByVal strOne As String)
  Dim suffixes As New List(Of String)({"b", "k", "m", "g", "t", "p", "e", "z"})
  Dim index As Long = suffixes.IndexOf(strOne.Substring(0, 1).ToLower) > -1
  If index > -1 Then
    Return intOne / 1024 ^ index
  Else
    Return False
  End If
End Function
请注意下划线。有些人用小写字母m代替:

Private mCheckUserSpeed As Long = 0
选择一些东西并保持一致。这就明确了变量的范围

此外,此代码不正确,第二次返回将永远不会命中:

Return checkBitByte
Return checkUserSpeed
最后,假设您试图用一个值填充变量
\u checkUserSpeed
,您仍然没有这样做。搜索您的代码并查找执行此操作的任何位置:

_checkUserSpeed = something
你不会找到的。所以这个变量总是0


这些都不是真正针对VB.NET的问题。所有这些最佳实践都同样适用于C#或任何其他语言。

您从未为intOne指定任何值,因此它从值0开始。因此:

intOne = intOne / 1024 ^ 3
与此相同:

intOne = 0 / 1024 ^ 3
这当然是:

intOne = 0
旁白:

  • 不要在类/窗体级别使用Dim,请使用Private

  • 贴花功能时始终使用
    作为

  • 在语言设置中启用“选项严格”

  • Dim intTwo As Integer=Nothing
    没有做任何有用的事情。使用
    改为将intTwo设置为整数=0

  • 始终将变量声明为类型(
    Dim tSize
    缺少其类型)


编辑后的后续操作:

这:

应该是这样的:

Function checkForByte(ByVal checkUserSize As Long)
在代码中的所有位置修复此问题。所有内容都应该有一个作为数据类型。如果您打开了optionexplict和optionstrict,编译器将为您定位这些问题

接下来,不要将局部变量和/或参数命名为与类/表单级私有变量相同的名称。我个人将我的实例变量作为前缀,如下所示:

Private _checkUserSpeed As Long = 0
Function checkDownloadSize(ByVal strOne As String)
  Dim suffixes As New List(Of String)({"b", "k", "m", "g", "t", "p", "e", "z"})
  Dim index As Long = suffixes.IndexOf(strOne.Substring(0, 1).ToLower) > -1
  If index > -1 Then
    Return intOne / 1024 ^ index
  Else
    Return False
  End If
End Function
请注意下划线。有些人用小写字母m代替:

Private mCheckUserSpeed As Long = 0
选择一些东西并保持一致。这就明确了变量的范围

此外,此代码不正确,第二次返回将永远不会命中:

Return checkBitByte
Return checkUserSpeed
最后,假设您试图用一个值填充变量
\u checkUserSpeed
,您仍然没有这样做。搜索您的代码并查找执行此操作的任何位置:

_checkUserSpeed = something
你不会找到的。所以这个变量总是0


这些都不是真正针对VB.NET的问题。所有这些最佳实践都同样适用于C#或任何其他语言。

您应该首先研究清理代码,以提高可读性。不惜一切代价避免代码重复。如果您认为您不能这样做,那么请倾向于重复数据,即创建一个XML文件来存储您的值,但保持代码干净。你以后发现的任何错误都会像白乌鸦一样突出

例如,类似这样的内容:

Private _checkUserSpeed As Long = 0
Function checkDownloadSize(ByVal strOne As String)
  Dim suffixes As New List(Of String)({"b", "k", "m", "g", "t", "p", "e", "z"})
  Dim index As Long = suffixes.IndexOf(strOne.Substring(0, 1).ToLower) > -1
  If index > -1 Then
    Return intOne / 1024 ^ index
  Else
    Return False
  End If
End Function
大致替换您的两页
checkDownloadSize
checkSize

注意这里的每个函数都只调用一次。如果以后决定用自定义实现交换
ToLower
,则只需执行一次。从长远来看,它不仅提高了性能,还使代码更易于维护


另一点是,我没有在上述代码中使用
Microsoft.VisualBasic
名称空间,而是切换到
Substring
。这将减轻您迁移到C#的负担,并使本机C#dev更好地理解您的代码。

您应该首先考虑清理代码,以提高可读性。不惜一切代价避免代码重复。如果您认为您不能这样做,那么请倾向于重复数据,即创建一个XML文件来存储您的值,但保持代码干净。你以后发现的任何错误都会像白乌鸦一样突出

例如,类似这样的内容:

Private _checkUserSpeed As Long = 0
Function checkDownloadSize(ByVal strOne As String)
  Dim suffixes As New List(Of String)({"b", "k", "m", "g", "t", "p", "e", "z"})
  Dim index As Long = suffixes.IndexOf(strOne.Substring(0, 1).ToLower) > -1
  If index > -1 Then
    Return intOne / 1024 ^ index
  Else
    Return False
  End If
End Function
大致替换您的两页
checkDownloadSize
checkSize

注意这里的每个函数都只调用一次。如果以后决定用自定义实现交换
ToLower
,则只需执行一次。从长远来看,它不仅提高了性能,还使代码更易于维护


另一点是,我没有在上述代码中使用
Microsoft.VisualBasic
名称空间,而是切换到
Substring
。这将减轻您迁移到C#的负担,并使本机C#dev更好地理解您的代码。

不是答案,但您是否尝试过使用
string.StartsWith(“b”,StringComparison.OrdinalIgnoreCase)
?等等…或者只是
选项比较文本
?为什么要声明所有