Condividi tramite


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