2012-12-29 197 views
0

這應該是一個程序,它告訴您在用戶輸入下載速度後需要多長時間下載給定大小的文件。 intOne似乎完全不受我創建的用於確定intOne值的應用程序的影響。我相當確定我使用的等式是正確的。VB.net邏輯錯誤

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 

幫助將不勝感激。

+1

不是答案,但你有沒有試過使用'string.StartsWith(「b」,StringComparison.OrdinalIgnoreCase)'?等等...... – Steve

+0

或者只是選項比較文本? – RBarryYoung

+0

爲什麼你將所有的方法聲明爲Functions,但是從來沒有爲它們聲明返回類型,返回從不使用的值(不同類型的值),也從不將它們作爲函數調用它們?這些被稱爲子程序而不是函數,如果你聲明和寫入子程序,你會發現它更容易。 – RBarryYoung

回答

3

你從來沒有指定任何值,吟誦,所以它值0,所以這將啓動:

intOne = intOne/1024^3 

是一樣的:

intOne = 0/1024^3 

這當然是這樣的:

intOne = 0 

撇開:

  • 不要在類/表單級別使用Dim,請使用Private。

  • decalring你的功能

  • 打開選項中的語言設置嚴格時,請務必使用As <ReturnType>

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

  • 始終聲明變量的類型以及(Dim tSize缺少它的類型)


跟進到您的編輯:

此:

Function checkForByte(ByVal checkUserSize) 

應該是這樣的:

Function checkForByte(ByVal checkUserSize As Long) 

在您的代碼的所有位置修復此問題。一切都應該有一個作爲數據類型。如果您啓用了Option Explict和Option Strict,則編譯器會爲您找到這些問題。

接下來,不要將局部變量和/或參數命名爲您的類/表單級別的專用變量。我親自加上我的實例變量,如下所示:

Private _checkUserSpeed As Long = 0 

請注意下劃線。有些人用小寫字母m代替:

Private mCheckUserSpeed As Long = 0 

選擇一些並保持一致。這使得它清楚了變量的範圍。

而且這個代碼是壞的,第二回將永遠不會被打:

Return checkBitByte 
Return checkUserSpeed 

最後,假設你想用一個值來填充變量_checkUserSpeed,你還是不是永遠這樣做。搜索你的代碼和找你這樣做是任何地方:

_checkUserSpeed = something 

你不會找到它。因此,該變量將始終爲0.

這些都不是真正的VB.NET特定問題。所有這些最佳做法同樣適用於C#或任何其他語言。

+2

另外,他應該更明智地給變量命名...... –

+0

我試圖讓變量更容易理解。我試圖在checkSize函數中設置checkUserSpeed的值,但它似乎並不能很好地工作。我很抱歉,如果我錯過了簡單的東西,我很新的VB.net – Tlm7

+1

我回應你上面的編輯。 – tcarvin

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#開發人員更好地理解您的代碼。

+0

我應該創建兩個獨立的函數嗎?還是應該自己處理'checkDownloadSize'和'checkSize'?它看起來只會提交'checkDownloadSize',但我可能是錯的。正如我所說,我對編碼很陌生。 – Tlm7

+1

@ Tlm7:你的'checkSize'用來調用'checkDownloadSize',我認爲'checkDownloadSize'沒有被其他地方調用。如果是這樣,兩者都可以用上述方法替代。你的下一步是讓你的幫助者方法無狀態,所以他們不會改變任何狀態。例如,在上面的場景中,您可以通過參數而不是全局變量來提供'intOne'。然後將'Return False'改爲'Return -1',然後可以將返回值嚴格鍵入(Long)。 – Neolisk

+0

非常感謝你的幫助,我希望我能給你們兩個最好的答案,但是我不能。 – Tlm7