如何使用 ByVal 和 ByRef 使该程序更有效率



我是 VB.NET 编程新手,不知道 ByRef 和 ByVal 如何在这个二十一点代码的一部分中工作!谢谢!

以下是代码的一部分:

Private Sub Button3_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button3.Click
    If hit = 0 Then
        getCard()
        PictureBox3.Image = cImg(n)
        playertotal += value
        If playertotal > 21 And pAce >= 1 Then
            pAce -= 1
            playertotal -= 10
        End If
    End If
    If hit = 1 Then
        getCard()
        PictureBox4.Image = cImg(n)
        playertotal += value
        If playertotal > 21 And pAce >= 1 Then
            pAce -= 1
            playertotal -= 10
        End If
    End If
    If hit = 2 Then
        getCard()
        PictureBox5.Image = cImg(n)
        playertotal += value
        If playertotal > 21 And pAce >= 1 Then
            pAce -= 1
            playertotal -= 10
        End If
    End If
    hit += 1
    Label2.Text = playertotal
    If Label2.Text > 21 Then
        Label11.Text = "COMPUTER WINS!"
    End If
    If hit = 3 And playertotal <= 21 Then
        Label11.Text = "PLAYER WINS!"
    End If
End Sub 

在.NET中,默认情况下所有参数都通过ByVal传递,这是一件好事。它提供了最有效的传递参数的方式,并且真的没有任何主流理由切换到 ByRef。

在谈论 ByVal 和 ByRef 时,您还必须考虑您传递的内容,可以是值类型或引用类型。

如果传递引用类型 ByVal(这是 .NET 中最常见的方案,因为所有实例都是引用类型,并且 ByVal 是传递参数的默认方式),您将收到 REFERENCE 的副本,而不是 VALUE。大多数开发人员通常不理解这一点。传递的对象不会重复。仅复制对对象(指针)的引用。

如果传递引用类型 ByRef,则传递的不是引用的副本,而是传递原始引用。出于引用原因,这可能是可取的,但传递引用 ByVal 不会获得实际性能。

如果传递 VALUE 类型 ByVal,则将传递实际 VALUE 的副本。在这种情况下,数据是重复的。这通常是可取的,以防止原始数据被数据传递到的方法损坏。

如果传递 VALUE 类型 ByRef,则会传递对该值的引用,如果接收数据的方法对其进行修改,则会修改原始数据。

您的选择与数据保护和直接引用对象有关,而不是性能。.NET Framework 针对性能进行了高度优化。通常,尝试优化框架是不明智的。

下面是使用 ByRef 的示例 - 您传入的命中不是作为值,而是作为对 ProcessHit 过程的引用传递

 Private Sub Button3_Click(sender As Object, e As EventArgs) Handles Button3.Click
    ProcessHit(hit)
End Sub
Public Sub ProcessHit(ByRef hit As Integer)
    Select Case hit
        Case 0
            getCard()
            PictureBox3.Image = cImg(n)
            playertotal += value
            If playertotal > 21 And pAce >= 1 Then
                pAce -= 1
                playertotal -= 10
            End If
        Case 1
            getCard()
            PictureBox4.Image = cImg(n)
            playertotal += value
            If playertotal > 21 And pAce >= 1 Then
                pAce -= 1
                playertotal -= 10
            End If
        Case 2
            getCard()
            PictureBox5.Image = cImg(n)
            playertotal += value
            If playertotal > 21 And pAce >= 1 Then
                pAce -= 1
                playertotal -= 10
            End If
    End Select
    hit += 1
    Label2.Text = playertotal
    If Label2.Text > 21 Then
        Label11.Text = "COMPUTER WINS!"
    End If
    If hit = 3 And playertotal <= 21 Then
        Label11.Text = "PLAYER WINS!"
    End If
End Sub

最新更新