İşleç Aşırı Yüklemeleri
Not
Bu içerik, Çerçeve Tasarım Yönergeleri: Kurallar, Deyimler ve Yeniden Kullanılabilir .NET Kitaplıkları için Desenler, 2. Sürüm'den Pearson Education, Inc.'in izniyle yeniden yazdırılır. Bu baskı 2008'de yayımlandı ve kitap o zamandan beri üçüncü baskıda tamamen revize edilmiştir. Bu sayfadaki bazı bilgiler güncel olmayabilir.
İşleç aşırı yüklemeleri, çerçeve türlerinin yerleşik dil temel bileşenleriymiş gibi görünmesini sağlar.
Bazı durumlarda izin verilse de, işleç aşırı yüklemeleri dikkatli kullanılmalıdır. Çerçeve tasarımcılarının basit yöntemler olması gereken işlemler için işleçleri kullanmaya başlaması gibi işleç aşırı yüklemenin kötüye kullanıldığı birçok durum vardır. Aşağıdaki yönergeler, işleç aşırı yüklemesinin ne zaman ve nasıl kullanılacağına karar vermenize yardımcı olmalıdır.
❌ İlkel (yerleşik) türler gibi hissetmesi gereken türler dışında işleç aşırı yüklemelerini tanımlamaktan KAÇıNıN.
✔️ İlkel bir tür gibi hissetmesi gereken bir türdeki işleç aşırı yüklemelerini tanımlamayı GÖZ ÖNÜNDE BULUNDURUN.
Örneğin, System.String has operator==
ve operator!=
defined.
✔️ DO, sayıları temsil eden yapılarda işleç aşırı yüklemelerini tanımlar (örneğin System.Decimal).
❌ İşleç aşırı yüklemelerini tanımlarken sevimli OLMAYIN.
İşleç aşırı yüklemesi, işlemin sonucunun hemen belli olduğu durumlarda kullanışlıdır. Örneğin, birini bir başkasından DateTime çıkarmak ve almak mantıklıdırTimeSpan.DateTime
Ancak, mantıksal birleşim işlecini kullanarak iki veritabanı sorgularını bir arada kullanmak veya bir akışa yazmak için shift işlecini kullanmak uygun değildir.
❌ İşlenenlerden en az biri aşırı yüklemeyi tanımlayan türde değilse işleç aşırı yüklemeleri SAĞLAMAYIN.
✔️ DO işleçlerini simetrik bir şekilde aşırı yükler.
Örneğin, öğesini aşırı yüklerseniz operator==
, öğesini de aşırı yüklemelisiniz operator!=
. Benzer şekilde, öğesini aşırı yüklerseniz operator<
, ve benzerini de aşırı yüklemelisiniz operator>
.
✔️ Aşırı yüklenmiş her işlecine karşılık gelen kolay adlara sahip yöntemler sağlamayı GÖZ ÖNÜNDE BULUNDURUN.
Birçok dil işleç aşırı yüklemesini desteklemez. Bu nedenle, aşırı yükleme işleçleri türlerinin eşdeğer işlevsellik sağlayan uygun etki alanına özgü ada sahip ikincil bir yöntem içermesi önerilir.
Aşağıdaki tabloda işleçlerin listesi ve buna karşılık gelen kolay yöntem adları yer alır.
C# İşleci Simgesi | Meta Veri Adı | Kolay Ad |
---|---|---|
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 |
Aşırı Yükleme İşleci ==
Aşırı yükleme operator ==
oldukça karmaşıktır. işlecin semantiğinin gibi Object.Equalsdiğer birkaç üyeyle uyumlu olması gerekir.
Dönüşüm İşleçleri
Dönüştürme işleçleri, bir türden diğerine dönüştürmeye izin veren birli işleçlerdir. İşleçler işlenende veya dönüş türünde statik üyeler olarak tanımlanmalıdır. İki tür dönüştürme işleci vardır: örtük ve açık.
❌ Bu tür bir dönüştürme son kullanıcılar tarafından açıkça beklenmiyorsa dönüştürme işleci SAĞLAMAYIN.
❌ Bir türün etki alanı dışında dönüştürme işleçleri TANıMLAMAYIN.
Örneğin, Int32, Doubleve Decimal tüm sayısal türlerdir, ancak DateTime değildir. Bu nedenle, dönüştürme işlecinin bir Double(long)
'a dönüştürülmesi DateTime
gerekmez. Böyle bir durumda oluşturucu tercih edilir.
❌ Dönüştürme potansiyel olarak kayıplıysa örtük bir dönüştürme işleci SAĞLAMAYIN.
Örneğin, değerinden Int32
daha geniş bir aralığı olduğundanDouble
' den Double
'a Int32
örtük bir dönüştürme olmamalıdır. Dönüştürme potansiyel olarak kayıplı olsa bile açık bir dönüştürme işleci sağlanabilir.
❌ Örtük türlerden özel durumlar OLUŞTURMAYIN.
Son kullanıcıların ne olduğunu anlaması çok zordur, çünkü bir dönüştürmenin gerçekleştiğinin farkında olmayabilirler.
✔️ Bir atama işlecine yapılan bir çağrı kayıplı dönüştürmeyle sonuçlanırsa ve işlecin sözleşmesi kayıplı dönüştürmelere izin vermiyorsa DO oluşturur System.InvalidCastException .
Porsiyonlar © 2005, 2009 Microsoft Corporation. Tüm hakları saklıdır.
Pearson Education, Inc. in Framework Design Guidelines: Conventions, Idioms, and Patterns for Reusable .NET Libraryes, 2nd Edition by Krzysztof Cwalina and Brad Abrams izniyle yeniden yazdırıldı ve 22 Ekim 2008'de Addison-Wesley Professional tarafından Microsoft Windows Geliştirme Serisi'nin bir parçası olarak yayımlandı.