C# 4.0 YenilikleriSeferAlgan (Microsoft MVP)BT Akademi & Cronom: Kurucu YöneticisiC#nedir?com: Kurucu EditörüE-Mail : sefer.algan@btakademi.com
2.
AjandaDynamic Language RuntimeCLRolan ilişkisiDynamic Anahtar Sözcüğü ve C#Dinamik ifade yazımıDemoDinamik tipler(Expando,Entity vs) ve diğerleri...Diğer yeniliklerOpsiyonel ParametrelerNamed ParameterBCL 4.0 ile Öne Çıkanlar
3.
CLR Nedir?Common LanguageRuntime (CLR):Statik diller için ortak platform.Operasyonlar için Static binding (compile-time)Diller arası entegrasyonCommon Language Specification (CLS)
4.
DLR Nedir?Dynamic LanguageRuntime (DLR):Dinamik diller için ortak platformOperasyonlarda «Dynamic binding»(runtime)Diller arası entegrasyon?? IDynamicMetaObjectProvider protocol (IDMOP)
5.
Neden «Dinamik C#»?Öncelikle, C# dinamik dil değildir!Ve olmayacak.Dinamik dünyaya C# ile adım atabilmek?Python gibi dinamik dillerde yazılmış kodları kullanmaHTML DOM gibi dinamik nesne modelleri ile rahat etmeCOM Arayüzleri (IDispatch) ile hızlı uyum..!
Terminoloji: Dynamic BindingBinding:Operasyonun anlamını çıkarmak (kullanılan öğelere bakarak)Static binding:Derleme zamanda tip ayrımlarından yola çıkarak operasyonu belirlemeDynamic binding:Çalışma zamanında gerçek operasyonu tespit etme.
8.
Dinamik Sentaks NasılOlabilir?1. Düşünce:Farklı olmalı!Tip güvenliği ön planda..!2. Düşünce:Benzer olmalı!Basit ve sade kod..
9.
Dynamic: Beyin CimnastiğiAmaç:Dinamikbir koleksiyondan bir eleman almakStatic eşleniği: string[] a = GetStringArray(…); string result = a[a.Length– 1];
Sentaks Denemesi #1Dinamikoperasyonu açıkca belli etme:object d = GetDynamicObject(…);string result = ~(string)d~[d~.Length~- 1];Problem:Bırrrr!
12.
Sentaks Denemesi #2Dynamiccontext:object d = GetDynamicObject(…);string result = dynamic(d[d.Length - 1]);
13.
Sentaks Denemesi #2Dynamiccontext:object d = GetDynamicObject(…);int index = GetIndex(…);string result = dynamic(d[index * 2]);
14.
Sentaks Denemesi #2Dynamiccontext:object d = GetDynamicObject(…);int index = GetIndex(…);string result = dynamic(d[static(index * 2)]);Problem: Dinamiklik içinde statiklik? Takip zorluğu
15.
SentaksDenemesi #2Dynamic context:dynamic{ object d = static(GetDynamicObject(…));int index = static(GetIndex(…)); string result = d[static(index * 2)];}Problem: dinamik contex içerisinde küçük statik bloklar yazmak. Herşey dinamik değildir!
16.
Sentaks Denemesi #3İfadeiçine dinamiklik izi bırakmakobject d = GetDynamicObject(…);int index = GetIndex(…);string result =dynamic(d)[index * 2];
17.
Sentaks Denemesi #3İfadeiçine dinamiklik izi bırakmakobject d = GetDynamicObject(…);string result = d[dynamic(d).Length- 1];
18.
Sentaks Denemesi #3İfadeiçine dinamiklik izi bırakmakobject d = GetDynamicObject(…);varlen = dynamic(d).Length;string result =d[dynamic(len)- 1];Problem: Dinamikliği nasıl takip edeceğiz?Atamalar arasında taşınabilir mi?C#’da zaten bu sistem var...
19.
Sentaks Denemesi #4DynamicTip:dynamic d = GetDynamicObject(…);varlen = d.Length;string result =d[len- 1];Var, object, dynamic karmaşası ???????
20.
Sentaks Denemesi #4DynamicTip:dynamic d = GetDynamicObject(…);int index = GetIndex(…);string result =d[index * 2];
21.
Sentaks Denemesi #4DynamicTip:dynamic d = GetDynamicObject(…);string result = d[d.Length- 1];Avantaj: Fark Yok!Statik kod kadar kolay okunabilir ve niyet açıkca belli edilir.DezAvantaj: Fark Yok!Lokal olarak kodun dinamik olduğu belli olmuyor.
22.
Neden Güvenli?Sadece «dynamic»anahtarsözcüğü kullanılarak dynamic dispatch yapılıyor. Eski yapılar normal çalışmaya devam!IntelliSense statik çizgiyi destekler. Bir işlemin dinamik olup olmadığı bellidir.Daha doğal kod yazma ve okuma sağlar. Örnek : Silverlight JS, COM Binder, Reflection Binder vsdynamic CDrive = new FileSystemStorageObject(@"c:\\");var result = (CDrive.TestSub.File1.txt >> CDrive.TestSub.File2.txt);Kaynak : www.codeproject.com
23.
‘Statik olarak dynamicişaretleme’Calculatorcalc = GetCalculator();int sum = calc.Add(10, 20);object calc = GetCalculator();TypecalcType = calc.GetType();object res = calcType.InvokeMember("Add",BindingFlags.InvokeMethod, null,newobject[] { 10, 20 });int sum = Convert.ToInt32(res);ScriptObject calc = GetCalculator();object res = calc.Invoke("Add", 10, 20);int sum = Convert.ToInt32(res);Static olarak dynamic yapmadynamic calc = GetCalculator();int sum = calc.Add(10, 20);Dynamic method invocationDynamic conversion
24.
Tip yadaTipBelirleyicisi?Tip Belirleyicisi:dynamicFoo d = GetDynamicFoo(…);Foo üyelerini Static bind et.Kalanı dinmaik bind et.Tip :dynamic d = GetDynamicFoo(…);Bütün üyeleri dinamik bind et.Tip «Object» olsa bile
25.
Diğer Dinamik İfadeler;Dynamictype:Method call Math.Abs(d)Invocationd("Hello")Member access d.LengthOperator application d + 4Indexing d["Hello"]Static type:Conversions (double)dObject creation newFoo(d)
26.
Runtime binder mevzusuC#runtime binder (Microsoft.CSharp.dll):Standart .NET nesneleri ile çalışır (reflection!)Derleme aşamasını simüle eder. (çalışma zamanında)IDynamicMetaObjectProvider arayüzü:DynamicObject implemenete eder.Object kendi Binding mekanizmasını belirler.İmplemente edilmemişse C# Binder devreye girer.
27.
Sonuç: Dynamic kullanışlıve güvenlidirDinamik nesne modellerine çok az kod yazarak erişirsiniz.Eski usül ile yazmaya devam edebilirsiniz. Dynamic olmayan herşey eski performansı ile çalışır.Nerdeyse statik hızında dinamizm elde edersiniz. (ruby ve javascript de olmadığı kadar)Eğer bir gün «Intellisense» i özelerseniz çok fazla dinamik olmuşsunuzdur.
Diğer Dil YenilikleriOpsiyonelParametrelervoid Deneme (int a, char c=‘X’);İsimlendirilmiş ParametrelerDeneme(c:’B’, a : 5);Generic Koleksiyonlarda «Co» ve «Contra» varianceList<int> a= ...List<object> b = ...b=a;