Différence entre ByVal et ByRef?
Quelle est la différence? J'ai toujours utiliser ByVal, mais, je n'ai pas vraiment une bonne idée de quand dois-je et quand ne pas...
- 95%+ du temps que vous souhaitez ByVal, il est donc peut-être que vous avez fait le bon choix tout le long 🙂 Mais +1 pour l'initiative d'apprendre à ce sujet.
- Préface: je ne suis pas un programmeur VB. Si c'est quelque chose comme C ou C++, en passant ByVal peut être coûteux si l'objet est cher à copier. Si vous savez que vous n'allez pas le modifier, ByRef pourrait être plus rapide et la fonction se comportent de la même.
- Je lui ai dit la même chose ci-dessous, mais juste au cas où... ByVal ne pas créer une copie de l'objet (à l'exception de la valeur des variables de type). Il crée une nouvelle référence au même objet. Vous avez raison, ByRef peut être plus rapide (ne pas avoir à créer une nouvelle référence), mais la différence serait négligeable au mieux.
Vous devez vous connecter pour publier un commentaire.
Si vous passez une référence, lorsque vous modifiez la valeur dans la méthode, la variable dans le site d'appel sera également modifiée.
Si vous passez de la valeur, c'est la même chose, comme si une autre variable est créée au niveau de la méthode, de sorte que même si vous les modifiez, la variable d'origine (sur le site d'appel) n'aura pas sa valeur a changé.
Donc, en effet, vous devriez vous passer des variables en tant que valeur. Seulement passer comme référence si vous avez besoin explicite de le faire.
ByRef = Vous donner à votre ami de votre durée de papier (l'original) il le marque place et peut vous le renvoyer.
ByVal = Vous donner hime une copie de la durée de papier et il vous redonner ses changements, mais vous devez les mettre dans votre origine vous-même.
Aussi simple que je peux le faire.
Pourquoi utiliser Byref:
ByRef va passer le POINTEUR sur l'objet que vous êtes de passage. Si vous êtes dans le même espace mémoire, ce qui signifie en passant juste la 'parole' pas l'objet. La méthode que vous êtes de passage, il peut faire des changements dans la origuinal objet, et n'a pas besoin de passer de retour à, comme ils sont dans l'objet d'origine. Utile pour la prise de données de grande taille passe plus vite. Vous pouvez également utiliser ByRef pour permettre l'utilisation d'un SOUS plutôt que d'une FONCTION (En VB) car il n'a pas besoin de passer de l'arrière de l'objet.
Pourquoi ne Pas Utiliser Byref:
Puisque la méthode a accès à l'original, anychanges fait sera immédiate et permanente. Si la méthode échoue, le oblect pourrait être endommagé. L'aide de ByVal faire une copie, passer l'ensemble de la copie dans la méthode, et puis le metod permettra de traiter l'info et soit retunr une copie de retour, rapport d'information ou ne rien faire.
ByRef est comme une seconde valeur de retour. Il passe une référence à l'objet dans la fonction plutôt que l'objet lui-même. Si vous modifiez la valeur d'un
ByRef
paramètre dans la fonction, vous allez voir ces changements après la fonction se termine. Si ce n'était pas assez clair, lire ce et cette.Je sais que cette question a été à peu près répondu, mais je voulais juste ajouter le suivant...
L'objet que vous avez passer à une fonction est soumise à ByRef/ByVal, cependant, que si l'objet contient des références à d'autres objets, ils peuvent être modifiés par la méthode appelée indépendamment de ByRef/ByVal. Mauvaise explication, je sais, voir code ci-dessous pour une meilleure compréhension:
EDIT:
Aussi, examiner si cette fonction a été appelée:
Ce qui se passe dans ce cas est "ByVal Changement 3" est ajouté à la liste des demandeurs, mais au point de vous préciser que les "accédez à la liste = New List", vous êtes alors en pointant la nouvelle référence, à un nouvel objet, et détaché de la liste des demandeurs. La fois du bon sens et pourrait vous rattraper un jour, donc, quelque chose à garder à l'esprit.
J'espère que cela répond à votre question
Pense que il peut y avoir une faute de frappe dans le dernier échantillon:
Le dernier doit être "byval" et non pas "byref". 🙂
Également ajouté une instruction msgbox dans trying_byval de sorte que vous pouvez comprendre ce que cela signifie.
ByRef, une valeur va avoir 2 adresses
Donc, si x=80 (80, qui est la valeur de x est l'adresse, par exemple, la variable y peut être 80, et ainsi de 80 peut être consulté par x et y)
Réponses par @Tom et @kelloti sont utiles. Voici un exemple de code pour illustrer plus loin:
Je vais essayer d'expliquer la différence en termes simples.
passage d'argument par valeur entrée en paramètre. C'est le moyen le plus sûr, est donc utilisée par défaut dans 95% des cas.
passage d'argument par référence en fait à la fois d'entrée et de sortie paramètre. Le paramètre de sortie peut être modifiée à l'intérieur de la fonction qui crée un rarement utilisé des effets secondaires.