Aracılığıyla paylaş


İşleç Aşırı Yüklemeleri

Uyarı

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.

İzin verildiği ve bazı durumlarda yararlı olduğu hâlde, 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.Stringoperator== ve operator!= tanımlıdır olarak sahiptir.

✔️ 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, bir DateTime'yi başka bir DateTime'den çıkarıp bir TimeSpan almak mantıklıdır. 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 olmadıkça işleç aşırı yüklemeleri SAĞLAMAYIN.

✔️ İşleçleri simetrik bir şekilde aşırı yükleyin.

Örneğin, operator== öğesini aşırı yüklerseniz, operator!= öğesini de aşırı yüklemelisiniz. Benzer şekilde, eğer operator< öğesini aşırı yüklerseniz, kaçınılmaz olarak operator> öğesini de aşırı yüklemelisiniz, ve benzeri.

✔️ Her aşırı yüklenmiş işlec için uygun adlar taşıyan 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ı Dostça İsim
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. İşlecin semantiğinin birkaç üye ile, gibi Object.Equals, uyumlu olması gerekir.

Dönüştürme İş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, Double(long) 'u DateTime'e dönüştüren bir dönüştürme işleci olmamalıdır. Böyle bir durumda yapıcı tercih edilir.

❌ Dönüştürme potansiyel olarak kayıplıysa örtük bir dönüştürme işleci SAĞLAMAYIN.

Örneğin, Double'nin kapsadığı aralık, Int32'ün kapsadığı aralıktan daha geniş olduğundan Double'den Int32'e örtük bir dönüşüm 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ür dönüşümlerinden istisnalar FIRLATMAYIN.

Son kullanıcıların ne olduğunu anlaması çok zordur, çünkü bir dönüştürmenin gerçekleştiğinin farkında olmayabilirler.

✔️ Dönüşüm işlecine yapılan bir çağrı, kayıplı bir dönüşümle sonuçlanırsa ve işlecin sözleşmesi kayıplı dönüşümlere izin vermiyorsa, istisna atın System.InvalidCastException.

Porsiyonlar © 2005, 2009 Microsoft Corporation. Tüm hakları saklıdır.

Pearson Education, Inc. tarafından Krzysztof Cwalina ve Brad Abrams'ın Yeniden Kullanılabilir .NET Kütüphaneleri için Çerçeve Tasarım Yönergeleri: Sözleşmeler, Deyimler ve Kalıplar, 2. Baskı eserinden izniyle yeniden basılmıştır. Addison-Wesley Professional tarafından Microsoft Windows Geliştirme Serisi kapsamında 22 Ekim 2008'de yayımlanmıştır.

Ayrıca bakınız