Di C #, kami dapat membebani operator konversi implisit seperti ini (contoh dari MSDN ):
struct Digit
{
/* ... */
public static implicit operator byte(Digit d) // implicit digit to byte conversion operator
{
/* ... */
}
}
Dengan demikian, kita dapat memiliki tipe, tipe nilai khusus , secara ajaib mengubah dirinya menjadi tipe lain (yang tidak terkait), meninggalkan penonton dalam kebingungan (sampai mereka mengintip ke belakang panggung dan melihat operator konversi implisit, yaitu).
Saya tidak suka meninggalkan orang yang membaca kode saya dengan bingung. Saya rasa tidak banyak orang yang tahu.
Pertanyaannya adalah, apa saja kasus penggunaan dari operator konversi tipe implisit yang tidak akan membuat kode saya jauh lebih sulit untuk dipahami?
Jawaban:
Saya hanya akan merekomendasikan konversi implisit antara jenis yang secara kasar mewakili nilai yang sama dengan cara yang berbeda. Contohnya:
RGB
,HSL
,HSV
danCMYK
.Meter
vs.Inch
).Namun, ada beberapa pedoman kuat yang menunjukkan kapan tidak tepat untuk menentukan konversi implisit:
InvalidCast
pengecualian ), maka itu tidak boleh implisit.O(1)
operasi, maka itu tidak boleh implisit.Sekarang katakan operator konversi
f: T1 -> T2
Anda tidak melanggar salah satu aturan di atas, maka perilaku berikut sangat menunjukkan bahwa konversi dapat tersirat:a == b
demikianf(a) == f(b)
.a != b
demikianf(a) != f(b)
.a.ToString() == b.ToString()
demikianf(a).ToString() == f(b).ToString()
.T1
danT2
.sumber
T1
(tersirat oleh==
relasi padaT1
) selalu memetakan ke dua nilai dalam kelas ekivalensi yang sama yaituT2
. Sekarang saya memikirkannya, saya kira properti pertama sebenarnya harus diperlukan untuk konversi implisit.Ketika jenisnya tidak terkait (untuk programmer). Ada skenario (jarang) di mana Anda memiliki dua jenis yang tidak terkait (sejauh kode terkait), yang sebenarnya terkait (sejauh domain atau programmer yang masuk akal) yang bersangkutan.
Misalnya, beberapa kode melakukan pencocokan string. Skenario umum adalah mencocokkan string literal. Alih-alih menelepon
IsMatch(input, new Literal("some string"))
, konversi implisit memungkinkan Anda menyingkirkan upacara itu - suara dalam kode - dan fokus pada string literal.Sebagian besar programmer akan melihat
IsMatch(input, "some string")
dan dengan cepat memahami apa yang sedang terjadi. Itu membuat kode Anda lebih jelas di situs panggilan. Singkatnya, itu membuat sedikit lebih mudah untuk memahami apa yang sedang terjadi, dengan sedikit biaya bagaimana itu terjadi.Sekarang, Anda mungkin berpendapat bahwa fungsi sederhana kelebihan beban untuk melakukan hal yang sama akan lebih baik. Dan itu. Tetapi jika hal semacam ini ada di mana-mana, maka memiliki satu konversi lebih bersih (lebih sedikit kode, meningkatkan konsistensi) daripada melakukan tumpukan fungsi yang berlebihan.
Dan Anda mungkin berpendapat bahwa lebih baik meminta programmer untuk secara eksplisit membuat tipe perantara sehingga mereka melihat "apa yang sebenarnya terjadi". Itu kurang mudah. Secara pribadi, saya berpikir bahwa contoh pencocokan string literal sangat jelas tentang "apa yang sebenarnya terjadi" - programmer tidak perlu tahu mekanisme tentang bagaimana semuanya terjadi. Apakah Anda tahu bagaimana semua kode Anda dijalankan oleh berbagai prosesor yang dijalankan oleh kode Anda? Selalu ada garis abstraksi di mana programmer berhenti peduli tentang bagaimana sesuatu bekerja. Jika Anda berpikir bahwa langkah-langkah konversi implisit penting, maka jangan gunakan konversi implisit. Jika Anda pikir mereka hanya upacara untuk menjaga komputer bahagia, dan programmer akan lebih baik tidak melihat suara itu di mana-mana,
sumber