1. C# 4.0 Yenilikleri Sefer Algan (Microsoft MVP) BT Akademi & Cronom: Kurucu Yöneticisi C#nedir?com: Kurucu Editörü E-Mail : sefer.algan@btakademi.com
2. Ajanda Dynamic Language Runtime CLR olan ilişkisi Dynamic Anahtar Sözcüğü ve C# Dinamik ifade yazımı Demo Dinamik tipler(Expando,Entity vs) ve diğerleri... Diğer yenilikler Opsiyonel Parametreler Named Parameter BCL 4.0 ile Öne Çıkanlar
3. CLR Nedir? Common Language Runtime (CLR): Statik diller için ortak platform. Operasyonlar için Static binding (compile-time) Diller arası entegrasyonCommon Language Specification (CLS)
4. DLR Nedir? Dynamic Language Runtime (DLR): Dinamik diller için ortak platform Operasyonlarda «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ı kullanma HTML DOM gibi dinamik nesne modelleri ile rahat etme COM Arayüzleri (IDispatch) ile hızlı uyum..!
6. Dynamic Language Runtime IronPython IronRuby C# VB.NET Diğer Diller… Dynamic Language Runtime İfade Ağaçları (Expressin Tree) Dynamic Dispatch Call Site Caching PythonBinder RubyBinder COMBinder DOMBinder ObjectBinder
7. Terminoloji: Dynamic Binding Binding: Operasyonun anlamını çıkarmak (kullanılan öğelere bakarak) Static binding:Derleme zamanda tip ayrımlarından yola çıkarak operasyonu belirleme Dynamic binding:Çalışma zamanında gerçek operasyonu tespit etme.
8. Dinamik Sentaks Nasıl Olabilir? 1. Düşünce:Farklı olmalı! Tip güvenliği ön planda..! 2. Düşünce:Benzer olmalı! Basit ve sade kod..
9. Dynamic: Beyin Cimnastiği Amaç: Dinamik bir koleksiyondan bir eleman almak Static eşleniği: string[] a = GetStringArray(…); string result = a[a.Length– 1];
10. SentaksDenemesi #1 Dinamik operasyonu açıkca belli etme: object d = GetDynamicObject(…); string result = d~[d~.Length- 1];
11. Sentaks Denemesi #1 Dinamik operasyonu açıkca belli etme: object d = GetDynamicObject(…); string result = ~(string)d~[d~.Length~- 1]; Problem:Bırrrr!
12. Sentaks Denemesi #2 Dynamic context: object d = GetDynamicObject(…); string result = dynamic(d[d.Length - 1]);
13. Sentaks Denemesi #2 Dynamic context: object d = GetDynamicObject(…); int index = GetIndex(…); string result = dynamic(d[index * 2]);
14. Sentaks Denemesi #2 Dynamic context: object d = GetDynamicObject(…); int index = GetIndex(…); string result = dynamic(d[static(index * 2)]); Problem: Dinamiklik içinde statiklik? Takip zorluğu
15. SentaksDenemesi #2 Dynamic 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 İfade içine dinamiklik izi bırakmak object d = GetDynamicObject(…); int index = GetIndex(…); string result =dynamic(d)[index * 2];
17. Sentaks Denemesi #3 İfade içine dinamiklik izi bırakmak object d = GetDynamicObject(…); string result = d[dynamic(d).Length- 1];
18. Sentaks Denemesi #3 İfade içine dinamiklik izi bırakmak object 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 #4 Dynamic Tip: dynamic d = GetDynamicObject(…); varlen = d.Length; string result =d[len- 1]; Var, object, dynamic karmaşası ???????
20. Sentaks Denemesi #4 Dynamic Tip: dynamic d = GetDynamicObject(…); int index = GetIndex(…); string result =d[index * 2];
21. Sentaks Denemesi #4 Dynamic Tip: 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»anahtar sö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 vs dynamic CDrive = new FileSystemStorageObject(@"c:"); var result = (CDrive.TestSub.File1.txt >> CDrive.TestSub.File2.txt);Kaynak : www.codeproject.com
23. ‘Statik olarak dynamicişaretleme’ Calculator calc = 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 yapma dynamic calc = GetCalculator(); int sum = calc.Add(10, 20); Dynamic method invocation Dynamic conversion
24. Tip yadaTipBelirleyicisi? Tip Belirleyicisi: dynamic Foo 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; Dynamic type: Method call Math.Abs(d) Invocationd("Hello") Member access d.Length Operator application d + 4 Indexing d["Hello"] Static type: Conversions (double)d Object creation newFoo(d)
26. Runtime binder mevzusu C# 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üvenlidir Dinamik 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.
29. Diğer Dil Yenilikleri Opsiyonel Parametreler void Deneme (int a, char c=‘X’); İsimlendirilmiş Parametreler Deneme(c:’B’, a : 5); Generic Koleksiyonlarda «Co» ve «Contra» variance List<int> a= ...List<object> b = ...b=a;
30. BCL Yeniliklerinden Öne Çıkanlar Code Contracts Parallel Extensions (task parallel library,plinq) System.Numeric (BigInteger, Complex) (F#?) MemoryMappedFile (büyük dosyalar, interprocesscommunication-ipc-) System.Tuple<T1,T2,T3.....> varsonuc= Tuple.Create("ahmet", 5, 'c', 3.4); SortedSet (self-balancing tree, performans!) FileSystem Enumeration (IEnumarable<FileInfo>) In Process-Side By Side CLR