2010-09-03 3 views
3

Etant donné le code ci-dessous, le paramètre de méthode y de Bar (int y) recevra-t-il la valeur de x ou 1? Je me rends compte qu'ils sont logiquement équivalents, mais je veux comprendre l'opération d'affectation.Paramétrage de la méthode en C#

class Program 
{ 
    static void Main(string[] args) 
    { 
     var foo = new Foo(); 
     var x = 0; 
     foo.Bar(x = 1); 
    } 
} 

public class Foo 
{ 
    public void Bar(int y) 
    { 
    } 
} 

Répondre

6

Le paramètre obtient la valeur de l'affectation.

Tenir compte du code comme ceci:

int x = 0; 
int y = (x = 1); 
x = 42; 
foo.Bar(y); 

Eventhough x est changé une autre fois, y contient encore 1.

+0

Toutes les bonnes réponses, mais j'ai trouvé cela le plus clair et concis. Marqué comme réponse. –

4

Il est attribué au résultat de x=1 qui est égal à 1.

3

Le résultat de l'opérateur d'affectation sera passé à Bar, qui « est la valeur qui a été affectée à la gauche » (à partir de Eric Lippert's blog). Dans ce cas, il s'agit de la valeur int1.

0

Tout ce qui est à l'intérieur du() sera passé à y, à condition que ce soit un int.

Mais je pense que pour répondre directement à la question, x est ce qui se passe réellement, pas 1, x est égal à 1, alors y = x = 1.

+1

Le résultat de l'affectation est passé, pas la valeur de «x». – bdukes

1

Vous devez prendre en compte l'ordre d'évaluation. Avant d'appeler une fonction, toute expression entre les accolades doit être évaluée. Le résultat est ensuite utilisé comme argument dans l'appel de la fonction.

Dans votre cas, le x = 1 est une expression. Il doit être évalué à une affectation d'abord (x=1) puis vous pouvez utiliser la valeur résultante qui est x et l'utiliser comme argument à bar.

Il est équivalent à

x = 1 
foo.bar(x) 

Vous pouvez voir qu'il sera évalué si vous regardez la valeur de x après l'appel à foo.