2009-05-08 7 views
7

Lorsque j'ai commencé à utiliser C#, je ne savais pas exactement comment les références étaient traitées exactement (qu'elles soient transmises par valeur, etc.). J'ai pensé à tort que le mot-clé 'ref' était nécessaire lors du passage d'objets qui seraient modifiés par la méthode appelée.Mot-clé 'ref' et AppDomains

Ensuite, après avoir lu des threads comme this, j'ai réalisé que 'ref' n'était nécessaire que lorsque vous avez besoin de changer la référence/le pointeur lui-même.

Mais aujourd'hui, j'ai rencontré un problème lors du passage d'un paramètre via un appel à distance, où ref était réellement nécessaire pour modifier le contenu de l'objet. Quand passé sans ref, l'objet est revenu inchangé. On m'a dit d'ajouter le mot-clé ref, mais j'ai soutenu pendant un moment que c'était seulement nécessaire lorsque vous changiez le pointeur lui-même, pas le contenu qui est pointé vers.

J'ai cherché sur le net et je n'ai trouvé qu'un single page qui le décrit brièvement. Est-ce un problème connu et quelqu'un peut-il pointer vers une documentation à ce sujet? Il me semble que je devrais utiliser ref maintenant pour tout paramètre qui est en cours de modification via un appel à distance.

Répondre

4

L'ajout de "ref" pourrait ou pourrait ne pas aider. Tout dépend de l'intelligence de l'implémentation du marshaller. Si vous appelez, par exemple, un service Web, aucune quantité de "ref" ne va vous aider - les paramètres de la fonction ne sont simplement pas renvoyés sur le réseau. La seule chose qui revient du service est la valeur de retour de la fonction. Lorsque vous travaillez avec l'accès distant, vous devez comprendre (au moins dans une certaine mesure) la façon dont les choses fonctionnent réellement - le fait que les paramètres doivent être sérialisés et envoyés à l'appelé sur une sorte de "fil" désérialisé à l'autre bout. est effectuée par le serveur, et les résultats sérialisés et renvoyés à vous. Si ces résultats incluent des changements aux paramètres que vous avez passés en premier lieu dépend plus de la mise en œuvre spécifique à distance, puis sur les "ref" que vous ajoutez pour décorer vos paramètres ...

+2

Je suis à peu près sûr que les services web SOAP (asmx) et WCF vont gérer "ref" comme vous le souhaitez, en le faisant fonctionner dans les deux sens. –

1

Je me demande pourquoi avez-vous dit "référence/pointeur" ?. Il y a une grande différence entre ces termes. Vous voyez, un pointeur est juste une adresse, disons un int. D'autre part, une référence n'est rien d'autre qu'un alias à quelque chose. En termes de C++:

int x; 
int& y = x; 

A partir de là, quoi qu'il arrive à x, y arrive et vice-versa, ils sont liés « pour toujours ».

Encore une fois, en C++, un passage par ref:

void foo(int& y); 
int main(){ 
    int x = 0; 
    foo(x); 
} 

Cela signifie que y, est un autre nom (alias) pour x à l'intérieur de la portée de foo. C'est ce que ref signifie en C#.

+0

C'est ce que ref signifie, mais ce n'est pas quelle référence signifie. Je pense qu'introduire du C++ dans le mix confond les choses, car une référence C++ n'est pas vraiment la même chose qu'une référence C#. –

+0

J'ai dit 'référence/pointeur' là-bas que juste 'référence' pour mettre en évidence que je parlais de la référence réelle et non de l'objet que la référence faisait référence. Pensé que cela pourrait aider à sauver les gens d'avoir à lire la phrase en double. – LegendLength

Questions connexes