如何使用ByVal和ByRef提高此程序的效率?

时间:2016-03-03 19:24:24

标签: vb.net

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

以下是代码的一部分:

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 

2 个答案:

答案 0 :(得分:0)

在.NET中,所有参数都默认传递给ByVal,这是一件好事。它提供了传递参数的最有效方法,并且实际上没有任何主流理由可以切换到ByRef。

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

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

如果传递引用类型ByRef,则不会传递引用的副本,您将传递原始引用。这可能是出于参考原因所希望的,但是在传递引用ByVal方面没有获得真正的性能。

如果您传递VALUE类型ByVal,您将传递实际VALUE的副本。在这种情况下,数据是重复的。这通常是希望保护原始数据不被数据传递到的方法破坏。

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

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

答案 1 :(得分:0)

以下是使用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