Un petit post suite à des petits problèmes rencontrés dernièrement avec les fameux ByVal, ByRef en vb.net.
Commençons par un exemple simple avec un type bien célèbre du Framework : String:

Jusqu'ici pas de soucis, pour un type du Framework ByVal travaille bien sur les valeurs et ByRef sur la référence de l'objet.
Maintenant, essayons avec un type perso : Une classe toute simple et bien connue :

Et recommençons le coup du ByVal, ByRef :

Dans cet exemple, on se rend compte que le ByVal n'est pas respecté et qu'il se comporte comme un ByRef.
Après un petit tour dans la MSDN et comme diraient certains : RTFMSDN ;), il est clairement noté dans la doc MSDN que pour un type personnel le ByVal modifie la référence de l'objet et non une copie de celui_ci.

La solution ici passe par l'implémentation de Icloneable :

(thx Aurél)
La méthode Clone() renvoit une nouvelle instance identique (en terme de valeurs) à mon objet et par conséquent le ByVal se passe bien étant sur une référence distincte :

Voilà pour la première partie.
J'ai voulu pousser le bouchon un peu plus loin en rajoutant une petite méthode à ma classe Personne qui attend un argument en ByRef et je vais appeler celle-ci dans une assembly C# :
Je rajoute ici, une méthode qui permet de changer son nom avec un string passé en référence :

Lorsque que j'essai d'appeler ma méthode dans la classe C# voici l'erreur :

Petite vue dans l'explorateur d'objet :

#Update : Petite rectification (Merci Jb) :

Jb said : "En C#, avec une méthode avec un paramètre en ref ou en out, il faut préfixer l'argument a l'appel de la fonction".
#End Update
Impossible :s !!! Alors, de vb.net à C# ça ne passe pas, je tente alors l'inverse : C# to vb.net, je recommence en créant une jolie classe ;) Ordinateur que voici :

Je compile celle-ci et l'appelle dans un programme VB.net, et là CA MARCHE :s

Si vous avez une explication à ceci, vos feedbacks sont les bienvenues :))
#Update 23/08
J'en profite pour rajouter qq liens sur le sujet :
Copying, Cloning, and Marshalling in .NET
http://www.ondotnet.com/pub/a/dotnet/2002/11/25/copying.html
| C# Programmer's Reference |
|
Passing Parameters
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/csref/html/vclrfpassingmethodparameters.asp
#End Update
Dubrow
Anakin of Wygwam