Judulnya menyesatkan, jadi silakan baca seluruh pertanyaan :-) .
Dengan "senyawa operator penugasan" Aku ada dalam pikiran konstruk seperti ini op=
, misalnya +=
. Operator penugasan murni ( =
) bukan milik pertanyaan saya.
Dengan "mengapa" saya tidak bermaksud pendapat, tetapi sumber daya (buku, artikel, dll) ketika beberapa desainer, atau rekan kerja mereka, dll mengungkapkan alasan mereka (yaitu sumber pilihan desain).
Saya bingung dengan asimetri yang ditemukan di C ++ dan C # ( ya, saya tahu C # bukan C ++ 2.0 ) - di C ++ Anda akan membebani operator +=
dan kemudian secara otomatis menulis +
operator yang sesuai dengan mengandalkan operator yang ditentukan sebelumnya. Dalam C # itu terbalik - Anda kelebihan +
dan +=
disintesis untuk Anda.
Jika saya tidak salah, pendekatan selanjutnya akan membunuh peluang untuk optimasi dalam kasus aktual +=
, karena objek baru harus dibuat. Jadi harus ada beberapa keuntungan besar dari pendekatan semacam itu, tetapi MSDN terlalu malu untuk menceritakannya.
Dan saya ingin tahu apa keuntungannya - jadi jika Anda melihat penjelasan di beberapa buku C #, video tech-talk, entri blog, saya akan berterima kasih atas rujukannya.
Hal terdekat yang saya temukan adalah komentar di blog Eric Lippert. Mengapa operator yang kelebihan beban selalu statis di C #? oleh Tom Brown. Jika overloading statis diputuskan terlebih dahulu, itu hanya menentukan operator mana yang dapat kelebihan beban untuk struct. Ini lebih lanjut menentukan apa yang bisa kelebihan beban untuk kelas.
sumber
+=
pertama tampaknya tidak masuk akal; mengapa Anda membebani operasi gabungan daripada bagian-bagiannya?*=
mutasi jenis referensi secara semantik salah.Jawaban:
Saya tidak dapat menemukan referensi untuk ini, tetapi pemahaman saya adalah bahwa tim C # ingin memberikan subset yang berlebihan dari kelebihan operator. Pada saat itu, overloading operator mengalami rap buruk. Orang-orang menyatakan bahwa itu mengaburkan kode, dan hanya bisa digunakan untuk kejahatan. Pada saat C # sedang dirancang, Java telah menunjukkan kepada kita bahwa tidak ada operator overloading yang agak mengganggu.
Jadi C # ingin menyeimbangkan kelebihan operator sehingga lebih sulit untuk melakukan kejahatan, tetapi Anda bisa membuat hal-hal yang baik juga. Mengubah semantik penugasan adalah salah satu dari hal-hal yang dianggap selalu jahat. Dengan membiarkan
+=
dan kerabatnya kelebihan beban, itu akan memungkinkan hal semacam itu. Misalnya, jika+=
mengubah referensi daripada membuat yang baru, itu tidak akan mengikuti semantik yang diharapkan, yang mengarah ke bug.sumber