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>機能をデカールするときは常に使用してください

  • 言語設定でOptionStrictをオンにします。

  • Dim intTwo As Integer = Nothing何も役に立ちません。Dim intTwo As Integer = 0代わりに使用 してください。

  • 変数も常に型として宣言します(型Dim tSizeがありません)


編集のフォローアップ:

これ:

Function checkForByte(ByVal checkUserSize)

これである必要があります:

Function checkForByte(ByVal checkUserSize As Long)

コード内のすべての場所でこれを修正してください。すべてにAsDataTypeが必要です。OptionExplictとOptionStrictlikeをオンにすると、コンパイラがこれらの問題を検出します。

次に、ローカル変数やパラメータにクラス/フォームレベルのプライベート変数と同じ名前を付けないでください。私は個人的に次のようにインスタンス変数にプレフィックスを付けます。

Private _checkUserSpeed As Long = 0

アンダースコアに注意してください。代わりに小文字のmを使用する人もいます。

Private mCheckUserSpeed As Long = 0

何かを選び、一貫性を保ちます。これにより、変数のスコープが明確になります。

また、このコードは正しくありません。2番目の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

checkDownloadSizeとの2ページを大まかに置き換えますcheckSize

ここでのすべての関数が1回だけ呼び出されることに注意してください。後でカスタム実装と交換することにした場合はToLower、1回だけ行う必要があります。パフォーマンスが向上するだけでなく、コードを長期的に保守しやすくなります。

もう1つのポイントは、上記のコードで名前空間を使用しておらず、代わりにMicrosoft.VisualBasic切り替えたことです。Substringこれにより、C#への移行の負担が軽減され、ネイティブC#開発者がコードをよりよく理解できるようになります。

于 2012-12-29T20:53:41.590 に答える