SlideShare ist ein Scribd-Unternehmen logo
1 von 52
C# Fatih Boy www.enterprisecoding.com fatih@enterprisecoding.com twitter.com/fatihboy friendfeed.com/fatihboy
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ı
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.
.Net yol haritası SP1 3.5 3.0 .Net 1.0 .Net 1.1 .Net 2.0 .Net 4.0 2002 2003 2005-08 2010 CLR 1.0 CLR 1.1 CLR 2.0 CLR 4.0
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
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ç
Olay (Event) Olay bildirimine kayıt islem.SurecDegisti += islem_SurecDegisti; . . islem.SurecDegisti -= islem_SurecDegisti; Olay bildirimine kaydı silme
Olay (Event) Özel temsilci (delegate) privateSurecDegistiIsleyici _surecDegistiIsleyici; public eventSurecDegistiIsleyici SurecDegisti { add { _surecDegistiIsleyici += value; } remove { _surecDegistiIsleyici -= value; } } Olay bildirimine kayıt Olay bildirimine kaydı silme
Olay (Event) Olay bildirimine kayıt olunduğuna emin olun protected virtual void OnSurecDegistiIsleyici(inttamamlanmaOrani) { if (SurecDegistiIsleyici != null) { SurecDegistiIsleyici(tamamlanmaOrani);   } } Olay bildirimini tetikleyin
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
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
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);     } }
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.";     } );
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.");
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");
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);
Lambda İfadeler – {Dış değişkenler} Lambda ifadelerince kullanılan dış değişkenlerin değerleri lambda ifade çağırıldığında hesaplanır; intcarpan = 3; Func<int, int> carpim = x => x * carpan; intsonuc1 = carpim(2); // sonuc1 = 6 carpan = 10; intsonuc2 = carpim(2);// sonuc2 = 20 ,[object Object]
Lambda ifade içerisinde tanımlanan değişkenler her çağırım için tekildirler,[object Object]
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
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));
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
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.");
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};
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
Dinamik object nesne = 1; if (nesne.GetType() == typeof(int)){ Console.WriteLine("Tabiki türü int"); }
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;
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;
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
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();
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;    }  }
Dinamik
Ö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
Ö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.
Ö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
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
Reflection OgrenciogrenciInstance = new Ogrenci{                                        Adi = "Fatih",                                         Bolum = "Bil. Müh." }; Yukarıdaki ifadenin reflection karşılığı; Type ogrenciType = Type.GetType("Ogrenci"); object ogrenciInstace = Activator.CreateInstance(ogrenciType); FieldInfo adiAlani = ogrenciType.GetField("Adi"); FieldInfo bolumAlani = ogrenciType.GetField("Bolum"); adiAlani.SetValue(ogrenciInstace, "Fatih"); bolumAlani.SetValue(ogrenciInstace, "Bil. Müh.");
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
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ı
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
Xml – {Çıktı Dosyası} <?xmlversion="1.0" encoding="utf-8"?> <OgrenciListesixmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"  xmlns:xsd="http://www.w3.org/2001/XMLSchema"  xmlns="http://www.enterprisecoding.com">   <Ogrenciler>     <OgrenciAdi="Ali" Bolum="Bil. Müh." />     <OgrenciAdi="Fatih" Bolum="Bil. Müh." />     <OgrenciAdi="Melis" Bolum="DeriMüh." />   </Ogrenciler> </OgrenciListesi>
Xml – {Çıktı Dosyası} <?xmlversion="1.0" encoding="utf-8"?> <OgrenciListesixmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"  xmlns:xsd="http://www.w3.org/2001/XMLSchema"  xmlns="http://www.enterprisecoding.com">   <Ogrenciler>     <OgrenciAdi="Ali" Bolum="Bil. Müh." />     <OgrenciAdi="Fatih" Bolum="Bil. Müh." />     <OgrenciAdi="Melis" Bolum="DeriMüh." />   </Ogrenciler> </OgrenciListesi>
Xml – {de-serilization} XmlSerializerserializer = newXmlSerializer(typeof(OgrenciListesi)); using (StreamReaderdosya = File.OpenText("ogrenciListesi.xml")) { varogrenciListesi=(OgrenciListesi)serializer.Deserialize(dosya);    .    .     . }
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.");
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;
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)
LINQ – {örnekler} Bir önceki örnekteki akıcı sözdizimini incelersek; var bilMuhOgrencileri = ogrenciler                         .Where(ogrenci => ogrenci.Bolum == "Bil. Müh.")                         .OrderBy(ogrenci => ogrenci.Adi)                         .Select(ogrenci => ogrenci); varfiltrelenmis = ogrenciler.Where(ogrenci=>ogrenci.Bolum=="Bil. Müh."); varsiralanmıs   = filtrelenmis.OrderBy(ogrenci => ogrenci.Adi); varsorgu        = siralanmıs.Select(ogrenci => ogrenci);
LINQ – {örnekler} Dış değişken kullanırken dikkati elden bırakmamalı; int[] sayilar = { 9, 2, 0, 8, 6, 7, 5, 4, 1, 3 }; int limit = 5; var sorgu = from sayi in sayilar where sayi > limit select sayi; int[] limitUstuSayilara1 = sorgu.ToArray(); // 9, 8, 6, 7 limit = 3; int[] limitUstuSayilara2 = sorgu.ToArray(); // 9, 8, 6, 7, 5, 4
Threading static void Main(string[] args) { Thread t = newThread(EkranaYaz);      t.Start(); for (int i = 0; i < 999; i++) {         Console.Write("-"); } } private static void EkranaYaz() { for (int i = 0; i < 999; i++) {         Console.Write("*");     } } Program çıktısı; ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------***************************************************************************************** ***********************************************----------------------------------------------------------------------------------------------------------------------------------------
Threading static void Main(string[] args) { Thread t = newThread(EkranaYaz);      t.Start(); for (int i = 0; i < 999; i++) {         Console.Write("-"); }    t.Join(); } private static void EkranaYaz() { for (int i = 0; i < 999; i++) {         Console.Write("*");     } } Başlatılan thread’in bitmesi beklenir
Threading – {Veri geçisi} public delegate void ThreadStart(); public delegate voidParameterizedThreadStart (objectobj); static void Main(string[] args) { Thread t = newThread(EkranaYaz);      t.Start("*"); for (int i = 0; i < 999; i++) {         Console.Write("-"); }    t.Join(); } private static void EkranaYaz(object mesaj) { for (int i = 0; i < 999; i++) {         Console.Write(mesaj as string);     } }
Veritabanı SqlConnection baglanti = newSqlConnection(@"Server=.QLEXPRESS;Database=AdventureWorks;Trusted_Connection=Yes;"); baglanti.Open(); string sql = "SELECT TOP 100 Title, FirstName, MiddleName, LastName, EmailAddress FROM AdventureWorks.Person.Contact"; using(SqlDataAdapteradapter = newSqlDataAdapter(sql, baglanti)){   DataTabledataTable = newDataTable();   adapter.Fill(dataTable);   foreach(DataRow row in dataTable.Rows) { Console.WriteLine(string.Format("{0}{1}{2}{3}[{4}]", row["Title"], row["FirstName"],   row["MiddleName"], row["LastName"], row["EmailAddress"] ));   } } baglanti.Close();
Teşekkürler Fatih Boy www.enterprisecoding.com fatih@enterprisecoding.com twitter.com/fatihboy friendfeed.com/fatihboy

Weitere ähnliche Inhalte

Ähnlich wie C#, Microsoft Yaz Okulu 2010 - İzmir

php nin yapı taşları
php nin yapı taşlarıphp nin yapı taşları
php nin yapı taşlarıforummsn
 
Ileri seviye javascript by Azer Koculu
Ileri seviye javascript by Azer KoculuIleri seviye javascript by Azer Koculu
Ileri seviye javascript by Azer Koculumustafa sarac
 
C#, Microsoft Yaz Okulu 2011 - İzmir
C#, Microsoft Yaz Okulu 2011 - İzmirC#, Microsoft Yaz Okulu 2011 - İzmir
C#, Microsoft Yaz Okulu 2011 - İzmirEnterprisecoding
 
İleri Seviye Programlama 2
İleri Seviye Programlama 2İleri Seviye Programlama 2
İleri Seviye Programlama 2Caner Bovatekin
 
Introduction to Java programming
Introduction to Java programmingIntroduction to Java programming
Introduction to Java programmingAnıl Sözeri
 

Ähnlich wie C#, Microsoft Yaz Okulu 2010 - İzmir (7)

php nin yapı taşları
php nin yapı taşlarıphp nin yapı taşları
php nin yapı taşları
 
Ileri seviye javascript by Azer Koculu
Ileri seviye javascript by Azer KoculuIleri seviye javascript by Azer Koculu
Ileri seviye javascript by Azer Koculu
 
Ders1-Deği̇şkenler-C#
Ders1-Deği̇şkenler-C#Ders1-Deği̇şkenler-C#
Ders1-Deği̇şkenler-C#
 
C#, Microsoft Yaz Okulu 2011 - İzmir
C#, Microsoft Yaz Okulu 2011 - İzmirC#, Microsoft Yaz Okulu 2011 - İzmir
C#, Microsoft Yaz Okulu 2011 - İzmir
 
İleri Seviye Programlama 2
İleri Seviye Programlama 2İleri Seviye Programlama 2
İleri Seviye Programlama 2
 
Introduction to Java programming
Introduction to Java programmingIntroduction to Java programming
Introduction to Java programming
 
Typescript
TypescriptTypescript
Typescript
 

C#, Microsoft Yaz Okulu 2010 - İzmir

  • 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.
  • 4. .Net yol haritası SP1 3.5 3.0 .Net 1.0 .Net 1.1 .Net 2.0 .Net 4.0 2002 2003 2005-08 2010 CLR 1.0 CLR 1.1 CLR 2.0 CLR 4.0
  • 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
  • 36. Reflection OgrenciogrenciInstance = new Ogrenci{ Adi = "Fatih", Bolum = "Bil. Müh." }; Yukarıdaki ifadenin reflection karşılığı; Type ogrenciType = Type.GetType("Ogrenci"); object ogrenciInstace = Activator.CreateInstance(ogrenciType); FieldInfo adiAlani = ogrenciType.GetField("Adi"); FieldInfo bolumAlani = ogrenciType.GetField("Bolum"); adiAlani.SetValue(ogrenciInstace, "Fatih"); bolumAlani.SetValue(ogrenciInstace, "Bil. Müh.");
  • 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
  • 40. Xml – {Çıktı Dosyası} <?xmlversion="1.0" encoding="utf-8"?> <OgrenciListesixmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns="http://www.enterprisecoding.com"> <Ogrenciler> <OgrenciAdi="Ali" Bolum="Bil. Müh." /> <OgrenciAdi="Fatih" Bolum="Bil. Müh." /> <OgrenciAdi="Melis" Bolum="DeriMüh." /> </Ogrenciler> </OgrenciListesi>
  • 41. Xml – {Çıktı Dosyası} <?xmlversion="1.0" encoding="utf-8"?> <OgrenciListesixmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns="http://www.enterprisecoding.com"> <Ogrenciler> <OgrenciAdi="Ali" Bolum="Bil. Müh." /> <OgrenciAdi="Fatih" Bolum="Bil. Müh." /> <OgrenciAdi="Melis" Bolum="DeriMüh." /> </Ogrenciler> </OgrenciListesi>
  • 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)
  • 46. LINQ – {örnekler} Bir önceki örnekteki akıcı sözdizimini incelersek; var bilMuhOgrencileri = ogrenciler .Where(ogrenci => ogrenci.Bolum == "Bil. Müh.") .OrderBy(ogrenci => ogrenci.Adi) .Select(ogrenci => ogrenci); varfiltrelenmis = ogrenciler.Where(ogrenci=>ogrenci.Bolum=="Bil. Müh."); varsiralanmıs = filtrelenmis.OrderBy(ogrenci => ogrenci.Adi); varsorgu = siralanmıs.Select(ogrenci => ogrenci);
  • 47. LINQ – {örnekler} Dış değişken kullanırken dikkati elden bırakmamalı; int[] sayilar = { 9, 2, 0, 8, 6, 7, 5, 4, 1, 3 }; int limit = 5; var sorgu = from sayi in sayilar where sayi > limit select sayi; int[] limitUstuSayilara1 = sorgu.ToArray(); // 9, 8, 6, 7 limit = 3; int[] limitUstuSayilara2 = sorgu.ToArray(); // 9, 8, 6, 7, 5, 4
  • 48. Threading static void Main(string[] args) { Thread t = newThread(EkranaYaz); t.Start(); for (int i = 0; i < 999; i++) { Console.Write("-"); } } private static void EkranaYaz() { for (int i = 0; i < 999; i++) { Console.Write("*"); } } Program çıktısı; ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------***************************************************************************************** ***********************************************----------------------------------------------------------------------------------------------------------------------------------------
  • 49. Threading static void Main(string[] args) { Thread t = newThread(EkranaYaz); t.Start(); for (int i = 0; i < 999; i++) { Console.Write("-"); } t.Join(); } private static void EkranaYaz() { for (int i = 0; i < 999; i++) { Console.Write("*"); } } Başlatılan thread’in bitmesi beklenir
  • 50. Threading – {Veri geçisi} public delegate void ThreadStart(); public delegate voidParameterizedThreadStart (objectobj); static void Main(string[] args) { Thread t = newThread(EkranaYaz); t.Start("*"); for (int i = 0; i < 999; i++) { Console.Write("-"); } t.Join(); } private static void EkranaYaz(object mesaj) { for (int i = 0; i < 999; i++) { Console.Write(mesaj as string); } }
  • 51. Veritabanı SqlConnection baglanti = newSqlConnection(@"Server=.QLEXPRESS;Database=AdventureWorks;Trusted_Connection=Yes;"); baglanti.Open(); string sql = "SELECT TOP 100 Title, FirstName, MiddleName, LastName, EmailAddress FROM AdventureWorks.Person.Contact"; using(SqlDataAdapteradapter = newSqlDataAdapter(sql, baglanti)){ DataTabledataTable = newDataTable(); adapter.Fill(dataTable); foreach(DataRow row in dataTable.Rows) { Console.WriteLine(string.Format("{0}{1}{2}{3}[{4}]", row["Title"], row["FirstName"], row["MiddleName"], row["LastName"], row["EmailAddress"] )); } } baglanti.Close();
  • 52. Teşekkürler Fatih Boy www.enterprisecoding.com fatih@enterprisecoding.com twitter.com/fatihboy friendfeed.com/fatihboy