Richtlinien für die Verwendung des Überladens von Operatoren

Die folgenden Regeln dienen als Richtlinie für die Überladung von Operatoren:

  • Definieren Sie Operatoren für Werttypen, die logische integrierte Sprachtypen sind, wie etwa die System.Decimal-Struktur.

  • Stellen Sie Methoden für die Operatorüberladung nur in der Klasse bereit, in der die Methoden definiert werden. Der C#-Compiler erzwingt diese Richtlinie.

  • Verwenden Sie die Benennungs- und Signaturkonventionen, die in der Common Language Specification (CLS) beschrieben werden. Der C#-Compiler führt dies automatisch aus.

  • Verwenden Sie die Operatorüberladung in Fällen, in denen offensichtlich ist, zu welchem Ergebnis die Operation führen wird. So ist z. B. die Möglichkeit sinnvoll, einen Time-Wert von einem anderen Time-Wert zu subtrahieren und einen TimeSpan-Wert zu errechnen. Hingegen ist es nicht sinnvoll, mit dem or-Operator die Union zweier Datenbankabfragen zu erstellen oder mit Hilfe von shift in einen Stream zu schreiben.

  • Überladen Sie Operatoren symmetrisch. Wenn Sie beispielsweise den Gleichheitsoperator (==) überladen, sollten Sie auch den Ungleichheitsoperator (!=) überladen.

  • Stellen Sie alternative Signaturen bereit. Die meisten Sprachen unterstützen Operatorüberladung nicht. Daher besteht die CLS-Bedingung für alle Typen, die Operatoren überladen, stets eine sekundäre Methode mit einem geeigneten domänenspezifischen Namen hinzuzufügen, die eine äquivalente Funktion bereitstellt. Bei der Common Language Specification (CLS) ist die Bereitstellung dieser zweiten Methode eine Bedingung. Das folgende Beispiel ist CLS-konform.

    public struct DateTime 
    {
       public static TimeSpan operator -(DateTime t1, DateTime t2) { }
       public static TimeSpan Subtract(DateTime t1, DateTime t2) { }
    }
    

In der folgenden Tabelle werden die Operatorsymbole mit den zugehörigen alternativen Methoden und den Operatornamen aufgelistet.

C++-Operatorsymbol Name der alternativen Methode Name des Operators
Nicht definiert ToXxx oder FromXxx op_Implicit
Nicht definiert ToXxx oder FromXxx op_Explicit
+ (binär) Add op_Addition
- (binär) Subtract op_Subtraction
* (binär) Multiply op_Multiply
/ Divide op_Division
% Mod op_Modulus
^ Xor op_ExclusiveOr
& (binär) BitwiseAnd op_BitwiseAnd
| BitwiseOr op_BitwiseOr
&& And op_LogicalAnd
|| Or op_LogicalOr
= Assign op_Assign
<< LeftShift op_LeftShift
>> RightShift op_RightShift
Nicht definiert LeftShift op_SignedRightShift
Nicht definiert 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
, Keine zugewiesen op_Comma
/= Divide op_DivisionAssignment
-- Decrement op_Decrement
++ Increment op_Increment
- (unär) Negate op_UnaryNegation
+ (unär) Plus op_UnaryPlus
~ OnesComplement op_OnesComplement

Siehe auch

Entwurfsrichtlinien für die Entwicklung von Klassenbibliotheken