Bagikan melalui


Operator Kelebihan Beban

Nota

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 beban operator memungkinkan jenis kerangka kerja muncul seolah-olah mereka adalah primitif bahasa bawaan.

Meskipun diizinkan 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 merupakan metode sederhana. Panduan berikut akan membantu Anda memutuskan kapan dan bagaimana menggunakan kelebihan beban operator.

❌ HINDARI menentukan kelebihan beban operator, kecuali dalam jenis yang seharusnya terasa seperti jenis primitif (bawaan).

✔️ PERTIMBANGKAN untuk menentukan kelebihan beban operator dalam jenis yang seharusnya terasa seperti jenis primitif.

Misalnya, System.String memiliki operator== dan operator!= didefinisikan.

✔️ DO menentukan kelebihan beban operator dalam struktur yang mewakili angka (seperti System.Decimal).

❌ JANGAN imut saat menentukan kelebihan beban operator.

Kelebihan beban operator berguna dalam kasus di mana segera jelas apa hasil operasinya. Misalnya, masuk akal untuk dapat mengurangkan satu DateTime dari yang lainnya DateTime dan mendapatkan TimeSpan. Namun, tidak tepat untuk menggunakan operator union logis untuk menggabungkan dua kueri database, atau menggunakan operator geser untuk menulis ke dalam stream.

❌ JANGAN menyediakan kelebihan beban operator kecuali setidaknya salah satu operand adalah jenis yang menentukan kelebihan beban.

✔️ Lakukan overload operator dengan cara simetris.

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

✔️ 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, disarankan agar jenis operator kelebihan beban 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 Ramah Pengguna
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

Operator Kelebihan Beban ==

Kelebihan beban 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 operand atau jenis pengembalian. Ada dua jenis operator konversi: implisit dan eksplisit.

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

❌ JANGAN tentukan operator konversi di luar domain jenis.

Misalnya, Int32, , dan Double semua jenis numerik, sedangkan DecimalDateTimetidak. Oleh karena itu, seharusnya tidak ada operator konversi untuk mengonversi Double(long) ke DateTime. Konstruktor lebih disukai dalam kasus seperti itu.

❌ JANGAN berikan operator konversi implisit jika konversi berpotensi hilang.

Misalnya, tidak boleh ada konversi implisit dari Double ke Int32 karena Double memiliki rentang yang lebih luas daripada Int32. Operator konversi eksplisit dapat disediakan meskipun konversi berpotensi hilang.

❌ JANGAN mengeluarkan pengecualian pada cast implisit.

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

✔️ DO lempar System.InvalidCastException jika panggilan ke operator cast menghasilkan konversi yang merugikan dan kontrak operator tidak mengizinkan konversi semacam itu.

© Sebagian 2005, 2009 Microsoft Corporation. Seluruh hak cipta dilindungi.

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 oleh Krzysztof Cwalina dan Brad Abrams, diterbitkan 22 Okt 2008 oleh Addison-Wesley Professional sebagai bagian dari Seri Pengembangan Microsoft Windows.

Lihat juga