Tür dinamik kullanma (C# Programlama Kılavuzu)

C# 4 yeni bir tür olan 'i dynamic tanıtıyor. Tür statik bir tür, ancak türünde bir nesne statik dynamic tür denetimi atlar. Çoğu durumda türünde olduğu gibi işlev object gösterir. Derleme zamanında, herhangi bir işlemi desteklemek için olarak dynamic türen bir öğe varsayılır. Bu nedenle, nesnenin değerini IronPython gibi dinamik bir dilden, HTML Belge Nesne Modeli'den (DOM), yansımadan veya programdaki başka bir yerden bir COM API'lerinden mi alan konusunda endişe etmeye gerek yoktur. Ancak, kod geçerli değilse, hatalar çalışma zamanında yakalır.

Örneğin, aşağıdaki kodda örnek yönteminde yalnızca bir parametre varsa, derleyici yöntemine yapılan ilk çağrının iki bağımsız değişken içerdiği için geçerli exampleMethod1 ec.exampleMethod1(10, 4) olmadığını tanır. Çağrı bir derleyici hatasına neden olur. yöntemine yapılan ikinci çağrı, dynamic_ec.exampleMethod1(10, 4) türü olduğundan derleyici tarafından dynamic_ec dynamic denetlenir. Bu nedenle, hiçbir derleyici hatası bildiriliyor. Ancak hata süresiz olarak kaçış bildirimine neden olmaz. Çalışma zamanında yakalır ve bir çalışma zamanı özel durumuna neden olur.

static void Main(string[] args)
{
    ExampleClass ec = new ExampleClass();
    // The following call to exampleMethod1 causes a compiler error
    // if exampleMethod1 has only one parameter. Uncomment the line
    // to see the error.
    //ec.exampleMethod1(10, 4);

    dynamic dynamic_ec = new ExampleClass();
    // The following line is not identified as an error by the
    // compiler, but it causes a run-time exception.
    dynamic_ec.exampleMethod1(10, 4);

    // The following calls also do not cause compiler errors, whether
    // appropriate methods exist or not.
    dynamic_ec.someMethod("some argument", 7, null);
    dynamic_ec.nonexistentMethod();
}
class ExampleClass
{
    public ExampleClass() { }
    public ExampleClass(int v) { }

    public void exampleMethod1(int i) { }

    public void exampleMethod2(string str) { }
}

Bu örneklerde derleyicinin rolü, her deyimin olarak türüne sahip nesne veya ifadeye ne yapmak istediğini içeren bilgileri bir araya paketi dynamic şeklindedir. Çalışma zamanında depolanan bilgiler incelendi ve geçerli olmayan herhangi bir deyim çalışma zamanı özel durumuna neden oluyor.

Çoğu dinamik işlemlerin sonucu dynamic kendisidir. Örneğin, aşağıdaki örnekte fare işaretçisini kullanımının üzerine sabitlersanız, testSum IntelliSense türü (yerel değişken) dinamik testSum değerini görüntüler.

dynamic d = 1;
var testSum = d + 3;
// Rest the mouse pointer over testSum in the following statement.
System.Console.WriteLine(testSum);

Sonucun dahil olmadığını dynamic işlemler:

  • 'den başka dynamic bir türe dönüştürmeler.
  • türünde bağımsız değişkenleri içeren oluşturucu dynamic çağrıları.

Örneğin, aşağıdaki testInstance bildirimde türü değil ExampleClass , dynamic olur:

var testInstance = new ExampleClass(d);

Dönüştürme örnekleri aşağıdaki "Dönüşümler" bölümünde gösterilmiştir.

Dönüşümler

Dinamik nesneler ve diğer türler arasındaki dönüştürmeler kolaydır. Bu, geliştiricinin dinamik ve dinamik olmayan davranış arasında geçişe olanak sağlar.

Aşağıdaki örneklerde gösterildiği gibi herhangi bir nesne, örtülü olarak dinamik türe dönüştürmek için kullanılır.

dynamic d1 = 7;
dynamic d2 = "a string";
dynamic d3 = System.DateTime.Today;
dynamic d4 = System.Diagnostics.Process.GetProcesses();

Buna karşılık, örtülü dönüştürme türüne göre herhangi bir ifadeye dinamik olarak dynamic uygulanabilir.

int i = d1;
string str = d2;
DateTime dt = d3;
System.Diagnostics.Process[] procs = d4;

Dinamik tür bağımsız değişkenleriyle aşırı yükleme çözümlemesi

Bir yöntem çağrısında bağımsız değişkenlerden biri veya daha fazlası türüne sahipse veya yöntem çağrısının alıcısı türünde ise, aşırı yükleme çözümlemesi derleme zamanı yerine çalışma zamanında dynamic dynamic oluşur. Aşağıdaki örnekte, tek erişilebilir yöntem bir dize bağımsız değişkeni almak için tanımlanmışsa, bağımsız değişken olarak göndermek derleyici hatasına neden olmaz, ancak bir çalışma zamanı özel exampleMethod2 d1 durumuna neden olur. çalışma zamanı türü olduğundan ve bir dize gerektirdiği için, aşırı d1 yükleme int exampleMethod2 çözümlemesi çalışma zamanında başarısız olur.

// Valid.
ec.exampleMethod2("a string");

// The following statement does not cause a compiler error, even though ec is not
// dynamic. A run-time exception is raised because the run-time type of d1 is int.
ec.exampleMethod2(d1);
// The following statement does cause a compiler error.
//ec.exampleMethod2(7);

Dinamik dil çalışma zamanı

Dinamik dil çalışma zamanı (DLR), .NET Framework 4'te tanıtıldı. C# dilinde türü destekleyen altyapının yanı sıra IronPython ve IronRuby gibi dinamik programlama dynamic dillerinin uygulanmasını sağlar. DLR hakkında daha fazla bilgi için bkz. Dinamik Dil Çalışma Zamanının Genel Bakışı.

COM birlikte çalışma

C# 4, Office Automation API'leri gibi COM API'leriyle birlikte çalışma deneyimini geliştiren çeşitli özellikler içerir. Geliştirmeler arasında, türünün ve adlandırılmış dynamic ve isteğe bağlı bağımsız değişkenlerin kullanımı yer almaktadır.

Birçok COM yöntemi, bağımsız değişken türlerinde varyasyona ve türleri olarak belirterek dönüş türüne olanak object sağlar. Bu, C# içinde kesin türe sahip değişkenlerle koordine olmak için değerlerin açıkça tür değiştirmesi gerektirmektedir. EmbedInteropTypes (C# Derleyici Seçenekleri) seçeneğini kullanarak derlerseniz, türün tanıtılması COM imzalarında oluşumlarını türünde gibi ele alasanız ve böylece tür atamanın büyük bir dynamic object dynamic kaçının. Örneğin, aşağıdaki deyimler bir elektronik tablo Microsoft Office Excel türüyle ve türü olmadan bir dynamic hücreye erişmeyle dynamic karşıtlıklıdır.

// Before the introduction of dynamic.
((Excel.Range)excelApp.Cells[1, 1]).Value2 = "Name";
Excel.Range range2008 = (Excel.Range)excelApp.Cells[1, 1];
// After the introduction of dynamic, the access to the Value property and
// the conversion to Excel.Range are handled by the run-time COM binder.
excelApp.Cells[1, 1].Value = "Name";
Excel.Range range2010 = excelApp.Cells[1, 1];
Başlık Açıklama
Dinamik anahtar sözcüğünün kullanımını dynamic açıklar.
Dinamik Dil Çalışma Zamanının Genel Bakış Ortak dil çalışma zamanının (CLR) dinamik diller için bir hizmet kümesi ekleyen çalışma zamanı ortamı olan DLR'ye genel bir bakış sağlar.
adım adım kılavuz: Dinamik Nesneler Oluşturma ve Kullanma Özel dinamik nesne oluşturmaya ve kitapla erişen bir proje oluşturmaya ilişkin adım adım yönergeler IronPython sağlar.
Visual C# özelliklerini kullanarak Office birlikte çalışma nesnelerine erişim Api nesnelerine erişimi kolaylaştıran adlandırılmış ve isteğe bağlı bağımsız değişkenleri, türü ve diğer geliştirmeleri kullanan dynamic bir Office gösterir.