Istruzioni per l'uso dell'overload degli operatori
Le istruzioni per l'overload degli operatori sono definite dalle regole riportate di seguito.
Definire gli operatori sui tipi di valore incorporati in modo logico nei linguaggi, ad esempio la struttura System.Decimal.
Fornire metodi di overload degli operatori solo nella classe in cui i metodi sono definiti. Questa regola viene applicata dal compilatore C#.
Utilizzare i nomi e le convenzioni di firma descritti in Common Language Specification (CLS). Questa operazione viene eseguita automaticamente dal compilatore C#.
Utilizzare l'overload degli operatori nei casi in cui è immediatamente ovvio il risultato dell'operazione. È opportuno, ad esempio, poter sottrarre un valore Time da un altro valore Time e ottenere un TimeSpan. Non è appropriato, tuttavia, utilizzare l'operatore or per creare l'unione di due query di database o utilizzare shift per scrivere in un flusso.
Eseguire l'overload degli operatori in modo simmetrico. Se, ad esempio, si esegue l'overload dell'operatore di uguaglianza (==), eseguire anche l'overload dell'operatore di disuguaglianza (!=).
Fornire firme alternative. La maggior parte dei linguaggi non supportano l'overload degli operatori. Per questo motivo, in CLS è necessario che tutti i tipi che determinano l'overload degli operatori includano un metodo secondario con un nome specifico per il dominio appropriato e in grado di fornire funzionalità equivalenti. In Common Language Specification (CLS) è necessario fornire il metodo secondario. L'esempio seguente è compatibile con CLS.
public struct DateTime { public static TimeSpan operator -(DateTime t1, DateTime t2) { } public static TimeSpan Subtract(DateTime t1, DateTime t2) { } }
Nella tabella riportata di seguito sono elencati i simboli degli operatori e i nomi dei metodi alternativi e degli operatori corrispondenti.
Simbolo dell'operatore C++ | Nome del metodo alternativo | Nome dell'operatore |
---|---|---|
Non definito | ToXxx o FromXxx | op_Implicit |
Non definito | 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 |
Non definito | LeftShift | op_SignedRightShift |
Non definito | 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 |
, | Non assegnato | op_Comma |
/= | Divide | op_DivisionAssignment |
-- | Decrement | op_Decrement |
++ | Increment | op_Increment |
- (unario) | Negate | op_UnaryNegation |
+ (unario) | Plus | op_UnaryPlus |
~ | OnesComplement | op_OnesComplement |
Vedere anche
Istruzioni di progettazione per gli sviluppatori di librerie di classi