SORU
4 AĞUSTOS 2014, PAZARTESİ


Neden C# dinamik tip statik?

Okuma ve dinamik anahtar kelime keşfetmek [MSDN] (yer . satır aşağıdaki buldum ^em>Using Type dynamic (C# Programming Guide)):

Bu tür statik bir türüdür, ama yazın dinamik bir nesne statik tür denetlemesi atlar. Çoğu durumda, bu işlevler nesne türü vardır gibi.

Hat üstünde statik anlamı nedir ve nasıl statik tür denetlemesi bypass mı?

CEVAP
4 AĞUSTOS 2014, PAZARTESİ


Bu statik yazma

string foo = "bar";

foo Bu bir derleme zamanı hatası neden olur bu yüzden şimdi bir dize:

foo = 1;

Eğer var, kullanıyorsanız bile hala statik olarak yazılan bir şey

var foo = "bar";     // foo is now a string
foo = 1;             // still a compile time error

Dinamik anahtar kelime kullanarak, bu tür statik olmayacak ve şimdi bunu yapmak, böylece değiştirilebilir

dynamic foo = "bar";   
foo = 1;              // this is now fine.

Diyor ki, neden şimdi, "statik bir yazın türü" çok dinamik dilleri (Javascript gibi) çünkü, böyle bir şey yapabilirsiniz:

var foo = { bar: 1 };

Bir özelliği olan bir nesne oluşturur "bar", ve sonra bunu yapabilirsiniz:

foo.la = 2;

Hangieklerfoo nesne için yeni bir özellik. Ama eğer C içinde aynı numarayı çalışırsanız#

dynamic foo = new SomeClassThatDoesntHaveABarProperty();
foo.bar = 2;          // runtime error

Ne de bir özelliği silebilirsiniz. Dinamik bir değişken için herhangi bir tür atayabilirsiniz, ama o tipler kendilerini değiştiremezsiniz.

Eğer işlevsellik bu tür bir ihtiyacınız yoksa, o zaman ExpandoObject bakmak isteyeceksiniz

Açıklama dediği gibi, dynamic fonksiyonlar durumlarda bir çok, bir nesne gibi. Bunu yapmak için:

dynamic foo = new Foo();
foo = new Bar();

Sadece bu gibi:

object foo = new Foo();
foo = new Bar();

Ama fark özellikleri veya yöntemleri kullanmak istediğinizde gelir. Dinamik, bunu yapabilirim:

dynamic foo = new Foo();
foo.FooMethod();          // Note: You WILL get a runtime exception if foo doesn't have a FooMethod

Ama bir nesne ile, bunu yapmak istiyorum:

object foo = new Foo();
((Foo)foo).FooMethod();    // Note: I HAVE to know the type at compile time here

Yalnızca ben zaten Foo a tipi foo tipine cast edebilirim Eğer bana görederleme zamanındaeğer zaten, o zaman sadece object yerine benim tip olarak Foo sahip olabileceğimi bilsem , ve.

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

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • Dive In

    Dive In

    17 Temmuz 2013
  • GUN-TIME with Brandon

    GUN-TIME wit

    3 ŞUBAT 2009
  • Microsoft Research

    Microsoft Re

    24 EKİM 2008