我是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
答案 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