2009-11-05 3 views
4

Il apparaît dans C# vous ne pouvez pas remplacer l'opérateur post-décrémentation?Surcharge des opérateurs ++ et - dans C#

J'étais "reflectoring" et couru à travers un certain code ce réflecteur traduit à decimal.op_Decrement(x) et j'essayais de comprendre si cela signifiait --x ou x--. Le framework utilise-t-il simplement la version "pré-décrément" pour l'opération "post-décrémentation"?

Répondre

11

Postfix ++//-- l'opérateur est le même que son équivalent de préfixe, sauf que le premier crée une copie (si nécessaire) de la variable avant l'affectation.

Ainsi, ce code:

int x = Function(y--); 

est égal à ce code:

int x = Function(y); 
--y; 

Voilà pourquoi il n'y a pas besoin de surcharger l'opérateur postfix.

+0

+1 Clair, simple et bien expliqué, sympa! – Abel

+0

Bien que cette explication exprime clairement le concept général de décrémentation postfixe, elle est en contradiction avec l'explication détaillée d'EricLippert des opérateurs de préfixe et de postfix (voir http://stackoverflow.com/a/3346729/1245420). Si l'on en croit Eric, 'Function (oldValueOf_y)' est appelé ** APRES ** la variable connue sous le nom de 'y' est décrémentée. Ce qui est passé à 'Function()' est une copie de 'y' avant d'être décrémentée. Ainsi, il semblerait qu'en C#, tout comme en C++, la sémantique de l'incrément/décrément postfixe empêche les optimisations évidentes que le compilateur peut faire avec le préfixe incrément/décrément. – phonetagger

0

Cela n'a pas d'importance. Dans le contexte de la variable opérée, il n'y a pas de différence entre les opérateurs de préfixe et de postfixe. C'est seulement dans le contexte du code appelant que la différence compte.

+0

donc il utilise simplement le même opérateur "incrément", peu importe si c'est post ou pré-incrément? – Dave

+0

@Dave, oui, c'est vrai. –

1

Fondamentalement, il n'y a pas besoin de faire une distinction parce que:

decimal x = y--; 

est équivalent à

decimal x = y; 
decimal.op_Decrement(y); 

et

decimal x = --y; 

est équivalent à

decimal x; 
decimal.op_Decrement(y); 
x = y;