Dinamik tür kullanma

Tür dynamic statik bir türdür, ancak türündeki dynamic bir nesne statik tür denetimini atlar. Çoğu durumda, türüne objectsahip olduğu gibi çalışır. Derleyici, bir öğenin herhangi bir dynamic işlemi desteklediğini varsayar. Bu nedenle, nesnenin değerini COM API'sinden mi, IronPython gibi dinamik bir dilden mi, HTML Belge Nesne Modeli'nden (DOM) mı, yansımadan mı yoksa programın başka bir yerinden mi aldığını saptamanız gerekmez. Ancak, kod geçerli değilse hatalar çalışma zamanında ortaya çıkar.

Örneğin, aşağıdaki koddaki örnek yönteminin exampleMethod1 yalnızca bir parametresi varsa, derleyici yöntemine yapılan ilk çağrının ec.exampleMethod1(10, 4)iki bağımsız değişken içerdiğinden geçerli olmadığını tanır. Çağrısı bir derleyici hatasına neden olur. türü olduğundan dynamicderleyici yöntemine dynamic_ec.exampleMethod1(10, 4)yapılan ikinci çağrıyı dynamic_ec denetlemez. Bu nedenle derleyici hatası bildirilmemiştir. Ancak hata, bildirimden süresiz olarak kaçmıyor. Çalışma zamanında görünür ve bir çalışma zamanı özel duruma 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 nesneye veya ifadeye ne yapmayı dynamic önerdiği hakkında bilgileri bir araya getirmektir. Çalışma zamanı depolanan bilgileri inceler ve geçerli olmayan tüm deyimler çalışma zamanı özel durumunun neden olur.

Çoğu dinamik işlemin sonucu kendisidir dynamic. Örneğin, fare işaretçisini aşağıdaki örnekteki kullanımın testSum üzerinde bekletirseniz, IntelliSense dinamik testSum türünü (yerel değişken) 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ığı dynamic işlemler:

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

Örneğin, aşağıdaki bildirimdeki ExampleClasstürü testInstance , değildirdynamic:

var testInstance = new ExampleClass(d);

Dönüşümler

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

Aşağıdaki örneklerde gösterildiği gibi herhangi birini dynamic örtük olarak dönüştürebilirsiniz.

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

Buna karşılık, türüne dynamicait herhangi bir ifadeye dinamik olarak örtük dönüştürme uygulayabilirsiniz.

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

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

Bir yöntem çağrısındaki 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ündeysedynamicdynamic, derleme zamanı yerine çalışma zamanında aşırı yükleme çözümlemesi gerçekleşir. Aşağıdaki örnekte, tek erişilebilir exampleMethod2 yöntem bir dize bağımsız değişkeni alıyorsa, bağımsız değişken olarak göndermek d1 derleyici hatasına neden olmaz, ancak bir çalışma zamanı özel duruma neden olur. aşırı yükleme çözümlemesi çalışma zamanında başarısız olur çünkü çalışma zamanı türü d1 ve intexampleMethod2 bir dize gerektirir.

// 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), C# dilinde türünü destekleyen dynamic altyapıyı ve ayrıca IronPython ve IronRuby gibi dinamik programlama dillerinin uygulanmasını sağlar. DLR hakkında daha fazla bilgi için bkz . Dinamik Dil Çalışma Zamanına Genel Bakış.

COM birlikte çalışma

Birçok COM yöntemi, bağımsız değişken türlerinde çeşitleme ve türleri olarak objectniteleyerek dönüş türü sağlar. COM birlikte çalışma, C# dilinde kesin olarak yazılan değişkenlerle eşgüdüm sağlamak için değerlerin açıkça türleştirilmesini zorunlu kılmaktadır. EmbedInteropTypes (C# Derleyici Seçenekleri) seçeneğini kullanarak derlerseniz, türün dynamic girişi COM imzalarındaki oluşumları object türündeymiş dynamicgibi işlemenizi ve böylece atamanın büyük bir kısmını önlemenizi sağlar. Türü COM nesneleriyle kullanma dynamic hakkında daha fazla bilgi için, C# özelliklerini kullanarak Office birlikte çalışma nesnelerine erişme makalesine bakın.

Ünvan Açıklama
dynamic Anahtar sözcüğün dynamic kullanımını açıklar.
Dinamik Dil Çalışma Zamanına Genel Bakış Ortak dil çalışma zamanına (CLR) dinamik diller için bir hizmet kümesi ekleyen bir çalışma zamanı ortamı olan DLR'ye genel bir bakış sağlar.
İzlenecek yol: Dinamik Nesneler Oluşturma ve Kullanma Özel dinamik nesne oluşturmaya ve kitaplığa erişen bir proje oluşturmaya yönelik IronPython adım adım yönergeler sağlar.