2016-03-03 121 views
-2

我是VB.NET編程新手,不知道ByRef和ByVal如何在這個Blackjack代碼中工作!謝謝!如何通過使用ByVal和ByRef使此程序更高效?

下面是代碼的一部分:

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

[BYVAL和爲ByRef參考類型](的可能的複製的http://計算器。 com/questions/19707622/byval-by-byref-with-reference-type) – cokeman19

+1

你爲什麼認爲你應該改變和事件簽名? – Plutonix

+0

是否需要使用byRef或byVal? – ElenaDBA

回答

0

在.NET中所有的參數都是在默認情況下通過BYVAL,這是一件好事。它提供了傳遞參數的最有效方式,並且實際上不會有任何主流理由切換到ByRef。

在談論ByVal和ByRef時,您還必須考慮您傳遞的內容,可能是值類型或引用類型。

如果您傳遞引用類型ByVal(這是.NET中最常見的情況,因爲所有實例都是引用類型,而ByVal是傳遞參數的默認方式),您將收到REFERENCE的副本,而不是VALUE 。大多數開發人員通常不瞭解這一點。沒有發生傳遞對象的重複。只複製對象(指針)的引用。

如果您傳遞引用類型ByRef,則不會傳遞該引用的副本,您將傳遞原始引用。由於參考原因,這可能是理想的,但是通過參考ByVal不會獲得真正的性能。

如果您傳遞VALUE類型的ByVal,您將傳遞實際VALUE的副本。在這種情況下,數據是重複的。這通常是可取的,以保護原始數據免受數據傳遞方法的破壞。

如果傳遞一個VALUE類型的ByRef,那麼您正在傳遞對該值的引用,並且如果接收數據的方法修改它,原始數據將被修改。

您的選擇與保護數據和直接引用對象有關,而不是性能。 .NET Framework對性能進行了高度優化。一般來說,嘗試優化框架並不明智。

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