C # Pourquoi les méthodes partielles peuvent-elles utiliser ref, mais pas out?

Assez simple. MSDN indique que vous pouvez utiliser ref, mais pas pour les méthodes partielles. Je suis juste curieux de savoir pourquoi ? Je croyais comprendre que lorsque le code est compilé, les partiels sont fusionnés. Qu’en est-il de la ressortingction? Y a-t-il autre chose à faire que de simplement rendre les fichiers de code plus propres et mieux organisés (c.-à-d. Eyecandy)?

Référence: Article MSDN – “Les méthodes partielles peuvent avoir des parameters ref mais pas des parameters out .”

Vous devez considérer ce qui se passe si la méthode partielle n’est pas implémentée.

Ce qui se passe alors, c’est que tous les appels à la méthode sont simplement supprimés comme s’ils ne s’étaient jamais produits.

Donc, pour une méthode utilisant out, cela ressemblerait à ceci:

 stream s; GetStream(out s); s.Write(...); 

et être compilé comme s’il disait ceci:

 stream s; s.Write(...); 

Ce code n’est pas autorisé car s n’a pas été initialisé. La garantie que la variable serait initialisée au moment où vous essayez d’appeler la méthode Write était liée à l’appel de GetStream .

C’est la même chose avec les méthodes renvoyant des données. Etant donné que l’appel de méthode complet n’est tout simplement pas compilé si vous n’avez pas implémenté la méthode partielle, vous devez tenir compte de ce que vous pouvez et ne pouvez pas faire tout en maintenant le code valide. En termes de valeurs sortantes et renvoyées, il est possible que le code appelant soit invalide ou incomplet. Il n’est donc pas autorisé.

Quant à ref , cela est valable puisque l’initialisation a été prise en charge par le code appelant:

 stream s = null; GetStream(ref s); // may be ssortingpped out if (s != null) s.Write(...); 

Contrairement aux parameters de référence, les parameters out DOIVENT être initialisés avant le retour de la méthode. Si la méthode partielle n’est pas implémentée (ce qui constitue un scénario valide), comment peut-elle être initialisée?

J’imagine que out parameters de out n’ont pas besoin d’être initialisés, contrairement aux parameters de ref .

Si vous avez utilisé un paramètre out sur une méthode partielle, comment C # peut-il vérifier que le paramètre a été initialisé ou non?

Un paramètre out suggère que vous souhaitiez extraire une valeur de la méthode. Si la méthode n’existe pas, elle ne peut pas fournir cette valeur.

L’alternative serait de définir explicitement la valeur de la variable sur sa valeur par défaut (0, null, etc.) au lieu d’exécuter l’appel de la méthode. De cette façon, la variable serait toujours définitivement initialisée – bien que la valeur par défaut ne soit peut-être pas très utile. Je pense que l’équipe C # a déjà réfléchi à cette question. Cela pourrait même en faire une version future, qui sait? Personnellement, je doute que cela soit particulièrement utile, mais la possibilité existe.

Pour le moment, vous pouvez toujours utiliser un paramètre ref et initialiser la variable manuellement avant l’appel, quelle que soit la valeur par défaut.

Je suppose que la raison en est qu’une méthode partielle avec seulement une signature (c’est-à-dire aucune implémentation) est toujours valide. Si vous aviez un paramètre out, une méthode sans implémentation générerait toujours une erreur (car rien n’atsortingbue la valeur out)

Une méthode partielle est divisée en plusieurs classes. Une méthode est requirejse pour affecter une valeur à un paramètre OUT. Des méthodes partielles peuvent ou non être mises en œuvre. Cela signifierait que plusieurs fragments de code tentent d’atsortingbuer une valeur au paramètre OUT.

Comme tout le monde l’a dit out il faut assigner out parameters. Pour append cela générera l’erreur de compilateur CS0177 mais doit être affectée avant de passer l’appel.