10
votes

C # Paramètres VS Retours

Donc je suis nouveau à C # et j'ai du mal à comprendre out code>. Contrairement à juste à retourner quelque chose d'une fonction

 using System;
 class ReturnTest
 {
     static void CalculateArea(out double r)
     {
         r=5;
         r= r * r * Math.PI;
     }

     static void Main()
     {
         double radius;
         CalculateArea(out radius);
         Console.WriteLine("The area is {0:0.00}",radius );
         Console.ReadLine();
     }
}


6 commentaires

Etude Dictionary.trygevalue et int.tryparse et voyez si ces exemples expliquent l'utilitaire de out .


out est principalement utilisé lorsque vous devez retourner plusieurs valeurs non liées à partir d'une méthode. De plus, il est souvent utilisé pour simuler des pointeurs lorsqu'il est interopé avec un code natif via COM ou P / invoke.


Rappelez-vous en C / C ++, nous avons des pointeurs. Lorsque vous avez passé un pointeur dans une fonction, vous pouvez le modifier dans la fonction et la valeur changerait également dans la fonction d'appel. Sortir à peu près la même chose.


@ carny666: Je pense que ref est plus similaire aux références C ++ que out .


@Kirkwoll C'étaient deux excellents exemples merci!


Dupliqué possible de qui est meilleur, de la valeur de retour ou du paramètre Out?


5 Réponses :


1
votes

Quand une variable est concernée et que le retour est correct. Mais que si vous vouliez retourner plus de 1 valeurs? out code> aide à cela.

static void CalculateArea(out double r, out double Foo)
{
    //Can return 2 values in terms of out variables.
}

static double CalculateArea(double r)
{
     // Will return only one value.
}


0 commentaires

2
votes

Vous pouvez avoir plusieurs paramètres Out, donc si vous devez renvoyer plusieurs valeurs, il est un peu plus facile que de créer une classe spéciale pour vos valeurs de retour.


0 commentaires


4
votes

Seul le temps que j'ai tendance à utiliser out est lorsque j'ai besoin de plusieurs choses renvoyées à partir d'une seule méthode. out vous permet d'éviter d'envelopper plusieurs objets dans une classe pour le retour. Découvrez l'exemple sur le Page Microsoft Out .


1 commentaires

Notez que dans les versions récentes de C #, vous pouvez maintenant le faire avec des tuples de valeur. Par exemple (nom de cordes, int ère) getMultiplevalues ​​() {retour ("James", 31); }



8
votes

Le mot clé out est utilisé principalement lorsque vous souhaitez revenir plus d'une valeur d'une méthode, sans avoir à envelopper les valeurs d'un objet.

Un exemple est la méthode int32.tryparse , qui a à la fois une valeur de retour (un booléen représentant le succès de la tentative), et un paramètre qui obtient le valeur si l'analyse a été réussie.

La méthode pourrait renvoyer un objet qui contenait à la fois le booléen et l'entier, mais dont il aurait besoin pour que l'objet soit créé sur le tas, réduisant ainsi les performances de la méthode.


2 commentaires

Je me demande aussi sur la différence de performance (le cas échéant). En provenance d'un environnement C ++, l'argument est que la copie d'un objet lorsqu'elle est renvoyée par la valeur est plus chère. Est-ce également vrai pour C #? Je veux dire si vous construisez un nouvel objet massif dans la fonction et de le renvoyer, est-ce qu'il sera copié à ce que vous cédez? Contrairement à la création de l'objet et à la modifier via le mot clé OUT? Ou est-ce non-pertinence en C #?


@ReaSurria: Si vous créez un objet et que vous le renvoyez, ce n'est que la référence renvoyée, les objets ne sont pas clonés. En .NET Les objets ne sont clonés que si vous les clonez spécifiquement, passez des objets autour de ne pas créer de nouvelles copies.