38 votes

Les paramètres sont-ils évalués dans l'ordre lorsqu'ils sont passés dans une méthode ?

Les paramètres sont-ils évalués dans l'ordre lorsqu'ils sont passés dans une méthode ?

Pour Java, c'est toujours vrai, pour C ce n'est pas le cas, mais quelle est la réponse pour C# ?

Exemple

string.Format("byte1={0} byte2={1} byte3={2}", 
  getNextByte(), 
  getNextByte(), 
  getNextByte());

int pos=0;
byte[] arr=new byte[] {1,2,3,4,5,6};
byte getNextByte()
{
  return arr[pos++];  
}

Cet exemple fonctionne, mais est-ce juste de la chance ou une règle ?

42voto

dtb Points 104373

Oui, les expressions passées en arguments aux méthodes sont toujours évaluées de gauche à droite.

De la spécification du langage C# 4.0 :

7.5.1.2 Évaluation de la liste d'arguments à l'exécution

Pendant le traitement à l'exécution de l'invocation d'un membre de fonction (§7.5.4), les expressions ou les références de variables d'une liste d'arguments sont évaluées dans l'ordre, de gauche à droite, [...]

25voto

Eric Lippert Points 300275

Comme d'autres l'ont souligné, la spécification du langage exige que les paramètres soient évalués dans l'ordre de gauche à droite.

Cependant, pour être tout à fait franc, nous avons accidentellement introduit quelques bugs dans C# 4.0 où certains scénarios impliquant des arguments nommés, des paramètres optionnels et des paramètres omis dans les appels à des objets COM hérités, de telle sorte que dans ces scénarios, les effets secondaires des arguments pourraient ne pas être évalués dans un strict ordre de gauche à droite. L'analyseur qui gère les interactions entre ces fonctionnalités est compliqué et il avait quelques bugs.

Je m'excuse pour ces erreurs; nous espérons les avoir corrigées dans la prochaine version.

3voto

David Heffernan Points 292687

Dans la spécification du langage:

Pendant le traitement en temps d'exécution d'une invocation de membre de fonction, les expressions ou les références de variables d'une liste d'arguments sont évaluées dans l'ordre, de gauche à droite.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X