1. C# Fatih Boy www.enterprisecoding.com fatih@enterprisecoding.com twitter.com/fatihboy friendfeed.com/fatihboy
2. Ajanda Ortak Dil Çalışma-Zamanı (CLR), IL, JIT Visual Studio 2010 ve özellikleri Temsilci (Delegate) Olay (Event) Lambda İfadeleri Genişletme (Extension) Metodları Anonim Türler Dinamik Öznitelikler (Attributes) Reflection XML LINQ Threading Veritabanı
3. Ortak Dil Çalışma-Zamanı (CLR) .Net framework, Ortak dil çalışma-zamanı (Common Language Runtime) ve ekrafında şekillenmiş bir grup dll’den oluşmaktadır. CLR manage kodları çalıştırmaktadır ve C#’ta managed dillerden birisidir. Managed kod Ara Dil (Intermediate Language, IL) ile ifade edilmektedir CLR bir assembly’yi yüklediği zaman IL kodlarını makinenin anlayabileceği koda dönüştürür. Bu dönüşüm Just-In-Time (JIT) derleyici tarafından geçekleştirilir.
5. Temsilci (Delegate) delegate tanımı parametreler public delegate void Uyari(string mesaj); . . . Uyari uyari = delegate(string mesaj) { MessageBox.Show(mesaj);};uyari("Hatalı değer girildi"); . .uyari("Lütfen yeniden deneyiniz"); uyari = delegate{ MessageBox.Show("Hata oluştu");};uyari("kullanımayan parametre"); atama kullanımı Alternatif tanımlama
6. Olay (Event) delegate tanımı event tanımı public delegate voidSurecDegistiIsleyici(int tamamlanmaOrani); public eventSurecDegistiIsleyici SurecDegisti; islem.SurecDegisti += newSurecDegistiIsleyici(islem_SurecDegisti); void islem_SurecDegisti(int tamamlanmaOrani) { . .} Olay bildirimine kayıt Olay gerçekleştiğinde işletilecek süreç
7. Olay (Event) Olay bildirimine kayıt islem.SurecDegisti += islem_SurecDegisti; . . islem.SurecDegisti -= islem_SurecDegisti; Olay bildirimine kaydı silme
8. Olay (Event) Özel temsilci (delegate) privateSurecDegistiIsleyici _surecDegistiIsleyici; public eventSurecDegistiIsleyici SurecDegisti { add { _surecDegistiIsleyici += value; } remove { _surecDegistiIsleyici -= value; } } Olay bildirimine kayıt Olay bildirimine kaydı silme
9. Olay (Event) Olay bildirimine kayıt olunduğuna emin olun protected virtual void OnSurecDegistiIsleyici(inttamamlanmaOrani) { if (SurecDegistiIsleyici != null) { SurecDegistiIsleyici(tamamlanmaOrani); } } Olay bildirimini tetikleyin
10. Olay (Event) add ve remove bölümleri derleme zamanında add_XXX ve remove_XXX şeklinde metodlara dönüştürülür += ve -= operatörleri derleme zamanında add_XXX remove_XXX metodlarına çağrılara dönüştürülür Metodlarda olduğu gibi olaylarda virtual, overridden, abstract veya sealed olarak tanımlanabilir
11. Lambda İfadeleri En basit şekliyle anonim metodların sözdizimi geliştirilmiş halidir Lambda ifadelerle birlikte artık delegate anahtar kelimesine ve parametre türlerinin belirtilmesine gerek kalmamıştır Tür bilgisi derleyici tarafından kod içerisindeki kullanımdan yola çıkarak bulunabilir
12. Lambda İfadeleri – {Örnek, foreach} public class Ogrenci{ public string Adi; public string Bolum; } List<Ogrenci> ogrenciler = newList<Ogrenci> { newOgrenci{ Adi = "Ali", Bolum = "Bil. Müh." }, newOgrenci{ Adi = "Fatih", Bolum = "Bil. Müh." }, newOgrenci{ Adi = "Melis", Bolum = "Deri Müh." } }; Bilgisayar mühendisi olan öğrencilerin listesi; List<Ogrenci> bilMuhOgrencileri = newList<Ogrenci>(); foreach (Ogrenci ogrenci in ogrenciler) { if (ogrenci.Bolum == "Bil. Müh.") { bilMuhOgrencileri.Add(ogrenci); } }
13. Lambda İfadeleri – {Örnek, delegate} public class Ogrenci{ public string Adi; public string Bolum; } List<Ogrenci> ogrenciler = newList<Ogrenci> { newOgrenci{ Adi = "Ali", Bolum = "Bil. Müh." }, newOgrenci{ Adi = "Fatih", Bolum = "Bil. Müh." }, newOgrenci{ Adi = "Melis", Bolum = "Deri Müh." } }; List<Ogrenci> bilMuhOgrencileri = ogrenciler.FindAll( delegate(Ogrenci ogrenci) { return ogrenci.Bolum == "Bil. Müh."; } );
14. Lambda İfadeleri – {Örnek, lambda} public class Ogrenci{ public string Adi; public string Bolum; } List<Ogrenci> ogrenciler = newList<Ogrenci> { newOgrenci{ Adi = "Ali", Bolum = "Bil. Müh." }, newOgrenci{ Adi = "Fatih", Bolum = "Bil. Müh." }, newOgrenci{ Adi = "Melis", Bolum = "Deri Müh." } }; List<Ogrenci> bilMuhOgrencileri = ogrenciler.FindAll(ogrenci => ogrenci.Bolum == "Bil. Müh."); List<Ogrenci> bilMuhOgrencileri = ogrenciler.FindAll((Ogrenci ogrenci) => ogrenci.Bolum == "Bil. Müh.");
15. Lambda İfadeler –{Temsilciler} Lambda ifadeler temsilcilere atanabilir public delegate void Uyari(string mesaj); . . . Uyari uyari = mesaj => MessageBox.Show(mesaj);uyari("Hatalı değer girildi"); . .uyari("Lütfen yeniden deneyiniz");
16. Lambda İfadeler – {Dış değişkenler} Lambda ifadeler yerel değişkenleri ve tanımlandıkları metod’a ait parametreleri (dış değişkenleri) kullanabilirler; public delegate void Uyari(string mesaj); . . . string varsayilanMesaj = "Hata Oluştu"; Uyari uyari = mesaj => MessageBox.Show(mesaj ?? varsayilanMesaj);uyari("Hatalı değer girildi"); . .uyari(null);
17.
18.
19. Genişletme Metodları Mevcut bir veri türünün içeriğine müdahale etmeden yeni metodlarla genişletilmesidir Genişletme metodları statik bir sınıf içerisinde yine statik bir metodla tanımlanır
20. Genişletme Metodları Genişletme metodunun string türü için olduğunu belirtir public static class StringEx{ public static boolBosYadaBoslukMu(this stringstringIfade) { returnstring.IsNullOrEmpty(stringIfade) || stringIfade.Trim() == string.Empty; } } Örnek kullanım; stringornek = "Örnek"; Console.Write(ornek.BosYadaBoslukMu()); Derleyici taradından oluşturulan kod; stringornek = "Örnek"; Console.Write(StringEx.BosYadaBoslukMu(ornek));
21. Anonim Türler Derleyici tarafından derleme zamanı oluşturulan türlerdir new anahtar kelimesi takip eden nesne ilklendiriciler kullanılarak anonim bir tür oluşturulabilir Anonim türleri var anahtar kelimesi ile referans gösterebilirsiniz
22. Anonim Türler var ogrenci = new {Adi = "Fatih", Bolum = "Bil. Müh." } Derleyici tarafından üretilen kod; internal class OtomatikUretilmisTurAdi { private string adi; //gercekte farkli bir ad verilebilir private int bolum; //gercekte farkli bir ad verilebilir public OtomatikUretilmisTurAdi (string adi, string bolum) { this.adi = adi; this.bolum = bolum; } public string Adi { get { return adi; } } public string Bolum { get { return bolum; } } } var ogrenci = new OtomatikUretilmisTurAdi("Fatih", "Bil. Müh.");
23. Anonim Türler Anonim tür tanımlanırken özellik isimleri tanımlama sırasında kullanılan değişken isimlerinden faydalanarak oluşturulur var ogrenci = new {Adi = "Fatih", Bolum = "Bil. Müh." } string Adi = "Fatih"; string Bolum = "Bil. Müh."; var ogrenci = new {Adi, Bolum}; string Adi = "Fatih"; string Bolum = "Bil. Müh."; var ogrenci = new {Adi = Adi, Bolum = Bolum};
24. Anonim Türler İki anonim tür örneği, aynı tür elementlerle tanımlanmış ve aynı assembly içerisinde buunuyorsa arka planda aynı türü kullanmaktadır var ogrenci1 = new {Adi = "Fatih", Bolum = "Bil. Müh." }; var ogrenci2 = new {Adi = "Melis", Bolum = "Deri Müh." }; bool sonuc = ogrenci1.GetType() == ogrenci2.GetType(); //true
25. Dinamik object nesne = 1; if (nesne.GetType() == typeof(int)){ Console.WriteLine("Tabiki türü int"); }
26. Dinamik object nesne = 1; if (nesne.GetType() == typeof(int)){ Console.WriteLine("Tabiki türü int"); } nesne = nesne + 1; Yukarıdaki kodun derlenebilmesi için int türüne dönüşüm gerekli; object nesne = 1; if (nesne.GetType() == typeof(int)){ Console.WriteLine("Tabiki türü int"); } nesne = (int)nesne + 1;
27. Dinamik Aşağıdaki kod derleme zamanı hata vermese de çalışma zamanı hata oluşturur; object nesne = 1; if (nesne.GetType() == typeof(int)){ Console.WriteLine("Tabiki türü int"); } nesne = (string)nesne + 1;
28. Dinamik dynamic nesne = 1; if (nesne.GetType() == typeof(int)){ Console.WriteLine("Tabiki türü int"); } dynamic nesne = 1; if (nesne.GetType() == typeof(int)){ Console.WriteLine("Tabiki türü int"); } nesne = nesne + 1
29. Dinamik Dinamik kullanılırken derleyici desteği olmayacağı için geliştirme zamanı kod daha fazla hataya açıktır. Örneğin aşağıdaki kod derleme zamanı hata vermezken çalışma zamanında hataya neden olacaktır; dynamic nesne = 1; if (nesne.GetType() == typeof(int)){ Console.WriteLine("Tabiki türü int"); } Nesne.VarolmayanBirMetod();
30. Dinamik Bir önceki örneğin derlenmesi sonucu oluşan C# kodu; internal class Program { private static void Main(string[] args) { object nesne = 1; if (<ma IN>o__SiteContainer0.<>p__Site1 == null) { <ma IN>o__SiteContainer0.<>p__Site1 = CallSite<func><calls ITE, object, bool>>.Create( Binder.UnaryOperation(CSharpBinderFlags.None, ExpressionType.IsTrue, typeof(Program), new CSharpArgumentInfo[] { CSharpArgumentInfo.Create(CSharpArgumentInfoFlags.None, null) })); } if (<ma IN>o__SiteContainer0.<>p__Site2 == null) { <ma IN>o__SiteContainer0.<>p__Site2 = CallSite<func><calls ITE, object, Type, object>>.Create( Binder.BinaryOperation(CSharpBinderFlags.None, ExpressionType.Equal, typeof(Program), new CSharpArgumentInfo[] { CSharpArgumentInfo.Create(CSharpArgumentInfoFlags.None, null), CSharpArgumentInfo.Create(CSharpArgumentInfoFlags.UseCompileTimeType, null) })); } if (<ma IN>o__SiteContainer0.<>p__Site3 == null) { <ma IN>o__SiteContainer0.<>p__Site3 = CallSite<func><calls ITE, object, object>>.Create( Binder.InvokeMember(CSharpBinderFlags.None, "GetType", null, typeof(Program), new CSharpArgumentInfo[] { CSharpArgumentInfo.Create(CSharpArgumentInfoFlags.None, null) })); } if (<ma IN>o__SiteContainer0.<>p__Site1.Target.Invoke(<ma IN>o__SiteContainer0.<>p__Site1, <ma IN>o__SiteContainer0.<>p__Site2.Target.Invoke(<ma IN>o__SiteContainer0.<>p__Site2, <ma IN>o__SiteContainer0.<>p__Site3.Target.Invoke( <ma IN>o__SiteContainer0.<>p__Site3, nesne), typeof(int)))) { Console.WriteLine("Tabi ki t00fcr00fc int"); } else { Console.WriteLine("T00fcm makale hatalıymış :P"); } if (<ma IN>o__SiteContainer0.<>p__Site4 == null) { <ma IN>o__SiteContainer0.<>p__Site4 = CallSite<func><calls ITE, object, object int,>>.Create( Binder.BinaryOperation(CSharpBinderFlags.None, ExpressionType.Add, typeof(Program), new CSharpArgumentInfo[] { CSharpArgumentInfo.Create(CSharpArgumentInfoFlags.None, null), CSharpArgumentInfo.Create(CSharpArgumentInfoFlags.Constant | CSharpArgumentInfoFlags.UseCompileTimeType, null) })); } nesne = <ma IN>o__SiteContainer0.<>p__Site4.Target.Invoke(<ma IN>o__SiteContainer0.<>p__Site4, nesne, 1); } [CompilerGenerated] private static class <ma IN>o__SiteContainer0 { public static CallSite<func><calls ITE, object, bool>> <>p__Site1; public static CallSite<func><calls ITE, object, Type, object>> <>p__Site2; public static CallSite<func><calls ITE, object, object>> <>p__Site3; public static CallSite<func><calls ITE, object, object int,>> <>p__Site4; } }
32. Öznitelikler (Attributes) Öznitelikler assembly, türler, metod üyeleri, dönüş değerleri ve parametreler gibi kod elementlerine özel bilgiler eklememizi sağlayan bir mekanizmadır. Özniteliklerin kullanımıyla birlikte C# diline her yeni ihtiyaçta yeni bir anahtar kelime eklenmek zorunda kalmamıştır
33. Öznitelikler (Attributes) Öznitelikler abstract tanımlanmış olan System.Attribute sınıfından türetilerek oluşturulabilir Tanımlanmaları sırasında hangi kod elementlerinde kullanılabileceği belirtilebilir.
34. Öznitelikler (Attributes) Sadece sınıflar için kullanılabilir Aynı sınıf üzerinde birden fazla kullanılamaz [AttributeUsage( AttributeTargets.Class, AllowMultiple = false, Inherited = false)] public class OrnekAttribute : Attribute { } Alt sınıflarda tanımlı değil Bir öznitelik tanımlandığını belirtir
35. Reflection public class Ogrenci{ public string Adi; public string Bolum; } MemberInfo[] ogrencialanlari = typeof(Ogrenci).GetFields( BindingFlags.Public | BindingFlags.Instance); foreach (var ogrenciAlani in ogrencialanlari) { Console.WriteLine("Alan :" + ogrenciAlani.Name); } Çıktı; Alan : Adi Alan : Bolum
37. Xml Tür’ün tanımlı olacağı xml isimuzayı Xml tür adı [XmlType(Namespace="http://www.enterprisecoding.com",TypeName="Ogrenci")] public class Ogrenci{ [XmlAttribute] public string Adi; [XmlAttribute] public string Bolum; } Veri elemanının xml içerisinde ne şekilde tutulacağını belirtir
38. Xml – {XmlRoot, XmlArray, XmlArrayItem} Xml dokümanı giriş elemanı [XmlRoot(Namespace="http://www.enterprisecoding.com",ElementName="OgrenciListesi")] public class OgrenciListesi { [XmlArray(ElementName="Ogrenciler")] [XmlArrayItem(ElementName="Ogrenci")] publicOgrenci[] Ogrenciler; } Xml içerisinde oluşturulacak array tanımlaması Xml içerisinde oluşturulacak array elemanlarının tanımlaması
39. Xml – {serilization} Serileştirilecek tür XmlSerializerserializer = newXmlSerializer(typeof(OgrenciListesi)); OgrenciListesiogrenciListesi = newOgrenciListesi { Ogrenciler = new[] { newOgrenci{ Adi = "Ali", Bolum = "Bil. Müh." }, newOgrenci{ Adi = "Fatih", Bolum = "Bil. Müh." }, newOgrenci{ Adi = "Melis", Bolum = "DeriMüh." } } }; using (StreamWriterdosya = File.CreateText("ogrenciListesi.xml")) { serializer.Serialize(dosya, ogrenciListesi); } Serileştirmenin yapılacağı stream Serileştirilecek nesne
42. Xml – {de-serilization} XmlSerializerserializer = newXmlSerializer(typeof(OgrenciListesi)); using (StreamReaderdosya = File.OpenText("ogrenciListesi.xml")) { varogrenciListesi=(OgrenciListesi)serializer.Deserialize(dosya); . . . }
43. LINQ public class Ogrenci{ public string Adi; public string Bolum; } List<Ogrenci> ogrenciler = newList<Ogrenci> { newOgrenci{ Adi = "Ali", Bolum = "Bil. Müh." }, newOgrenci{ Adi = "Fatih", Bolum = "Bil. Müh." }, newOgrenci{ Adi = "Melis", Bolum = "Deri Müh." } }; var bilMuhOgrencileri = ogrenciler.Where(ogrenci => ogrenci.Bolum == "Bil. Müh.");
44. LINQ Aynı sorgunun farklı bir şekilde ifadesi; var bilMuhOgrencileri = from ogrenci in ogrenciler whereogrenci.Bolum == "Bil. Müh." selectogrenci; Sadece öğrencilerin adını sorgulamak için; var bilMuhOgrencileri = from ogrenci in ogrenciler whereogrenci.Bolum == "Bil. Müh." select ogrenci.Adi;
45. LINQ – {örnekler} Aynı sorgu, isimler sıralı şekilde; var bilMuhOgrencileri = from ogrenci in ogrenciler whereogrenci.Bolum == "Bil. Müh." orderbyogrenci.Adi ascending selectogrenci; Sorgu Sözdizimi (Query Syntax/Query Expression Syntax) Başka bir ifade ile; var bilMuhOgrencileri = ogrenciler .Where(ogrenci => ogrenci.Bolum == "Bil. Müh.") .OrderBy(ogrenci => ogrenci.Adi) .Select(ogrenci => ogrenci); Akıcı Sözdizimi (Fluent Syntax)