0

这应该是一个程序,它告诉您在用户输入下载速度后下载给定大小的文件需要多长时间。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

帮助将不胜感激。

4

2 回答 2

3

您永远不会为 intOne 分配任何值,因此它从值 0 开始。所以:

intOne = intOne / 1024 ^ 3

与此相同:

intOne = 0 / 1024 ^ 3

这当然是:

intOne = 0

作为旁白:

  • 不要在类/表单级别使用 Dim,使用 Private。

  • As <ReturnType>贴花功能时始终使用

  • 在语言设置中打开 Option Strict。

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

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


跟进您的编辑:

这个:

Function checkForByte(ByVal checkUserSize)

应该是这样的:

Function checkForByte(ByVal checkUserSize As Long)

在代码中的所有位置修复此问题。一切都应该有一个As DataType。如果您像建议的那样打开 Option Explict 和 Option Strict,编译器会为您定位这些问题。

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

Private _checkUserSpeed As Long = 0

注意下划线。有些人使用小写的 m 代替:

Private mCheckUserSpeed As Long = 0

选择一些东西并保持一致。这清楚地表明了变量的范围。

这段代码也很糟糕,第二个 Return 永远不会被击中:

Return checkBitByte
Return checkUserSpeed

最后,假设您试图_checkUserSpeed用一个值填充变量,您仍然没有这样做。搜索您的代码并查找您正在执行此操作的任何地方:

_checkUserSpeed = something

你不会找到它。因此该变量将始终为 0。

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

于 2012-12-29T15:11:34.167 回答
1

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

例如,像这样:

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

大致替换了您的两页checkDownloadSizecheckSize

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

还有一点是我Microsoft.VisualBasic在上面的代码中没有使用命名空间,而是切换到Substring了。这将减轻您迁移到 C# 的负担,并使本地 C# 开发人员更好地理解您的代码。

于 2012-12-29T20:53:41.590 回答