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