SORU
28 Mayıs 2013, Salı


() GetType yalan söyler mi?

Esas şu soruyu sordu bir kaç gün önce: GetType() and polymorphism okuma Eric Lippert's cevap, ben düşünmeye başladım, eğer yapma GetType() değil sanal gerçekten sağlanmış olan bir nesne değil yalan hakkında Type.

Özellikle, Eric cevabı aşağıda belirtilmiştir:

Çerçeve tasarımcılar türü hakkında yalan söylemek için bir nesne, sadece aynı tür diğer üç yöntem ile tutarlı yapmak için izin gibi son derece tehlikeli bir özellik eklemek için gidiyoruz.

Asıl soru şimdi: bir nesne yapabilirimyokonsuz türünü hemen belli olması ile ilgili yalan? Derinden ben burada yanlış olabilir ve eğer durum buysa açıklama aşk, ama aşağıdaki kodu düşünün istiyorum:

public interface IFoo
{
    Type GetType();
}

Ve dedi ki arayüzü aşağıdaki iki uygulamaları:

public class BadFoo : IFoo
{
    Type IFoo.GetType()
    {
        return typeof(int);
    }
}

public class NiceFoo : IFoo
{
}

Aşağıdaki basit programı çalıştırın sonra:

static void Main(string[] args)
{
    IFoo badFoo = new BadFoo();
    IFoo niceFoo = new NiceFoo();
    Console.WriteLine("BadFoo says he's a '{0}'", badFoo.GetType().ToString());
    Console.WriteLine("NiceFoo says he's a '{0}'", niceFoo.GetType().ToString());
    Console.ReadLine();
}

Emin yeterli badFoo Type hatalı çıkışları.

Şimdi Eğer bu, herhangi bir ciddi sonuçları Eric dayalı olarak bu davranışı tanımlayan, bilmiyorum "son derece tehlikeli bir özellik"ama bu model olabilir inandırıcı bir tehdit mi?

CEVAP
28 Mayıs 2013, Salı


Güzel soru! Gördüğüm kadarıyla, sadece gerçekten eğer GetType değil mi nesne, sanal olsa adam bir geliştirici yanıltmak olabilir.

Ne yaptığını GetType gölgeleme benzer, bu gibi:

public class BadFoo
{
    public new Type GetType()
    {
        return typeof(int);
    }
}

bu sınıf (the sample code from the MSDN for the GetType() method kullanarak) ile gerçekten sahip olabilir:

int n1 = 12;
BadFoo foo = new BadFoo();

Console.WriteLine("n1 and n2 are the same type: {0}",
                  Object.ReferenceEquals(n1.GetType(), foo.GetType())); 
// output: 
// n1 and n2 are the same type: True

yani, iğrenç, başarılı bir şekilde yalan söyledi, değil mi? Peki, evet ve hayır... Düşünün kullanarak bu gibi bir istismar anlamına kullanarak BadFoo örnek olarak bir değişken için bir yöntem bir yerde, bekliyor büyük olasılıkla bir object veya bir ortak taban türü için bir hiyerarşi nesneler. Şöyle bir şey:

public void CheckIfInt(object ob)
{
    if(ob.GetType() == typeof(int))
    {
        Console.WriteLine("got an int! Initiate destruction of Universe!");
    }
    else
    {
        Console.WriteLine("not an int");
    }
}

ama CheckIfInt(foo) parmak izleri "değil, bir int".

Yani kısaca (için örnek), sen gerçekten sadece istismar "yalan yazın" kod birinin yazdığı karşı IFoo arabirimi, çok açık gerçeği hakkında bir "özel" GetType() yöntem.

Sadece GetType() sanal nesne mümkün olacaktır için bir zanaat "yalan" yazın kullanılabilecek olan yöntemler gibi CheckIfInt oluşturmak için yukarıda hasara kütüphaneleri yazan başkası.

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

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • EEVblog

    EEVblog

    4 NİSAN 2009
  • RayperEnglishKnight

    RayperEnglis

    24 Kasım 2008
  • William Sledd

    William Sled

    24 EYLÜL 2006