SORU
22 Ocak 2014, ÇARŞAMBA


Ve Eşittir == arasındaki fark nedir() C temel öğeler için#?

Bu kodu göz önünde bulundurun:

int age = 25;
short newAge = 25;
Console.WriteLine(age == newAge);  //true
Console.WriteLine(newAge.Equals(age)); //false
Console.ReadLine();

Her iki int short ilkel türleri vardır, ama == ile bir karşılaştırma doğru döner ve Equals ile bir karşılaştırma yanlış döndürür.

Neden?

CEVAP
22 Ocak 2014, ÇARŞAMBA


Kısa cevap:

Eşitlik karmaşıktır.

Ayrıntılı cevap:

İlkel türleri 9* *baz geçersiz kılar ve eğer kutulu object aynı ise true döndürüryazınve değer. (Null türleri için çalışacaktır; non-null null türleri her zaman temel türü örneğine kutusu olduğunu unutmayın.)

newAge beri short, Equals(object) yöntemi yalnızca bir kutulu başarılı olursa true döndürürkısaaynı değere sahip. int, false döndürür bir kutulu geçiyorsun.

Buna karşılık, == operatör iki ints (veya shorts longs) olarak tanımlanır.
int ** 20, derleyici bir ile çağırdığınızda örtülü olarak int 21 *dönüştürme ve* 23 *s değeri ile elde edilen karşılaştırın.

Başka yollar da iş yapmak için

İlkel türleri de aynı tip kabul eden Equals() kendi yöntemi var.
Eğer yazarsan age.Equals(newAge), derleyici en iyi aşırı yük int.Equals(int) seçer ve örtülü olarak int 27 *dönüştürün. Bu yöntem sadece doğrudan int s karşılaştırır beri truedöndürecektir.

short short.Equals(short) bir yöntemi vardır, ama int olamaz örtülü olarak arama değil, 34**, dönüştürülür.

O bir oyuncu kadrosu ile bu yöntemi çağırmak için güç olabilir:

Console.WriteLine(newAge.Equals((short)age)); // true

Bu short.Equals(short) doğrudan, boks olmadan arayacak. age taşma istisna olacak 32767, büyükse.

Ayrıca short.Equals(object) aşırı diyebilirsin, ama aynı tip alır, böylece açıkça kutulu bir nesne geçirmek:

Console.WriteLine(newAge.Equals((object)(short)age)); // true

Önizleme alternatif gibi, bu short uygun değil mi taşma atmak olacaktır. Önceki çözüm aksine, bir nesneye short, zaman ve hafıza kaybına kutusu.

Kaynak Kodu:

İşte gerçek kaynak kodundan Equals() iki yöntem:

    public override bool Equals(Object obj) {
        if (!(obj is Int16)) {
            return false;
        }
        return m_value == ((Int16)obj).m_value;
    }

    public bool Equals(Int16 obj)
    {
        return m_value == obj;
    }

Daha Fazla Bilgi İçin:

Eric Lippert bkz.

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

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • mahalodotcom

    mahalodotcom

    8 HAZİRAN 2007
  • pilslajt

    pilslajt

    20 HAZİRAN 2008
  • Willie D.

    Willie D.

    16 Aralık 2006