Neden C # 'da bileşik atama operatörünü aşırı yüklemek mümkün değil?


11

Başlık yanıltıcıdır, bu yüzden lütfen tüm soruyu okuyun :-) .

"Bileşik atama operatörü" derken aklında böyle bir yapıya sahiptir: op=örneğin, +=. Saf atama operatörü ( =) soruma ait değil.

"Neden" ile kastetmiyorum ama bazı tasarımcıların ya da iş arkadaşlarının vs. akıl yürütmelerini ifade ettikleri zaman kaynak (kitap, makale, vb.) (Yani tasarım seçiminin kaynağı).

C ++ ve C # 'da bulunan asimetri tarafından şaşkınım ( evet, C # C ++ 2.0 değil ) - C ++' da operatörü aşırı yükler +=ve daha sonra otomatik +olarak daha önce tanımlanan operatöre dayanarak uygun operatörü yazarsınız . C # 'da tersidir - aşırı yüklenir +ve +=sizin için sentezlenir.

Yanılmıyorsam, yeni yaklaşımın +=yaratılması gerektiğinden , sonraki yaklaşım gerçekte optimizasyon şansını öldürür . Bu nedenle, bu yaklaşımın büyük bir avantajı olmalı, ancak MSDN bunu anlatmak için çok utangaç.

Ve bu avantajın ne olduğunu merak ediyorum - bu yüzden bazı C # kitaplarında, teknik konuşma videolarında, blog girişlerinde açıklama bulduysanız, referans için minnettar olacağım.

Buldum en yakın şey Eric Lippert blog bir yorum Neden aşırı yük operatörleri her zaman C # statik? Tom Brown tarafından. Statik aşırı yüklenmeye karar verilirse, sadece yapılar için hangi operatörlerin aşırı yüklenebileceğini belirler. Bu ayrıca sınıflar için neyin aşırı yüklenebileceğini belirler.


3
Yeni C ++ stili için bir bağlantınız var mı? Saf olarak, aşırı yükleme +=önce saçma görünüyor; neden parçaları yerine birleşik bir işlemi aşırı yüklersiniz?
Telastyn

1
Bunlar için terimin "bileşik atama operatörleri" olduğuna inanıyorum.
Ixrec

2
@greenoldman Telastyn muhtemelen + = uygulamasının + cinsinden uygulanmasının diğer yönden daha doğal göründüğünü ima ediyordu, çünkü anlamsal olarak + = + ve = 'nin bir bileşimidir. Bildiğim kadarıyla , + çağrı + = değerine sahip olmak büyük ölçüde bir optimizasyon hilesi.
Ixrec

1
@Ixrec: Bazen a + = b mantıklıdır, a = a + b ise şu anlama gelmez: Kimliğin önemli olabileceğini düşünün, A her ne olursa olsun A kopyalanamaz. Bazen a = a + b mantıklı olurken, a + = b anlamsızdır: Değişmez dizeleri düşünün. Yani, aslında hangisinin ayrı olarak aşırı yükleneceğine karar verme yeteneğine ihtiyacı vardır. Tabii ki, eksik olanı otomatik olarak oluşturmak, tüm gerekli yapı taşları varsa ve açıkça devre dışı bırakılmıyorsa, iyi bir fikirdir. Bu C # bu atm, afaik izin vermez.
Tekilleştirici

4
@greenoldman - Bu motivasyonu anlıyorum, ama kişisel olarak, *=bir referans türünü anlamsal olarak yanlış olarak değiştirmeyi bulurdum .
Telastyn

Yanıtlar:


12

Bunun için referans bulamıyorum, ancak benim anlayışım C # ekibinin operatörün aşırı yüklenmesinin aklı başında bir altkümesi sağlamak istediğiydi. O zaman, aşırı operatör yükü kötü bir rap geçirdi. İnsanlar kodu gizlediğini ve sadece kötülük için kullanılabileceğini iddia etti. C # tasarlandığında, Java bize hiçbir operatör aşırı yüklemesinin biraz can sıkıcı olmadığını gösterdi.

Böylece C #, kötülüğü yapmak daha zor olacak şekilde operatör aşırı yüklemesini dengelemek istedi, ancak siz de güzel şeyler yapabilirsiniz. Ödevin anlambilimini değiştirmek her zaman kötü olarak kabul edilen şeylerden biriydi. İzin vermek +=ve akrabalarının aşırı yüklenmesine izin vermek, bu tür şeylere izin verir. Örneğin +=, referansı yeni bir referans yapmak yerine mutasyona uğratsaydı, beklenen anlambilimi izlemez ve hatalara yol açar.


Teşekkür ederim, eğer bu soruyu biraz daha açık tutacağımın sakıncası yoksa ve kimse sizi gerçek tasarımın mantığıyla dövmezse, sizinkini kabul ederek kapatacağım. Bir kez daha teşekkür ederim.
greenoldman

@greenoldman - siz de yapmalısınız. Umarım birisi daha somut referanslarla bir cevap bulur.
Telastyn

Yani, bu işaretçi ve sivri uçtan bahsetmenin imkansızlığının rahat ve açık bir şekilde başını duyduğu bir yer mi? Lanet olsun utanç.
Tekilleştirici

"İnsanlar kod gizledi iddia" - yine de doğru, bazı F # kütüphaneleri gördün mü? Operatör gürültüsü. Örneğin, quanttec.com/fparsec
Den
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.