Mengapa tidak mungkin untuk membebani operator penugasan majemuk di C #?

11

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.

Greenoldman
sumber
3
Apakah Anda memiliki tautan untuk gaya C ++ yang baru? Secara naif, overloading +=pertama tampaknya tidak masuk akal; mengapa Anda membebani operasi gabungan daripada bagian-bagiannya?
Telastyn
1
Saya percaya istilah untuk ini adalah "operator penugasan majemuk".
Ixrec
2
@greenoldman Telastyn mungkin menyiratkan bahwa menerapkan + = dalam hal + tampaknya lebih alami daripada sebaliknya, karena semantik + = adalah komposisi + dan =. Sepengetahuan saya , memiliki + panggilan + = sebagian besar merupakan trik optimasi.
Ixrec
1
@Ixrec: Terkadang, a + = b masuk akal, sementara a = a + b tidak: Pertimbangkan bahwa identitas mungkin penting, A tidak dapat diduplikasi, apa pun. Terkadang, a = a + b masuk akal, sedangkan a = = b tidak: Pertimbangkan string yang tidak dapat diubah. Jadi, yang sebenarnya membutuhkan kemampuan untuk memutuskan mana yang kelebihan beban secara terpisah. Tentu saja, menghasilkan yang hilang secara otomatis, jika semua blok bangunan yang diperlukan ada dan tidak dinonaktifkan secara eksplisit, adalah ide yang bagus. Bukan berarti C # memungkinkan atm itu, afaik.
Deduplicator
4
@greenoldman - Saya mengerti motivasi itu, tetapi secara pribadi, saya akan menemukan *=mutasi jenis referensi secara semantik salah.
Telastyn

Jawaban:

12

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.

Telastyn
sumber
Terima kasih, jika Anda tidak keberatan, saya akan membuat pertanyaan ini terbuka sedikit lebih lama, dan jika tidak ada yang mengalahkan Anda dengan alasan desain yang sebenarnya, saya akan menutupnya dengan menerima pertanyaan Anda. Sekali lagi terima kasih.
greenoldman
@greenoldman - Anda juga harus melakukannya. Saya juga berharap seseorang datang dengan jawaban dengan referensi yang lebih konkret.
Telastyn
Jadi, ini adalah tempat di mana ketidakmungkinan untuk berbicara tentang pointer dan pointee dengan nyaman dan tidak ambigu menghasilkan kepalanya? Sayang sekali.
Deduplicator
"Orang-orang menyatakan bahwa itu mengaburkan kode" - itu masih benar, apakah Anda sudah melihat beberapa perpustakaan F #? Kebisingan operator. Misalnya quanttec.com/fparsec
Den