VB.net逻辑错误
这应该是一个程序,它告诉你在用户输入下载速度后,下载给定大小的文件需要多长时间。我创建了一个函数来确定intOne的值应该是什么,它似乎一点也不影响intOne。我有理由相信我使用的方程式是正确的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
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)
?等等…或者只是选项比较文本
?为什么要声明所有