2016-03-03 4 views
-2

Je suis nouveau à la programmation en VB.NET et je ne sais pas comment ByRef et ByVal pourraient travailler dans une partie de ce code Blackjack! Merci!Comment rendre ce programme plus efficace en utilisant ByVal et ByRef?

Voici une partie du code:

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

double possible de [ByVal et ByRef avec le type de référence] (http: // stackoverflow. com/questions/19707622/byval-and-byref-with-reference-type) – cokeman19

+1

Pourquoi pensez-vous que vous devriez changer et la signature de l'événement? – Plutonix

+0

Faut-il utiliser byRef ou byVal? – ElenaDBA

Répondre

0

Dans .NET tous les arguments sont passés ByVal par défaut et cela est une bonne chose. Il fournit le moyen le plus efficace de passer des arguments et il n'y aurait vraiment aucune raison de passer à ByRef. Lorsque vous parlez de ByVal et ByRef, vous DEVEZ également tenir compte de ce que vous transmettez, qui peut être un type de valeur ou un type de référence. Si vous passez un type de référence ByVal (qui est le scénario le plus courant dans .NET car toutes les instances sont des types de référence et ByVal est la façon dont les arguments sont passés), vous recevrez une copie de la REFERENCE, pas la VALUE . Ceci n'est généralement pas compris par la plupart des développeurs. Aucune duplication de l'objet transmis n'a lieu. Seule la référence à l'objet (le pointeur) est copiée.

Si vous passez un type de référence ByRef, vous ne transmettrez pas une copie de la référence, vous passerez la référence d'origine. Cela peut être souhaitable pour des raisons de référencement, mais aucune performance réelle n'est obtenue en passant la référence ByVal.

Si vous passez un type VALUE ByVal, vous passerez une copie de la valeur réelle. Dans ce scénario, les données sont dupliquées. Cela est généralement souhaitable pour protéger les données d'origine de devenir corrompu par la méthode à laquelle les données ont été transmises.

Si vous transmettez un type de valeur ByRef, vous transmettez une référence à la valeur et si la méthode qui reçoit les données la modifie, les données d'origine sont modifiées.

Les choix que vous avez portent sur la protection des données et la référence directe aux objets, pas sur les performances. Le .NET Framework est hautement optimisé pour les performances. Généralement, il n'est pas judicieux d'essayer d'optimiser le cadre.

0

Voici un exemple d'utilisation ByRef - vous passez à coup pas en tant que valeur, mais comme une référence à la procédure 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