Je vais tenter une explication :
Je pense que nous avons compris comment fonctionnent les types de valeurs, n'est-ce pas ? Les types de valeurs sont (int, long, struct, etc.). Lorsque vous les envoyez à une fonction sans commande ref, elle COPIE la valeur données . Tout ce que vous faites à ces données dans la fonction n'affecte que la copie, pas l'original. La commande ref envoie les données réelles et toute modification affectera les données en dehors de la fonction.
Passons maintenant à la partie la plus déroutante, les types de référence :
Créons un type de référence :
List<string> someobject = new List<string>()
Quand vous vous réveillez un objet Deux parties sont créées :
- Le bloc de mémoire qui contient les données pour un objet .
- Une référence (pointeur) à ce bloc de données.
Maintenant, lorsque vous envoyez un objet dans une méthode sans ref il COPIE le référence le pointeur, PAS les données. Voici donc ce que vous obtenez :
(outside method) reference1 => someobject
(inside method) reference2 => someobject
Deux références pointant vers le même objet. Si vous modifiez une propriété de un objet en utilisant la référence 2, il affectera les mêmes données que celles pointées par la référence 1.
(inside method) reference2.Add("SomeString");
(outside method) reference1[0] == "SomeString" //this is true
Si vous annulez la référence 2 ou si vous la faites pointer vers de nouvelles données, cela n'affectera pas la référence 1 ni les données vers lesquelles la référence 1 pointe.
(inside method) reference2 = new List<string>();
(outside method) reference1 != null; reference1[0] == "SomeString" //this is true
The references are now pointing like this:
reference2 => new List<string>()
reference1 => someobject
Que se passe-t-il lorsque vous envoyez un objet par référence à une méthode ? La méthode référence réelle a un objet est envoyé à la méthode. Vous n'avez donc plus qu'une seule référence aux données :
(outside method) reference1 => someobject;
(inside method) reference1 => someobject;
Mais qu'est-ce que cela signifie ? C'est exactement la même chose que d'envoyer un objet sans ref, à l'exception de deux points essentiels :
1) Lorsque vous annulez la référence à l'intérieur de la méthode, la référence à l'extérieur de la méthode est annulée.
(inside method) reference1 = null;
(outside method) reference1 == null; //true
2) Vous pouvez maintenant faire pointer la référence vers un emplacement de données complètement différent et la référence à l'extérieur de la fonction pointera désormais vers le nouvel emplacement de données.
(inside method) reference1 = new List<string>();
(outside method) reference1.Count == 0; //this is true
81 votes
Vous : Je dois passer un objet pour qu'il puisse être modifié On dirait que
MyClass
serait uneclass
c'est-à-dire un type de référence. Dans ce cas, l'objet que vous passez peut être modifié par la fonctionmyFunction
même sansref
/out
mot-clé.myFunction
recevra un nouveau qui pointe vers le mismo et il peut modifier ce même objet autant qu'il le souhaite. La différence entre lref
Le mot-clé serait quemyFunction
a reçu le mismo référence au même objet. Cela ne serait important que simyFunction
devaient changer la référence pour pointer vers autre objet.4 votes
Je suis perplexe quant à la quantité de réponses confuses ici, alors que celle de @AnthonyKolesov est tout à fait parfaite.
0 votes
La déclaration d'une méthode out est utile lorsque vous souhaitez qu'une méthode renvoie plusieurs valeurs. Un argument peut être assigné à null. Cela permet aux méthodes de renvoyer des valeurs de manière facultative.
0 votes
Expliqué ici avec un exemple, il est plus compréhensible :) dotnet-tricks.com/Tutorial/csharp/
2 votes
Le commentaire de @JeppeStigNielsen est, techniquement, la (seule) bonne réponse à la question posée par l'OP. Pour passer un objet dans une méthode afin que la méthode peut modifier l'objet Il suffit de passer l'objet (la référence à l'objet) dans la méthode par sa valeur. Modifier l'objet dans la méthode via l'argument object modifie l'objet original même si la méthode contient sa propre variable (qui fait référence au même objet).