SORU
18 EYLÜL 2014, PERŞEMBE


Aslında && ve || don't kısa devre aşırı yüklü bir nedeni var mı?

Operatörler && || kısa devre davranışı programcılar için harika bir araçtır.

Ama neden, aşırı yüklendiğinde, bu davranış kaybeder? Operatörler sadece ama işlevleri bool operatörler bu davranış, neden bu tek tip sınırlandırılmalıdır? için sözdizimsel şeker biri olduğunu biliyorum Bunun arkasında herhangi bir teknik akıl var mı?

CEVAP
18 EYLÜL 2014, PERŞEMBE


Tüm tasarım süreçleri birbirine zıt hedefleri arasında uzlaşma sonucu. && -- kısa devre davranışı -- çok özelliği atlanmış. ne yazık ki, C && aşırı yüklü operatör için tasarım süreci kafa karıştırıcı bir sonuç üretti:

Tasarım süreci nasıl ayrıntılarını bilmiyorum bu talihsiz yerde sona erdi,. Ancak konuyla ilgili daha sonra bir tasarım süreci dikkate bu hoş olmayan sonuçlar ne kadar sürdüğünü görmek için. C#, && aşırı yüklü operatörkısa devre. Nasıl C tasarımcıları yaptı bunu başarmak?

Diğer cevaplar birini gösteriyor "". lambda kaldırma Yani:

A && B

bir şeyin ahlaki olarak eşit olarak gerçekleşmiş olabilir:

operator_&& ( A, ()=> B )

ikinci argüman değerlendirildiğinde, böylece tembel değerlendirme için aynı mekanizmayı kullanır, ifadenin yan etkileri ve değeri üretilir. Fazla yüklenmiş işleç uygulanması, sadece gerektiğinde tembel değerlendirme yapar.

Bu ne C değil# tasarım ekibi yaptı. (Bir kenara: gerçi lambda kaldırmazaman geldiğinde ben ne yaptımifade ağacı gösterimibelirli dönüşüm işlemleri tembel gerçekleştirilecek gerektiren ?? operatör,. Bu konuyu açıklayan ancak büyük bir sapma olur. Yeterli söylemek: lambda kaldırma çalışıyor ama bundan kaçınmak istedik yeterince ağır.)

Bunun yerine, C# çözüm bu sorun, iki ayrı sorunları ayırır:

  • sağ işlenen değerlendirmek gerekir?
  • yukarıda cevabı ise "" o zaman nasıl iki işlenen birleştirmek mıyız? Evet

Bu nedenle sorun, yasadışı && doğrudan aşırı yüklenme yaparak çözüldü. Bunun yerine, C# aşırı yüklenme gerekirikiher iki soru bir cevap operatörleri,.

class C
{
    // Is this thing "false-ish"? If yes, we can skip computing the right
    // hand size of an &&
    public static bool operator false (C c) { whatever }

    // If we didn't skip the RHS, how do we combine them?
    public static C operator & (C left, C right) { whatever }
    ...

(Bir kenara: aslında, üç. C# eğer operatör false sağlanıyorsa sonra operatör true soru cevaplar da sağlanmalıdır, gerektirir: bu şey "gerçek gibi?". Genellikle sadece tek bir operatör C ile kalmazdı hayır * gerektirir.)

Formun bir deyim göz önünde bulundurun:

C cresult = cleft && cright;

Derleyici pseudo-C bu yazılı olduğunu sanıyordum bunun için kod oluşturur#:

C cresult;
C tempLeft = cleft;
cresult = C.false(tempLeft) ? tempLeft : C.&(tempLeft, cright);

Gördüğünüz gibi, sol tarafta her zaman değerlendirilir. Eğer kararlı ise "sahte-ish" sonra sonucudur. Aksi takdirde, sağ tarafta değerlendirdi veisteklikullanıcı tanımlı operatörü & çağrılır.

|| operatör benzer şekilde tanımlanır, operatör gerçek bir çağırma ve | istekli operatörü olarak:

cresult = C.true(tempLeft) ? tempLeft : C.|(tempLeft , cright);

Tanımlayarak dört operatörleri -- true, false, & ve | -- C# sağlar sadece ki cleft && cright ama aynı zamanda non-kısa-devre cleft & cright da if (cleft) if (cright) ... c ? consequence : alternative while(c).

Şimdi, tüm tasarım süreçlerinde uzlaşmanın sonucu olduğunu söyledi. C# dil tasarımcıları kısa devre && || doğru almayı başardı, ama bunu yaparken aşırı yüklenmesini gerektirirdörtoperatörler yerineikibazı insanlar kafa karıştırıcı buluyorum. C az iyi anlaşılan özelliklerinden biridir#. Tanıdık olması mantıklı ve anlaşılır bir dil C kullanıcıların sahip amacı arzuları kısa devre ve tembel değerlendirme lambda kaldırma ya da diğer formları uygulamak için arzu karşıydı. Bu makul bir uzlaşma pozisyonu olduğunu düşünüyorum, ama önemli bir fark vardıruzlaşmacı bir pozisyon. Sadece birfarklıC tasarımcıları indi daha uzlaşmacı bir pozisyon.

Eğer bu operatörler için dil tasarım konusuna ilgi varsa, benim dizi okuma düşünün neden C# null Boolean değerleri üzerinde bu operatörler tanımlamıyor:

http://ericlippert.com/2012/03/26/null-is-not-false-part-one/

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • AmazonWireless

    AmazonWirele

    8 EYLÜL 2010
  • Apple

    Apple

    22 HAZİRAN 2005
  • Rugiagialia

    Rugiagialia

    1 Ocak 2008