SORU
2 AĞUSTOS 2011, Salı


Neden iki == Hizala= zorundayız! C#?

C# derleyicisi özel bir tür işleç tanımlar zaman == da != (here) tanımlamak gerekir.

Neden?

Tasarımcılar gerekli düşündüm ve neden derleyici diğer mevcut operatörler de makul bir uygulama için varsayılan olabilir mi merak ediyorum. Örneğin, Lua sadece eşitlik operatörü tanımlamak ve ücretsiz olarak diğer sağlar. Seni tanımlamak ya == ya da her ikisi == sorarak aynı şeyi yapabilir ve=! C# ve sonra otomatik olarak eksik=! derleme !(left == right) operatör.

Bazı varlıklar eşittir, ne de eşit olmayan, (IEEE-754 NaN gibi) olabilir Ne tuhaf köşesinde durum olduğunu anlıyorum, ama bunlar istisna değil kural gibi görünüyor. Bu C neden açıklamıyor bu yüzden# derleyici tasarımcıları durum kural yaptı.

Gördüm durumlarda kötü işçilik nerede eşitlik operatörü tanımlanır, o zaman eşitsizlik operatörü kopyala-yapıştır ile her karşılaştırıldığında tersine ve her && anahtarlı bir || (olsun... temelde !(a==b) De Morgan kuralları ile genişletilmiş). Derleyici olduğunu Lua ile olduğu tasarımı ile ortadan kaldırmak, kötü uygulama.

Not: Aynı operatörler < ^ için de geçerlidir . <= >=. Doğal olmayan yollardan bunları tanımlamak gerekir durumlar hayal bile edemiyorum. Lua sadece define < sağlar; ve <= ve ^ tanımlar . = ve >çocukla yoluyla doğal olarak' olumsuzluk. Neden C değil# aynı şeyi (en azından 'varsayılan')?

EDİT

Görünüşe göre orada programcı ancak onlar gibi eşitlik ve eşitsizlik denetler uygulamak için izin vermek için geçerli bir sebep. Bazı cevapları çok iyi durumlara işaret ediyor.

Benim sorum, çekirdek, ancak, bu zorla C yeterlidir*genellikledeğilmantıklıgerekli?

Ayrıca seçimler için tasarım tezat oluşturuyordu .NET NotEquals bir muadili olmaması çerçevesinde bu eşitsiz olarak ve 11 ** nesneleri dikkate gösterirObject.Equals, 8* IEqualityComparer.Equals *gibi arabirimleri. Ayrıca, Dictionary gibi sınıflar ve .Contains() gibi yöntemler sadece söz konusu arayüzleri bağlı ve eğer tanımlanmışsa bile işleçler doğrudan kullanmayın. ReSharper eşitlik üyeleri oluşturduğunda aslında, == != hem kullanıcı operatörler hiç oluşturmak için seçerse sadece Equals() açısından ve o zaman bile tanımlar. Eşitlik operatörleri eşitlik nesneyi anlamak için bir çerçeve gerekli değildir.

Temelde, bu .NET çerçeve bu operatörler umursamıyor, sadece Equals hakkında birkaç yöntem umurunda. Her iki gerektirir===! karar kullanıcı tarafından tandem tanımlanmış operatörler sadece dil tasarımla ilgili ve anlambilim nesne olarak değil .NET ile ilgili.

CEVAP
2 AĞUSTOS 2011, Salı


Dil tasarımcılar için bir şey diyemem, ama nedeni ne kasıtlı, uygun tasarım karardı gibi görünüyor.

Bu temel F bakıyor# kod, bir çalışma kütüphane içine bu derleme. Bu F için yasal kodudur# ve sadece aşırı eşitlik operatörü, eşitsizlik değil:

module Module1

type Foo() =
    let mutable myInternalValue = 0
    member this.Prop
        with get () = myInternalValue
        and set (value) = myInternalValue <- value

    static member op_Equality (left : Foo, right : Foo) = left.Prop = right.Prop
    //static member op_Inequality (left : Foo, right : Foo) = left.Prop <> right.Prop

Bu kesinlikle göründüğü gibi değildir. == bir eşitlik karşılaştırıcısı getirir, ve eğer sınıfın içsel değerlere eşit olup olmadığını denetler.

C böyle bir sınıf oluşturmak mümkün değil"olabilirkullanın bunun için derlendi .NET. == aşırı görevlimiz Kadar kullanacağı aşikar, çalışma zamanı != için de kullanabilir.

# EMCA C standart Kuralları (Bölüm 14.9) eşitlik değerlendirirken kullanmak için hangi belirlemek için nasıl açıklayan bir sürü var. Eğer karşılaştırılan türleri aynı türden ise bu aşırı basitleştirilmiş ve böylece tam olarak doğru değilveaşırı bir eşitlik operatörü aşırı yükleme ve standart referans eşitlik operatörünün değil nesneden miras kullanır hediyesi var. Hiç de şaşırtıcı değil, o zaman, eğer bu operatörleri tek kişi varsa, varsayılan referans eşitlik operatörünün kullanacağı, tüm nesneler için bir yük değil.1

Bu durumda olduğunu bilerek, asıl soru şu: Neden bu şekilde tasarlanmış ve neden derleyici bunu kendi başına çözmeye değil mi? İnsanlar bu tasarım bir karar değildi, ama bu şekilde düşünülmüş olduğunu düşünüyorum söylüyorlar çok, özellikle tüm nesneler için varsayılan eşitlik operatörü var gerçeği ile ilgili.

Neden derleyici otomatik olarak yüklenecektir != operatör yaratmaz? Microsoft birisi bu teyit sürece emin olamam, ama bu gerçekler üzerinde akıl belirleyen de budur.


Beklenmeyen bir durumun ortaya çıkmaması için

Belki de == karşılaştırma testi eşitlik için bir değer yapmak istiyorum. Ancak, zaman geldi != umursamadım, eğer değerler aynı olmadıkça referans olduğunu eşit, çünkü benim program için dikkate onları eşit, ben sadece bakım eğer başvurular maç. Sonuçta, bu gerçekten C varsayılan davranış olarak özetlenen# eğer her iki operatörleri aşırı yüklenmiş olsaydı, gibi durumda bazı olurdu .net kitaplıkları başka bir dilde yazılmış). Eğer derleyici kodunu otomatik olarak ekleyerek olsaydı, artık uyumludur gereken çıkış kodu derleyici güvenebileceğimi. Derleyici özellikle yazdığın kod hem C standartları içinde senin davranış değişiklikleri, gizli kod yazmak değil# ve CLİ.

Bunun açısındanzorlamasen, varsayılan davranış gitmek yerine aşırı, sadece sıkıca standart olduğunu söyleyebilirim (EMCA-334 17.9.2)2. Standart neden belirtmiyor. Bu C olması nedeniyle olduğuna inanıyorum# ödünç C den fazla davranış . Aşağıda bu konuda daha fazla bilgi için bkz.


!= ==, geçersiz zaman bool iade etmek zorunda değilsiniz.

Bu başka bir olası nedenidir. C# Bu fonksiyonu

public static int operator ==(MyClass a, MyClass b) { return 0; }

bu kadar geçerli

public static bool operator ==(MyClass a, MyClass b) { return true; }

Eğer bir şey bool dışında dönüyorsun, derleyiciolamazotomatik olarak ters yönde bir tür tahmindir. Ayrıca, bu durumda operatörünüze neredeyokreturn bool, sadece onlara, sadece olabilme ihtimali var bu kod oluşturur bir özel durum oluşturmak ya da yukarıda dediğim gibi, o gizler CLR varsayılan davranış kodu için bir anlam ifade etmiyor.


C# C kadar . ödünç ^sup>3

C#, C söz yazan MSDN dergisinde bir makale vardı tanıtıldı#:

Birçok geliştiriciler, yazmak kolaydı, okumak, ve Visual Basic gibi koruyan bir dil olsaydı, ama yine de güç ve esneklik C sağladı .

C Evet tasarım hedefi# C yaklaşık olarak aynı miktarda güç vermek için , sert gibi kolaylıklar için sadece biraz tipi-güvenlik ve çöp toplama. kurban oldu C# güçlü C modellenmiş .

C , öğrenmek için sürpriz olabilireşitlik operatörleri bool dönmek zorunda değilsiniz, this example program gösterildiği gibi

Şimdi, C, doğrudan değilgerektiriraşırı ücretsiz operatör için. Eğer örnek bir program kodu derlenmiş, hatasız çalışır göreceksiniz. Eğer varsa satır ekleme denesen ancak:

cout << (a != b);

alacak

derleyici hata C2678 (MSVC) :! = '' ikili tip sol işleneni alan hangi operatör '(ya da kabul edilebilir dönüşüm yok)'`. Test

- C çiftleri, aşırı talep kendisi değilolmazsana özel bir sınıf üzerinde aşırı etmediğin bir eşitlik operatörü kullanalım. İçinde geçerli .Tüm nesneler varsayılan bir tane var çünkü NET, C değil.


1. Bir yan not olarak, C# standart hala eğer aşırı ya da isterseniz aşırı operatörlerin çift gerektirir. Bu bir parçasıdırstandartve sadece bu değilderleyici. Ancak, aynı kurallar aramak için hangi belirlenmesi ile ilgili bir erişirken de geçerlidir .net kitaplığı aynı şartlara sahip olmayan başka bir dilde yazılmış.

2. EMCA-334 (pdf) () http://www.ecma-international.org/publications/files/ECMA-ST/Ecma-334.pdf

3. Ve Java, ama mesele burada değil

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

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • Jared Busch

    Jared Busch

    25 Mayıs 2011
  • Photoshop Tutorials

    Photoshop Tu

    22 HAZİRAN 2011
  • Plugable

    Plugable

    19 Mayıs 2010