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 object
sahip 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 dynamic
derleyici 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
dynamic
bağımsız değişkenler içeren oluşturucu çağrıları.
Örneğin, aşağıdaki bildirimdeki ExampleClass
tü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 dynamic
ait 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ündeysedynamic
dynamic
, 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 int
exampleMethod2
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 object
niteleyerek 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ş dynamic
gibi 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.
İlgili makaleler
Ü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. |