Catatan
Akses ke halaman ini memerlukan otorisasi. Anda dapat mencoba masuk atau mengubah direktori.
Akses ke halaman ini memerlukan otorisasi. Anda dapat mencoba mengubah direktori.
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.