Poznámka:
Přístup k této stránce vyžaduje autorizaci. Můžete se zkusit přihlásit nebo změnit adresáře.
Přístup k této stránce vyžaduje autorizaci. Můžete zkusit změnit adresáře.
Poznámka:
Tento obsah je znovu vytištěn oprávněním Pearson Education, Inc. z Framework Design Guidelines: Conventions, Idioms a Patterns for Reusable .NET Libraries, 2. vydání. Tato edice byla publikována v roce 2008 a kniha byla od té doby plně upravena ve třetím vydání. Některé informace na této stránce můžou být zastaralé.
Přetížení operátorů umožňují, aby se typy rozhraní zobrazovaly, jako by byly předdefinované primitivy jazyka.
I když jsou povolené a užitečné v některých situacích, přetížení operátorů by se mělo používat opatrně. Existuje mnoho případů, kdy přetížení operátoru bylo zneužito, například když návrháři architektury začali používat operátory pro operace, které by měly být jednoduché metody. Následující pokyny by vám měly pomoct při rozhodování, kdy a jak používat přetížení operátoru.
❌ VYHNĚTE se definování přetížení operátorů, s výjimkou typů, které by měly být jako primitivní (předdefinované) typy.
✔️ ZVAŽTE definování přetížení operátoru v typu, který se má chovat jako primitivní typ.
Například jsou definovány System.String a operator== v operator!=.
✔️ DO definovat přetížení operátorů ve strukturách, které představují čísla (například System.Decimal).
❌ PŘI definování přetížení operátoru NEBUĎTE roztomilí.
Přetížení operátoru je užitečné v případech, kdy je okamžitě zřejmé, jaký bude výsledek operace. Například dává smysl, aby bylo možné jeden odečíst DateTime od druhého DateTime a získat TimeSpan. Není však vhodné použít operátor logické sjednocení ke sjednocování dvou databázových dotazů nebo k zápisu do datového proudu pomocí operátoru shift.
❌ NEPOSKYTUJTE přetížení operátoru, pokud alespoň jeden z operandů není typu definující přetížení.
Operátory přetěžujte symetrickým způsobem.
Například pokud přetěžujete operator==, měli byste také přetížit operator!=. Podobně, pokud přetížíte operator<, měli byste také přetížit operator> a tak dále.
✔️ Zvažte poskytnutí metod s vhodnými názvy, které odpovídají jednotlivým přetíženým operátorům.
Mnoho jazyků nepodporuje přetížení operátoru. Z tohoto důvodu se doporučuje, aby typy, které přetěžují operátory, obsahovaly sekundární metodu s odpovídajícím názvem specifickým pro doménu, která poskytuje ekvivalentní funkčnost.
Následující tabulka obsahuje seznam operátorů a odpovídající popisné názvy metod.
| Symbol operátoru jazyka C# | Název metadat | Přívětivý název |
|---|---|---|
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 |
Přetížení operátoru ==
Přetížení operator == je poměrně složité. Sémantika operátoru musí být kompatibilní s několika dalšími členy, například Object.Equals.
Operátory převodu
Převodní operátory jsou unární operátory, které umožňují převod z jednoho typu na jiný. Operátory musí být definovány jako statické členy operandu nebo návratového typu. Existují dva typy převodních operátorů: implicitní a explicitní.
❌ NEPOSKYTUJTE operátor převodu, pokud tento převod není jednoznačně očekáváno koncovými uživateli.
❌ NEdefinujte operátory převodu mimo doménu typu.
Například Int32, Doublea Decimal jsou všechny číselné typy, zatímco DateTime ne. Proto by neměl existovat žádný operátor převodu pro převod typu Double(long) na typ DateTime. Konstruktor je v takovém případě upřednostňovaný.
❌ NEPOSKYTUJTE implicitní převodní operátor, pokud je převod potenciálně ztrátový.
Například by neměl být implicitní převod z Double na Int32, protože Double má širší rozsah než Int32. Explicitní operátor převodu lze poskytnout i v případě, že při převodu může dojít ke ztrátám.
❌ NEVYVOLÁVEJTE výjimky z implicitní konverze.
Koncovým uživatelům je velmi obtížné pochopit, co se děje, protože si nemusí být vědomi, že probíhá převod.
✔️ DO vyvolat System.InvalidCastException , pokud volání operátoru přetypování vede ke ztrátové konverzi a podmínky operátoru neumožňují ztrátové konverze.
Části z © 2005, 2009 Microsoft Corporation. Všechna práva vyhrazena.
Přetištěno se svolením Pearson Education, Inc. z Framework Design Guidelines: Conventions, Idioms, and Patterns for Reusable .NET Libraries, 2nd Edition od Krzysztofa Cwaliny a Brada Abramse, vydáno 22. října 2008 nakladatelstvím Addison-Wesley Professional jako součást série Microsoft Windows Development.