Instrucciones de uso para sobrecargar operadores
En las reglas siguientes se describen las pautas para sobrecargar operadores:
Defina los operadores en tipos de valor que sean tipos de lenguajes lógicos integrados, como la Estructura System.Decimal.
Proporcione métodos de sobrecarga de operadores sólo en la clase en la que se definen los métodos. El compilador de C# cumple esta directriz.
Utilice las convenciones de firma y de nomenclatura descritas en Common Language Specification (CLS). El compilador de C# lo hace automáticamente.
Utilice la sobrecarga de operadores en los casos en los que el resultado de la operación es obvio. Por ejemplo, tiene sentido poder restar un valor Time de otro valor Time y obtener un TimeSpan. No obstante, no es adecuado utilizar el operador or para crear la unión de dos consultas a la base de datos, o utilizar shift para escribir una secuencia.
Sobrecargue los operadores de forma simétrica. Por ejemplo, si sobrecarga el operador de igualdad (==), también debe sobrecargar el operador distinto de (!=).
Proporcione firmas alternativas. La mayoría de los lenguajes no son compatibles con la sobrecarga de operadores. Por esta razón, es un requisito de CLS que todos los tipos que sobrecargan operadores incluyan un método secundario con un nombre apropiado específico al dominio que proporcione la funcionalidad equivalente. La inclusión de un método secundario es un requisito de Common Language Specification (CLS). El ejemplo siguiente es compatible con CLS.
public struct DateTime { public static TimeSpan operator -(DateTime t1, DateTime t2) { } public static TimeSpan Subtract(DateTime t1, DateTime t2) { } }
La tabla siguiente contiene una lista de símbolos de operadores y los métodos alternativos y nombres de operadores correspondientes.
Símbolo de operador C++ | Nombre de método alternativo | Nombre de operador |
---|---|---|
No está definido | ToXxx o FromXxx | op_Implicit |
No está definido | ToXxx o FromXxx | op_Explicit |
+ (binario) | Add | op_Addition |
- (binario) | Subtract | op_Subtraction |
* (binario) | Multiply | op_Multiply |
/ | Divide | op_Division |
% | Mod | op_Modulus |
^ | Xor | op_ExclusiveOr |
& (binario) | BitwiseAnd | op_BitwiseAnd |
| | BitwiseOr | op_BitwiseOr |
&& | And | op_LogicalAnd |
|| | Or | op_LogicalOr |
= | Assign | op_Assign |
<< | LeftShift | op_LeftShift |
>> | RightShift | op_RightShift |
No está definido | LeftShift | op_SignedRightShift |
No está definido | RightShift | op_UnsignedRightShift |
== | Equals | op_Equality |
> | Compare | op_GreaterThan |
< | Compare | op_LessThan |
!= | Compare | op_Inequality |
>= | Compare | op_GreaterThanOrEqual |
<= | Compare | op_LessThanOrEqual |
*= | Multiply | op_MultiplicationAssignment |
-= | Subtract | op_SubtractionAssignment |
^= | Xor | op_ExclusiveOrAssignment |
<<= | LeftShift | op_LeftShiftAssignment |
%= | Mod | op_ModulusAssignment |
+= | Add | op_AdditionAssignment |
&= | BitwiseAnd | op_BitwiseAndAssignment |
|= | BitwiseOr | op_BitwiseOrAssignment |
, | No hay ninguno asignado | op_Comma |
/= | Divide | op_DivisionAssignment |
-- | Decrement | op_Decrement |
++ | Increment | op_Increment |
- (unario) | Negate | op_UnaryNegation |
+ (unario) | Plus | op_UnaryPlus |
~ | OnesComplement | op_OnesComplement |
Vea también
Instrucciones de diseño para programadores de bibliotecas de clases