Aracılığıyla paylaş


İş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 DateTimegerekmez. 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 Int32daha 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ı.

Ayrıca bkz.