Bagikan melalui


Overload Operator

Catatan

Konten ini dicetak ulang oleh izin Pearson Education, Inc. dari Panduan Desain Kerangka Kerja: Konvensi, Idiom, dan Pola untuk Pustaka .NET yang Dapat Digunakan Kembali, Edisi ke-2. Edisi itu diterbitkan pada tahun 2008, dan buku tersebut telah sepenuhnya direvisi pada edisi ketiga. Beberapa informasi di halaman ini mungkin sudah kedaluarsa.

Kelebihan operator memungkinkan jenis kerangka kerja muncul seolah-olah mereka adalah bahasa primitif bawaan.

Meskipun diperbolehkan dan berguna dalam beberapa situasi, kelebihan beban operator harus digunakan dengan hati-hati. Ada banyak kasus di mana kelebihan beban operator telah disalahgunakan, seperti ketika perancang kerangka kerja mulai menggunakan operator untuk operasi yang seharusnya menjadi metode sederhana. Panduan berikut akan membantu Anda memutuskan kapan dan bagaimana menggunakan operator overloading.

❌ HINDARI mendefinisikan kelebihan operator, kecuali dalam tipe yang seharusnya terasa seperti tipe primitif (bawaan).

️ PERTIMBANGKAN untuk mendefinisikan kelebihan operator dalam tipe yang seharusnya terasa seperti tipe primitif.

Misalnya, System.String memiliki operator== dan operator!= yang ditentukan.

️ JANGAN tentukan kelebihan operator dalam struct yang mewakili angka (seperti System.Decimal ).

❌ JANGAN bersikap manis saat mendefinisikan kelebihan operator.

Kelebihan operator berguna dalam kasus di mana hasil operasi akan segera terlihat. Misalnya, masuk akal untuk mengurangi satu DateTime dari DateTime lainnya dan mendapatkan TimeSpan. Namun, tidak tepat menggunakan operator gabungan logis untuk menggabungkan dua kueri database, atau menggunakan operator shift untuk menulis ke aliran.

❌ JANGAN memberikan operator kelebihan beban kecuali setidaknya salah satu operan bertipe mendefinisikan kelebihan beban.

️ LAKUKAN operator yang berlebihan secara simetris.

Misalnya, jika Anda membebani operator==, Anda juga harus membebani operator!=. Demikian pula, jika Anda membebani operator<, Anda juga harus membebani operator>, dan seterusnya.

️ PERTIMBANGKAN untuk menyediakan metode dengan nama ramah yang sesuai dengan setiap operator yang kelebihan beban.

Banyak bahasa tidak mendukung kelebihan beban operator. Untuk alasan ini, direkomendasikan bahwa jenis yang membebani operator menyertakan metode sekunder dengan nama khusus domain yang sesuai yang menyediakan fungsionalitas yang setara.

Tabel berikut berisi daftar operator dan nama metode ramah yang sesuai.

Simbol Operator C# Nama Metadata Nama yang Mudah Diingat
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

Overload Operator ==

Overloading operator == cukup rumit. Semantik operator harus kompatibel dengan beberapa anggota lain, seperti Object.Equals.

Operator Konversi

Operator konversi adalah operator unary yang memungkinkan konversi dari satu jenis ke jenis lainnya. Operator harus didefinisikan sebagai anggota statis pada operan atau tipe kembalian. Ada dua jenis operator konversi: implisit dan eksplisit.

❌ JANGAN berikan operator konversi jika konversi tersebut tidak diharapkan dengan jelas oleh pengguna akhir.

❌ JANGAN tentukan operator konversi di luar jenis domain.

Misalnya, Int32, Double, dan Decimal semuanya berjenis numerik, sedangkan DateTime bukan. Oleh karena itu, tidak boleh ada operator konversi untuk mengonversi Double(long) menjadi DateTime. Konstruktor lebih disukai dalam kasus seperti itu.

❌ JANGAN berikan operator konversi implisit jika konversi berpotensi lossy.

Misalnya, tidak boleh ada konversi tersirat dari Double ke Int32 karena Double memiliki rentang yang lebih luas daripada Int32. Operator konversi eksplisit dapat disediakan bahkan jika konversi berpotensi lossy.

❌ JANGAN membuang pengecualian dari pemeran implisit.

Sangat sulit bagi pengguna akhir untuk memahami apa yang terjadi, karena mereka mungkin tidak menyadari bahwa konversi sedang berlangsung.

️ LAKUKAN lempar System.InvalidCastException jika panggilan ke operator pemeran menghasilkan konversi lossy dan kontrak operator tidak mengizinkan konversi lossy.

Portions © 2005, 2009 Microsoft Corporation. Semua hak dilindungi undang-undang.

Dicetak ulang dengan izin dari Pearson Education, Inc. dari Framework Design Guidelines: Conventions, Idioms, and Patterns for Reusable .NET Libraries, 2nd Edition oleh Krzysztof Cwalina dan Brad Abrams, diterbitkan 22 Okt 2008 oleh Addison-Wesley Professional sebagai bagian dari Seri Pengembangan Microsoft Windows.

Lihat juga