Delen via


Overbelasting van operatoren

Opmerking

Deze inhoud wordt opnieuw afgedrukt met toestemming van Pearson Education, Inc. uit Framework Design Guidelines: Conventies, idioom en patronen voor herbruikbare .NET-bibliotheken, 2e editie. Die editie werd in 2008 gepubliceerd en het boek is sindsdien volledig herzien in de derde editie. Sommige informatie op deze pagina is mogelijk verouderd.

Met operatoroverbelasting kunnen frameworktypen worden weergegeven alsof ze ingebouwde taalprimitieven zijn.

Hoewel toegestaan en nuttig in sommige situaties, moet de overbelasting van de operator voorzichtig worden gebruikt. Er zijn veel gevallen waarin overbelasting van operatoren is misbruikt, zoals wanneer frameworkontwerpers operators voor bewerkingen gaan gebruiken die eenvoudige methoden moeten zijn. Aan de hand van de volgende richtlijnen kunt u bepalen wanneer en hoe u overbelasting van operatoren gebruikt.

❌ VERMIJD het definiëren van operatoroverbelastingen, behalve in typen die moeten lijken op primitieve (ingebouwde) typen.

✔️ OVERWEEG operatoroverbelastingen te definiëren in een type dat aanvoelt als een primitief type.

Bijvoorbeeld, System.String heeft operator== en operator!= gedefinieerd.

✔️ DO definieert overbelasting van operatoren in structs die getallen vertegenwoordigen (zoals System.Decimal).

❌ WEES NIET schattig bij het definiëren van overbelasting van operatoren.

Overbelasting van operatoren is handig in gevallen waarin het direct duidelijk is wat het resultaat van de bewerking zal zijn. Het is bijvoorbeeld logisch om één DateTime van een andere DateTime af te trekken en een TimeSpan te krijgen. Het is echter niet geschikt om de operator voor logische samenvoeging te gebruiken om twee databasequery's samen te stellen of om de shift-operator te gebruiken om naar een stream te schrijven.

❌ ZORG NIET voor overbelasting van operatoren, tenzij ten minste één van de operanden van het type is dat de overbelasting definieert.

✔️ DO overload operators op een symmetrische manier.

Als u bijvoorbeeld de operator== overbelast, moet u ook de operator!= overbelasten. Op dezelfde manier, als u de operator< overbelast, moet u ook operator> overbelasten, enzovoort.

✔️ OVERWEEG methoden te bieden met vriendelijke namen die overeenkomen met elke overbelaste operator.

Veel talen bieden geen ondersteuning voor overbelasting van operatoren. Daarom wordt aanbevolen dat typen die operators overbelasten een secundaire methode bevatten met een geschikte domeinspecifieke naam die equivalente functionaliteit biedt.

De volgende tabel bevat een lijst met operators en de bijbehorende vriendelijke methodenamen.

C#-operatorsymbool Naam van metagegevens Vriendelijke naam
N/A op_Implicit To<TypeName>/From<TypeName>
N/A op_Explicit To<TypeName>/From<TypeName>
+ (binary) op_Addition Add
- (binary) op_Subtraction Subtract
* (binary) op_Multiply Multiply
/ op_Division Divide
% op_Modulus Mod or Remainder
^ op_ExclusiveOr Xor
& (binary) op_BitwiseAnd BitwiseAnd
| op_BitwiseOr BitwiseOr
&& op_LogicalAnd And
|| op_LogicalOr Or
= op_Assign Assign
<< op_LeftShift LeftShift
>> op_RightShift RightShift
N/A op_SignedRightShift SignedRightShift
N/A op_UnsignedRightShift UnsignedRightShift
== op_Equality Equals
!= op_Inequality Equals
> op_GreaterThan CompareTo
< op_LessThan CompareTo
>= op_GreaterThanOrEqual CompareTo
<= op_LessThanOrEqual CompareTo
*= op_MultiplicationAssignment Multiply
-= op_SubtractionAssignment Subtract
^= op_ExclusiveOrAssignment Xor
<<= op_LeftShiftAssignment LeftShift
%= op_ModulusAssignment Mod
+= op_AdditionAssignment Add
&= op_BitwiseAndAssignment BitwiseAnd
|= op_BitwiseOrAssignment BitwiseOr
, op_Comma Comma
/= op_DivisionAssignment Divide
-- op_Decrement Decrement
++ op_Increment Increment
- (unary) op_UnaryNegation Negate
+ (unary) op_UnaryPlus Plus
~ op_OnesComplement OnesComplement

Overladen van de operator ==

operator == Overbelasting is behoorlijk ingewikkeld. De semantiek van de operator moet compatibel zijn met verschillende andere leden, zoals Object.Equals.

Conversieoperators

Conversieoperators zijn unaire operators die conversie van het ene type naar het andere toestaan. De operators moeten worden gedefinieerd als statische leden van de operand of het teruggeeftype. Er zijn twee typen conversieoperators: impliciet en expliciet.

❌ GEEF GEEN conversieoperator op als een dergelijke conversie niet duidelijk wordt verwacht door de eindgebruikers.

❌ DEFINIEER GEEN conversieoperators buiten het domein van een type.

Bijvoorbeeld, Int32Doubleen Decimal zijn alle numerieke typen, terwijl dat DateTime niet zo is. Daarom moet er geen conversieoperator zijn om een Double(long) te converteren naar een DateTime. In dat geval heeft een constructor de voorkeur.

❌ GEEF GEEN impliciete conversieoperator op als de conversie mogelijk verlies kan veroorzaken.

Er mag bijvoorbeeld geen impliciete conversie van Double naar Int32 zijn, omdat Double een groter bereik heeft dan Int32. Er kan een expliciete conversieoperator worden opgegeven, zelfs als de conversie mogelijk verliesbaar is.

❌ Gooi geen uitzonderingen bij impliciete conversies.

Het is erg moeilijk voor eindgebruikers om te begrijpen wat er gebeurt, omdat ze zich mogelijk niet bewust zijn van een conversie.

✔️ GOOI System.InvalidCastException als een oproep naar een cast-operator resulteert in een verlieslatende conversie en het contract van de operator staat geen verlieslatende conversies toe.

© Gedeelten 2005, 2009 Microsoft Corporation. Alle rechten voorbehouden.

Herdrukt door toestemming van Pearson Education, Inc. van Framework Design Guidelines: Conventions, Idioms, and Patterns for Reusable .NET Libraries, 2nd Edition by Krzysztof Cwalina and Brad Abrams, gepubliceerd 22 oktober 2008 door Addison-Wesley Professional als onderdeel van de Microsoft Windows Development Series.

Zie ook