Kursun Balang Tarihi: 05 Haziran 2011 Pazar Kurs Saati: 09.00-13.00 Hafta 1.Gn 2.Gn (+/-) (+/-) Detay 1 BO 5 Haziran 2011 (Bo) + 2 11 Haziran 2011 12 Haziran 2011 + 2011 Genel Seim 3 18 Haziran 2011 19 Haziran 2011 + + 4 25 Haziran 2011 26 Haziran 2011 + + 5 2 Temmuz 2011 3 Temmuz 2011 + + 6 9 Temmuz 2011 10 Temmuz 2011 Dernek Tatili -(DerNot Eksik) 7 16 Temmuz 2011 17 Temmuz 2011 + + 8 23 Temmuz 2011 24 Temmuz 2011 Dernek Tatili Dernek Tatili 9 30 Temmuz 2011 31 Temmuz 2011 + + 10 6 Agustos 2011 7 Agustos 2011 + + 11 13 Agustos 2011 14 Agustos 2011 + + 12 20 Agustos 2011 21 Agustos 2011 + + 13 27 Agustos 2011 28 Agustos 2011 Dernek Tatili Dernek Tatili 14 3 Eyll 2011 4 Eyll 2011 + + 84.Saat 15 10 Eyll 2011 11 Eyll 2011 Dernek Tatili Dernek Tatili 16 17 Eyll 2011 18 Eyll 2011 + + 92.Saat 17 24 Eyll 2011 25 Eyll 2011 + + 100.Saat 18 1 Ekim 2011 2 Ekim 2011 Dernek Tatili + 104.Saat 19 8 Ekim 2011 9 Ekim 2011 + + 112.Saat 20 15 Ekim 2011 16 Ekim 2011 + + 120.Saat 21 22 Ekim 2011 23 Ekim 2011 + + 128.Saat 22 29 Ekim 2011 30 Ekim 2011 + + 136.Saat 23 5 Kasim 2011 6 Kasim 2011 Bayram Tatili Bayram Tatili - 24 12 Kasim 2011 13 Kasim 2011 + + 144.Saat 25 19 Kasim 2011 20 Kasim 2011 + + 152.Saat 26 26 Kasim 2011 27 Kasim 2011 + + 160.Saat 27 03 Aralik 2011 04 Aralik 2011 + + 168.Saat 28 10 Aralik 2011 11 Aralik 2011 + + 176.Saat 29 17 Aralik 2011 18 Aralik 2011 + + 184.Saat 30 24 Aralik 2011 25 Aralik 2011 + 192.Saat Yazi Tipi : Verdana 12; Kursun Balang Tarihi : 05 Haziran 2011 Kursun Biti Tarihi : 24 Aralk 2011 Kursun Normal Sresi : 150 saat Ilenen Ders Saati : 188 saat 1 Mert KPRC(mrtkprc@gmail.com) Sayfa 2 / -206- 1.Hafta 2.Gn (05 Haziran 2011) .NET Nedir? Microsoft yeni kuak uygulama gelitirme ve alitirma ortamidir. .NET = Selpak CLI(Common Language Infactory) = Kagit Mendil .NET ; Microsoftun rnnn adidir. Microsoft bu ortami ECMA 335, CLI(Common Language Infactory) ismiyle standardize edildi. Linuxdaki kariligi MONOdur. Diger bir gerekletirilmesi Rotordur. .NET Tarihsel Geliimi Ilk resmi aiklama 2000 yilinda gelmitir. 1.0 (2002) 1.1 (2003) 2.0 (2005) 3.0 (2007) 4.0 (2009) C # Nedir ? Anders Hejlsberg ve 4 arkadai tarafindan yazilmitir. C #, .NET ortami iin tasarlanmi yksek seviyeli nesne ynelimli Microsoft tarafindan gelitirilmi bir programlama dilidir. Ismindeki diyez (#) mzikten alinmitir. Syntax bakimindan C/C++ kkenlidir. %70 oraninda Javaya benzer ve C++ diline daha da yakinlatirilmitir. .NET ortaminin birincil dilidir. C #; Ecma 334 ve ISO tarafindan standardize edildi. .NET Ortamnn Temel zellikleri 1-) Ara Kodlu alma Sistemi * CIL (Common Intermediate Language) * CLR (Common Language Runtime) => .NET iin .exe programi gerek makine komutlari iermez. Ierisinde CIL olarak bilinen yapay bir kod iermekte. Bu program alitirilmak istendiginde bu ara kod gerek makine komutlarina dntrlerek alimasi istenir. Bu komutlar alitirilmasi istendiginde CLR alitirilir. * CIL => CLR `ye dogru yapilan yapay derlemeye JIT(Just in Time) Derlemesi denir. Bu derleme Microsoftun aiklamasina gre %18lik bir hiz kaybina sebep oldugu sylenmektedir. JIT Derlemesine diger bir deyile ; ara kodun gerek makine koduna 2 Mert KPRC(mrtkprc@gmail.com) Sayfa 3 / -206- evrilmesi denir. JIT derlemesi ilemi btn olarak degil kademe kademe yapilmaktadir. Bu sisteme Bir Kere Derle ; Her Zaman Kullan denir. * Windowsun mobil iletim Sistemleri => Windows CE (Compact Edition), Windows Mobile * Iphonenin mobil iletim Sistemi => IOS (Iphone Operating System) * Blackberrynin mobil iletim Sistemi => RIMdir * Android Iletim Sistemide => Google tarafindan desteklenmekte ve Java dogal dilidir. => Ara kodun en nemli avantaji ; yazilan programinin tainabilirligidir. => Ara kodun tabi ki alitirabilmesi iin orda CLI `nin kurulu olmasi gerekir. * Derlenmi bir programin alitirabilmesi hem iletim sistemine hem de ilemciye baglidir. Fakat ara kod sayesinde bu koullar kalkmaktadir. Javada da ise ayni mantik yrtlmektedir. Javada retilen ara koda Java Byte Kod denir. Javanin da alitirabilmesi iin JVM (Java Virtual Machine ) gereklidir. Anahtar Notlar: * Android in doal dili => Java * Windows CEnin doal dili => C # * IOS un doal dili => Objective C ve platformu Cocoadir 2.Diller Aras Entegrasyon * Java hem dil hem de platformun ismidir. Bir dilde yazilmi bir programin baka bir dilde kullanilmasi her zaman sikintili olmutur. nk bir projenin bazi komutlari ona uygun yazilmasi gerekmektedir. * Microsoft bu problemi zmek iin COM (Component Object Model) spesifikasyonu ile zmeye alimitir. Halbuki .NET ile ayni ara kod reten eitli diller ile hibir arayze gerek kalmadan kullanabilir. Sonu olarak; .NET , COM gereksinimini ortadan kaldirmitir. * V # ( .NET ortaminda Java Iin Yazilmitir.) * F # ( zellikle Matematiksel ilemlerinde kullanilir.F harfi Fortrandan gelmektedir) => Microsoft kendisi CLI ara kod retecek biimde u derleyicileri yazmitir. C #, C+ +/CLI, VB.NET, V#, F# vb.. => Bunlarin diinda bakalari tarafindan yazilan CLI ara kod reten dil derleyicilerde vardir. 3. Hzl uygulama gelitirme ortam .NET ortami hizli bir uygulama gelitirme ortamidir. Bu ortamda IDEler de ve grselligide kullanarak daha az bir abayla uygulamalar gelitirilebilinir. 4. Ortak snf ktphanesi .NET in tm dillerden ortak kullanilan geni bir sinif ktphanesi vardir. Bu sinif ktphanesi. NET iinde; User interface iin Forms, veritabani iin ADO.Net, Network haberlemesi iin Socket, izim iin Drawing ktphaneleri gerekir. 3 Mert KPRC(mrtkprc@gmail.com) Sayfa 4 / -206- Anahtar notlar : iyi bir. net programcisi olmak iin gereken zellikler : dili bilme ve dile hakimiyet %25 Sinif kutuphanesi kullanma becerisi %50 sistem programlama bilgisi %25 5. Gvenli bir ortam .NET dogal sisteme gre daha gvenli bir alitirma ortami sunmaktadir. Yetkisiz bir program sistemi bozmasi, CLR tarafindan engellenmektedir. Bozuk bir programin sistemi etkilemesi zayiftir. Yukaridakiler diinda baka zellikleri vardir bunlar zamanla incelenecektir. .NET ORTAMI NASIL KURULUR. Microsoft , Windows Xpnin sonraki srmlerinde artik .Net ortamini Windowsun standart bir parasi haline getirmitir. Yani Windows sistemleriyle birlikte zaten bu ortam kurulu olacaktir. Fakat programci yeni bir versiyonu yada eski bir iletim sistemine bu ortami kurmak isteyebilir . 1. Visual Studio IDEsini kuruldugunda zaten .NET ortamida kurulmaktadir. Microsoft Visual Studio IDEsini bedava versiyonu Express Edition ismiyle dagitilmaktadir. 2. SDK(Software Devolepment Kit), .NET Framework SDK kurulursa IDE kurulmaz. Microsoftun sayfasindan Framework SDK indirilir ve kurulur. Bunun iierisinde yalnizca .NET ortami degil bazi aralarda vardir. 3. .NET Redistribulabe package paketi en minimal yani hi bir ortamin kurulu olmasini istemiyorsan. Bunun iin microsoft sayfasindan .net redistributable package indirrilir kurulur(YANI KUYUMCUYA Kuracagin paket bu) * .NET Ortaminin olup olmadigini kontrol etmek iin ya programi alitirmayi dene yada C srcsn `den Microsofta gir ordan Microsoft .NET klasrn bak var mi yok mu diye kontrol et. =>Microsof .NET ortaminin gittike gelitirip ve ilerletmektedir. Fakat bu yapilarken gemii yapilan uyumda korunmaktadir. Yani Framework 4.0 ,2.0 desteklemektedir. Yeni bir framework iin yazilmi bir programi eski bir frameworkda alitiramayabiliriz. 2.Hafta 1.Gn (11 Haziran 2011) Derleyici Kavram Herhangi bir programlayici dilde yazilmi olan dilleri edeger olarak baka dillere eviren programlara evirici program denir. Translator (evirici) program. Bir evirici programda hedef dil aagi seviyeli bir dil ise (yani sembolik makina dili saf makina dili , ara kod ise) bu tr evirici programlara Compiler (Derleyici) denir. Bazi dil aralari kaynak programi alarak hi hedef kod retmeden dogrudan alitirirlar, bu tr programlara yorumlayici (interpreter) denir. Yorumlayici yazmak derleyici yazmaktan daha kolaydir fakat yorumlayicilar kodu derleyiciden daha yava alitirilar. Yorumlayicilarda kaynak kodun ileme sokulmasi iin her an bulundurulmasi gerekir . Her derleyici program bir evirici programdir fakat her evirici program derleyici program degildir. C# derleyici mantigi ile aliir. 4 Mert KPRC(mrtkprc@gmail.com) Sayfa 5 / -206- Dil nedir? Dil genel olarak anlamakta kullanilan semboller kmesidir. dilin eitli kurallari varadir dil btn kurallarina gramer denir. Gramerin en nemli iki nemli alt alanina sentaks ve semantikdir. Semantik ve sentaks dogal dillerin hepsinde bulunmaktadir. Bazi kurallar sadece dogal dilllerde vardir (morfoloji , fonetik vb..). Sentax: Dogru yazima ve dogru dizilim kurallarina denir. Semantik : Sentaxa gre yazilmi yazinin ne anlama geldigini konu alan gramerin blmne denir. Btn dillerde sentax ve semantik vardir. *Diller dogal diller ve kurgusal diler olmak zere ikiye ayrilabilir. Kurgusal dilllere (formal,biimsel ) dil denir. Biimsel dillleri sentax kurallari tamamen matematik sembolleriyle ifade edilebilmektedir. *Bir olgunun dil olarak kabul edilebilmesi iin sentax ve semantik kurallari olmasi gerekir. rnegin html bir dildir. C # bir dildir. Bilgisayar aginda kullanilmak zere tasarlanmi olan dilere bilgisayar dilleri denir(computer languages) eger bir bilgisayar dilinde bir aki varsa buna programlama dili denir(programming language). PROGRAMLAMA DLLERNN SINIFLANDIRLIMASI Programlama dillerin siniflandirilmasi birok lte gre yapilabilir. lt ok fazla kullanilabilir. - Seviyelerine gre - Uygulama alanina gre - Programlama modeline gre
-SEVYELERNE GRE SINIFLANDIRMA Seviye ; insan algilayiina olan yakinlik uzaklik kastedilmektedir. Yksek seviyeli diller demek insan algilayiinin daha kolay olmasini saglanmasidir. Yksek seviyeli diller kolay grenilir. Dk seviyeli diller daha zor grenilir. *ok yksek seviyeli diller (4.kuak diller)(SQL, Script Dilleri) *Yksek Seviyeli Diller(C#,Php,Basic,Fortran) * Orta Seviyeli Diller *Sembolik makine dili *SAF MAKINA DILI => C# yksek seviyeli bir programlama dilidir. -UYGULAMA ALANLARINA GRE SINIFLANDIRMA 1-) Bilimsel mhendislik dilleri(Fortran,C,C++,Java,C#) 2-)Veritabani uygulamalarina ynelik diller (Foxpro, C#,Java,SQL) 3-)Grsel ve Animasyon Diller (Flash,Action Script) 5 Mert KPRC(mrtkprc@gmail.com) Sayfa 6 / -206- 4-)Yapay Zeka Dilleri (Lisp,Prolog,C/C++,C#,Java) 5-)Web Programciligi(Php,C#,Java,Pyhton) 6-)Sistem programlama=>Iletim sistemi, derleyicilere denir(C/C++,Sembolik Makina Dilleri) 7-)Genel amali diller(C#,C,C++,Java) C# genele amali bilimsel mhendislik alanlarinda kullanilabilinen internet ve web programciliginda kullanilabilen bir programlama dilidir. -PROGRAMLAMA MODELNE GRE SINIFLANDIRMA 1-)Prosedrel diller(C,Pascal)=>Dilde bir sinir yok. 2-)Nesne Ynelimli Diller(C#,Java)=>ierisine class girerse 3-)Fonksiyonel Diller( F#) 4-)Mantiksal Diller (Prolog)=>boolean akilarini kullanarak yazarak C# nesne ynelimli bir programlama dilidir.(Object Oriented). Bazi programlama dillerinde birden fazla programlama modeli kullanilir. Ama agirlik bir tarafi vardir her dilin. C# agirlik noktasi nesne ynelimdir. PROGRAMLAMA DLLLERNN TARHSEL GELM.... Dnyanin ilk yksek seviyeli dili kabul edilen dil Fortrandir. Fortranin alt branlarindaki en nemli agirlik kazandiran algoldir. Ilk yksek seviyeli programlama dilleri 1950 yillarinda ikmiti ve ilk dil olarak kabul edilen Fortrandir. (Formul Translattionin kisaltmasinda). Diger diller Fortran kknden ayritirilmitir. Fortran dilinden treyen en nemli dil Algoldur. Bugnk modern programlama dillleri daha ok Algol ailesinden gelmektedir. Programlama dilleri tarihsel bir aga oluturmaktadir. IDE(INTEGRATED DEVOLEPMENT ENVRONMENT) KAVRAMI IDE derleyici degildir. IDE sadece Derleyiciyi agirir. MicrosoftC# compileri csc.exedir(CSharpCompiler.Exe.) Ide yazilim gelitirme kolaylatiran aralarin bulundugu bir ortamdir. Iersinde editr vardir menleri vardir, eitli grsel editrleri vardir. Derleme ilemini IDEnin kendisi yapmaz. Derleyiclier komut satirli biimdedir(Pencereli program eklinde degildir).Arayz basit ama kendisi zordur. Linux C# derleyicisi mcs.exe. Aslinda IDEler olmazsa olmaz degillerdir. rnegin dnyanin en byk c# projesi notepad gibi programda yazilip komut satirindan csc.exe ile derleyip aliirabiliriz. ATOM KAVRAMI(TOKEN) Bir programlama dilinde yazilmi bir programin anlamli en kk birimine atom(token) denir. Atomlarin siniflandirilmasi; 1-)Anahtar Szckler(Keyword,reserved word) : Dil iin zel anlami olan degiken olarak kullanilmasi yasaklanmi atomlara anahtar szcklere denir. rnek , if ,while, for..... 2-)Degikenler(identifiers/variables) : Ismini bizim istedigimiz gibi verebildigimiz atomlara degiken denir. 6 Mert KPRC(mrtkprc@gmail.com) Sayfa 7 / -206- 3-)Operatrler(Operators) : Bir ileme yol aan ilem sonrasinda bir deger retilmesini yol aan +,-,*,/ vb. gibi atomlara operatr denir. 4-)Sabitler(Literals/constants) : Dogrudan yazdigimiz sayilara sabit denir. 5-)Stringler(strings) : "Merhaba C# tek bir atomdur. iki tirnak arasindaki kavramlar her zaman tek bir atomdur ve bunlara string denir. 6-)Ayralar (Delimeters/Punct..) : Bunlarin diinda kalan her eye, ifadeleri birbirinden ayiran iaretlere ayira denir. Misal : ;(Noktal Virgl) Anahtar Notlar : ! (Exclamation mak) (Single quote) (Double quote) (caret) + (lu!) "(minu!) #(A!teri!k) $(Sla!h) %(&ack Sla!h) '(Amer!an() )(ie) ()*+,arenthe! -. (Square &racker) /0 (&race) 1 (un(er !crore) 2 (le!! than) +(greater than) 3 (erio() : (colon) 4 (!emi colon) 5(at) 6 (kurt7uk$8il(a) 9(:ue!tion mark) ; (Dollar Sign) <(,ercent) 333(elli!e!) MERHABA DNYA PROGRAMI Ekrana merhaba dnya programi yazan programin iktisi: namespace CSD { class App { public static void Main() { System. Console. WriteLine(Merhaba Dnya!)" # 7 Mert KPRC(mrtkprc@gmail.com) Sayfa 8 / -206- # # 3.Hafta 1.Gn (18 Haziran 2011) Merhaba Dnya programinin atomlari ; namespace,CSD,class ,App, {,public,static ,void,Main,(,),},System,.,Console,.,WriteLine,(,Merhaba Dnya,),;,},},} CSharp Program Nasl Derlenir ? Yazilmi bir C# programi komut satirinda yle derlenir? csc <program ismi> rnegin : csc Sample.cs Boluk Karakterleri(White Space) : Klavyeden boluk duygusu oluturmak iin boluk karakterlerine; boluk karakterleri (white Space denir).Space ,Tab,Entera bunlar balica boluk karakterleridir.Tab karakteri; sadece bir karakterdir o karakterin ismide Tab karakteridir. Taba basildiginda ka boluk ziplayacagi standart bir ey degildir ne kadar ziplayacagi kullanilan program iinde degitirilebilinir. C Sharpn Yazm Kural: 1-) Atomlar arasinda istenildigi kadar boluk karakteri birakilabilinir. 2-) Atomlar istenildigi kadar bitiik yazilabilir. Fakat anahtar szckler ve degikenler arasinda en az bir boluk karakteri bulundurulmalidir. Derleyicilerin Hata Mesajlar: Derleyiciler eitli problemlerle karilatirildiginda bize hata mesajlariyla durumdan haberdar eder. Derleyiciler hata mesajlari 3 blme ayrilir... 1-)Uyarlar (Warning) .exe dosyasini olumasini engellemeyecek; koddaki olasi mantik hatalari iin verilmektedir. Uyarilar programci tarafindan kesinlikle dikkate alinmalidir. rnek int a; diye bir degiken tanimladik eger kullanmadiysak uyari aliriz bu degikeni kullanmadiniz diye. 2-) Gerek Hatalar (Errors) Bunlar .exe kod olumasini engelleyecek derecede ciddi sentaks hatalarini ifade eder. Bir programda, bir gerek hata varsa bile kod derlenemez yani.exe dosya oluturulamaz! 3-) lmc Hatalar (Fatal Error) Derleme ileminin devamini bile engelleye bilen ciddi hatalardir. Genellikle sistemdeki problemlerden kaynaklanir. rnegin; bellegin yda diskin yetersiz olmasi. Hatalarin, olasi yerleri derleyici tarafindan tespit edilir. Bir hata numarasi ve ismiyle kullaniciya bildirilir. *Hata mesajlarin verili biimi derleyiciden derleyiciye degiebilir. Merhaba Dnya Programnn Aklamas : Bir Csharp programi kabaca isim alanlarindan ; isim alanlari siniflardan; siniflarda metotlardan oluur... Anahtar Notlar : 8 Mert KPRC(mrtkprc@gmail.com) Sayfa 9 / -206- <........> (Mutlaka Yazilmali) [..........] (Ister yaz ister yazma-opsiyonel) Programlama dillerin sentaksi; tipik olarak BNF (Bucks Nour Form) denilen bir notasyonla yada bunun trevleriyle ifade edilmektedir. Ancak biz kursumuzda bu teknigi kullanmayacagiz; biz asal parantez keli parantez teknigini kullanacagiz. Aisal parantez ierisindeki geler mutlaka yazilmali; keli parantez ierisindeki geler ise opsiyoneldir. Bunun diindaki btn atomlar ayni biimde bulundurulmak zorundadir. Anahtar szcklerinde alti izilmektedir. Bir isim alannn(namespace) bildirim ekli yledir: namespace <isim> {
} * Kme parantezi arasindaki blgeye blok denilmektedir. Anahtar Notlar : CSharpda(C++ ve Java da ) /* ..... */ arasinda program parasi derleyici tarafindan dikkate alinmaz. Benzer biimde //.......(Satr sonuna kadar) olan kisimda derleyici tarafindan dikkate alinmamaktadir.Genel gsterimlerdeki //... (Burada baka eyler var ama bizi u an ilgilendirmiyor anlamina geliyor. Bir snf bildiriminin genel ekli yledir : class <isim> { //... } Metotlarn Bildiriminin Genel ekli yledir: [eriim belirleyicisi][static]<geri dn degeri><isim>([parametre bildirimi]) { //... } *Eriim Belirleyicisi aagdaki anahtar szcklerden biri olabilir... *public *protected *private *internal *protected internal. Bir eriim belirleyicisi belirtilmezse private olarak kabul edilir. * Eriim szcg ilerde anlatilana kadar biz hep public kullanacagiz.. * Bir metot statik olabilir yada olmayabilir ; biz imdilik tm metotlari hep statik yapacagiz.... 9 Mert KPRC(mrtkprc@gmail.com) Sayfa 10 / -206- * Program metotlarin birbirini agirmasiyla aliir; programin alimaya baladigi nokta Main metodur. Her programda yalnizca bir tane Main Metodu bulunmak zorundadir. Main metodu herhangi bir sinif alaninda herhangi bir isim alaninda bulunabilir. * Main metodu public olmak zorunda degildir ancak static olmak zorundadr... * Bir CSharp Programi Main metoduyla balar; Main bitince programda biter... * Bir metodun bildirilmesi bizim tarafimizdan yazilmasi denmektedir. agrilmasi ise alitirmasi anlamina gelmektedir. Metot agrmann Genel Biimi yle... [isim alani ismi].[sinif ismi].<metot ismi>([argman ilemi]) * .net `in btn siniflari System isimalani ierisinde bulunmaktadir. Console sinifinin Write Metodu; cursoru yazinin sonunda birakir. WriteLine Metodu ise aagi satirin bainda birakir. Foo Program: Balang namespace CSD { class CSD { public static void Main() {
Test. Other. Foo();
}
} } namespace Test { class Other { 10 Mert KPRC(mrtkprc@gmail.com) Sayfa 11 / -206- public static void Foo() { System.Console.WriteLine("Foo."); } } } BT * Eger metot ayni isim alani ierisindeki baka bir siniftaysa onu agirirken isimalani ismini belirtmek zorunda degiliz fakat belirtmekte bir sikinti olmaz. *Eger metot ayni sinifin ierisindeyse biz onu yalnizca metot ismiyle agirabiliriz. 3.Hafta 2.Gn (19 Haziran 2011) C# TEMEL TRLER. 1 byte = 8 bit; Tr(type); bir degikenin bellekteki ka byte yer kapladigi belirleyen ve onun ierisine hangi aralikta ve formatta bilgi yerletirilecegini anlatan bir kavramdir. Her degikenin bir tr vardir.
* int tr iaretli bir tamsayi trdr: negatif ve pozitif sayilari tutabilir. (Tabi ki siniri erevesinde) 11 Mert KPRC(mrtkprc@gmail.com) Sayfa 12 / -206- * uint tr iaretsiz bir tamsayi trdr. Iaretsiz tr demek yalnizca sifir ve pozitif sayilari tutabilmek demektir. Her tamsayinin birde iaretsiz bir trde vardir. uint tr; int trnn iaretsizidir. * short tr int trnn 2 bytelik kisa biimidir. * long tr; int trnn 8 bytelik trdr. ok uzun iaretli tam sayilari tutabilmektedir. * float lafi floating pointten(kayan nokta) anlamina gelmektedir. CSharpda kullandigimiz float tr (kayan nokta formatinda tutulmaktadir.) *Float tr 4 byte uzunlukta bir gerek sayi trdr. CSharpda gerek sayi trleri zaten default olarak iaretlidir. Bunun ayrica iaretsiz bir biimi de yoktur. *Float trnde 3.basamaktan sonra yuvarlama hatasi (rounding error) hatasi oluabilir. *Gerek sayilarlar ilgili en byk hatalardan biri yuvarlama hatasi (rounding error) olgusudur. Yuvarlama hatasi sayinin kendisinin tam olarak tutulamayip ona yakin bir sayiyla tutulmasiyla oluan bir hatadir. Yuvarlama hatasi her sayida olumaz. Float trnn yuvarlama hatalarina direnci zayiftir. rnegin yuvarlama hatasina sebep olacak bir sayi noktadan sonraki 3.sayida kendini gsterebilmektedir. * Doublein anlami aslinda floatin 2 kati demek istenmektedir. * Double tr 8 byte uzunlukta bir gerek sayi trdr. Bu trn yuvarlama hatalarina direnci iyidir ve pratikte bu nedenden dolayi fazlaca tercih edilmektedir. *Decimal tr; mantis kismi 28 digite kadar olan noktali sayilari hi yuvarlama hatasi ortaya ikmadan tutabilmektedir. *char tr Unicode karakter tablosunu kullanir ve 2 byte yer kaplar. Aslinda karakterler sayilarla temsil edilmektedir. C# char tr aritmetik ilemlere sokulabilir adeta iaretsiz bir tamsayi trdr. *Decimal tr dogal bir tr degildir. Yani; iki decimal sayi zerinde ilem dogrudan ilemcinin elektrik devreleriyle yapilmaz. Yapay bir biimde bir algoritmayla yapilmaktadir. Bu neden biz bu tr float ve double yerine her yerde kullanilmamalidir. zellikle finansal alanlardaki gibi hi bir hatanin olmadigi yerde kullanilmamalidir. *bool tr; dogru yanli bilgisini tutan bir trdr. * C # en ok kullanilan tam sayi trdr int; en ok kullanilan gerek sayi tr de doubledir. Programci nce bunlari tercih etmeli, zen bir durum varsa baka trleri tercih etmelidir. Anahtar Notlar: **Gerek sayilar kesinlik if ierisinde tam sayilarla karilatirmamalidir. *** Reflector adli program decompiler programidir. Yani .exe formatini source koda evirmektedir. *** DisSharp ya da Salamender adli programda ayni ekildedir. BLDRM Bir degikenin kullanilmadan nce derleyicilere tanitilma ilemine bildirim denir. Tm degikenler kullanilmadan nce bildirilmek zorundadir. Bildirim eklinin genel bildirimi aagidaki gibidir: <tr> <degiken listesi> rnegin: int a; ulong b,c,d; double x,y; *Degiken isimleri sayisal karakterle balatilamaz ve boluk ieremez. C # byk harfler ve kk harfler tamamen farkli karakter olarak ele alinmaktadir. Yani C# case sensitive(kk byk harf duyarli) bir programlama dilidir. C#da standart olarak maksimum olarak degiken ismi verirken bir limit yoktur. Bu konu derleyicileri 12 Mert KPRC(mrtkprc@gmail.com) Sayfa 13 / -206- yazanlarin istegine birakilmitir. * Degiken isimlendirmesinde tm Unicode karakter (rnegin trke karakterler) kullanilabilinir. Degiken isimleri iyi bir teknik iin anlamli, telaffuz edilebilir ve mmknse kisa tutulmalidir. Bir bildirim bir metotun iinde yapilabilir ya da sinif bildiriminin ierisinde yapilabilir. Metot ierisinde bildirilen degikenlere yerel degikenler; sinifin iinde bildirilirse sinifin veri elemanlari denir. Console sinifinin Write ve WriteLine metotlariyla biz herhangi bir degikenin ierisinde ki degeri ekrana yazdirabiliriz. Bir degikene bildirim sirasinda deger atanabilir. Buna ilk deger verme (initialization) rnegin: int a=100,b,c=20; Bir degikene henz deger atamadan onun ierisindeki degeri alabilecek ekilde bir ifade kullanamayiz. YEREL DEGKENLERN FAALYET ALANLARI Bildirilen bir degikenin kullanilabilecegi program alani faaliyet alani(scope) denilmektedir. Bir metot ierisinde istedigimiz kadar ayrik ya da bitiik blok aabiliriz. Bir yerel degiken ancak bildirimden sonra ve bildirildigi blokta ve blogu kapsadigi blokta kullanilabilir. C# ayni blokta ve i ie yerel bloklarda ayni isimli degikenler bildirilemez. Fakat ayrik bloklarda ayni isimleri degikenler bildirilebilir. nce i blokta sonra di blokta ayni isimli degikenlerin bildirilmesinde yasaktir. rnegin: { { int a; } int a; //error } *** C #i ie metot bildirilemez. Her metot digerinden bagimsiz olarak bildirilmek zorundadir. METOTLARIN GER DN DEGERLER Bir metot agrildiginda metot alitirilir, metotun alimasi bittiginde bir deger elde edilir. Bu deger aritmetik ilemlere sokulabilir buna metotun geri dn(return value) degeri denir. rnegin: x = Foo()*2; Metotun geri dn degerinin tr; metotun isminin sol tarafina yazilmalidir. 13 Mert KPRC(mrtkprc@gmail.com) Sayfa 14 / -206- rnegin : public static int Foo() { } Anahtar Notlar : Degikenlerin operatrlerin ve sabitlerin her bir bileimine ifade(expression) denir. rnegin: x,x+y,x+y-3,10. TEK BAINA BIR OPERATR IFADE DEGILDIR. Metotun geri dn degeri return anahtar szcg ile dndrlr. Return deyiminin genel biimi yledir. return [ifade]; Return deyimi ayni zamanda metotuda sonlandirmaktadir. * Metotta ne ierik varsa yapilmaya devam ediliyor, return degeri ekstra bir degerdir sadece geri dnen deger ilenecek diye bir dnceye girmemek gerekir. Metotun geri dn degeri kullanilmak zorunda degildir. Yani biz metotu agirip geri dn degerinden hi faydalanmayabiliriz. * Metotun geri dn degeri yerine void yazilirsa; bu durum metotun geri dn degerine sahip olmadigi anlamina gelmektedir. void metotlarda return anahtar szcg kullanilabilinir fakat yanina ifade yazilamaz. void bir metot da hi return kullanilmayabilir bu durumda metot ana blok bittiginde sonlanir. * Metotun bir ger dn degeri varsa biz return deyimini kullanmak zorundayz aksi halde error oluur. Metotun btn mmkn aklarnda metotun return aklar grlmek zorundadr. Metotun geri dn degeri nce derleyici tarafindan yaratilan geici bir degikene aktarilir. Sonra oradan alinarak kullanilmaktadir. Kullanim bittikten sonrada bu geici degiken yok edilmelidir.
rnegin int result; result = Foo()*2; public static int Foo() { int a=10,b=20; return a+b; } burada aslinda unlar olmaktadir. 1-) Foo() metodunu alitir. 2-) Geici degikeni yarat 3-) temp eittir geri dn degeri.. 14 Mert KPRC(mrtkprc@gmail.com) Sayfa 15 / -206- 4-)result = temp*2; 5-)geici degikeni yok et... Aslinda metotun geri dn degerinin tr yaratilacak geici degikenin trn belirtmektedir. Aslinda return ilemi de gizli bir atama ilemidir. Metotun geri dn degerinin void olmasi, geri dn degeri iin geici bir degikenin oluturulmayacagi anlamina gelir. 4.Hafta 1.Gn (25 Haziran 2011) METOTLARIN PARAMETRE DEGKENLER public static int Foo(PARAMETRE DEGIKENLERI){ } * Bir metot parametre degikenlerine sahip olabilir, metotun parametre degikenleri bildirim sirasinda parametre parantezinin iinde bildirilir. rnek : public static int Foo(int a,long b){ } HATALI OLMAZ : public static void Bar(int a,b){ } // ayni degiken trnde de olsa parametreler hepsini ayri ayri belirtmek zorundayiz... * Parametreli metotlar agirilirken parametre sayisi kadar argman kullanilmak zorundayiz. Argman; herhangi bir ifade olur. Parametre bildirirken, argman agirilirken denir. * Parametreli bir metot agrildiginda nce argmanlarin degerleri hesaplanir. Sonra argmanlardan parametre degikenlerine karilikli arama yapilir. En sonunda aki 15 Mert KPRC(mrtkprc@gmail.com) Sayfa 16 / -206- metota geirilir. Metotun agrilmasinda parametre degikenleriyle yapilan gizli bir atama anlamina gelmektedir. * Metotun parametre degikenleri adeta metotun ana blogunun bainda bildirilmi gibi ilem grmektedir. ATAMA YAPILAN YERLER: 1-) a=b (bizim her zaman yaptigimiz atama) 2-)return ile 3-)Metot agirirken yapilan atama 4-)Ilerde grecegiz... Anahtar Notlar: C # `da atama ilemlerinde kaynak ve hedef trler farkli olabilir. Bu konu ileride ele alinacaktir. Fakat imdilik biz bunlarin trlerini ayni yapacagiz. BAZI MATEMATKSEL METOTLAR * .Nette bazi matematiksel ilemleri yapan System.Math sinifi vardir. - Sqrt metodu argman olarak aldigi sayinin karekkn alir. public static double Sqrt(double d) - Pow metodu kuvvet almakta kullanilir. public static double Pow(double x,double y) - Log metodu e tabanina gre, Log10 metodu 10 tabanina gre logaritma almakta kullanilir.
- Round metodu; belli bir basamaktan itibaren yuvarlama yapmaktadir. public static double Round(double value, int digits) *** Metot 2.parametreyle belirtilen miktarda noktadan sonra basamak birakacak ekilde yuvarlama yapar. Yuvarlama sayisinda ki son basamaginin tek ve ift basamagina bagli olmakla beraber ayri strateji uygulanir. - Exp metodu; e zeri x ilemini yapmaktadir. public static double Exp(double d) - Sin,Cos,Tan,Asin,Acos,Atan; metotlari trigonometrik hesaplar yapar. Ancak metotlarin parametresi radyan cinsindendir. - Abs; metodu mutlak deger almak iin kullanilir. - Ceiling ve Floor; metotlari Tavan ve Taban ilemlerini yapar. - Truncate; metodu sayinin noktadan sonraki kismini atar.
KLAVYEDEN DEGER OKUMAK Klavyeden T trnden deger okuyabilmek iin u kalip kullanilir. T tr demek ( Herhangi bir tr anlamina gelmektedir) T.Parse(System.Console.ReadLine()); 16 Mert KPRC(mrtkprc@gmail.com) Sayfa 17 / -206- rnek : int a; a = int.Parse(System.Console.ReadLine());
WRTE ve WRTELNE METOTLARININ PARAMETRK KULLANIMI Write ve WriteLine metotlarinda ilk argman bir string ise buradaki kme parantezi n biimindeki kaliplar ile ekrana yazdirilir. Bunlar yer tutucudur. Bunlarin yerine iki tirnaktan sonraki degerleri yazdirilir. Iki tirnaktan sonraki ilk argmanin index numarasi 0dir. int a=10,b=20; System.Console.WriteLine("a = {0} b={1},a,b); SABTLER: Dogrudan yazilmi sayilara sabit denir. Ingilizcede literal diye gemektedir. Sadece degikenlerin degil sabitlerinde bir tr vardir. Sabit kurallari yledir : 1-)Sayi nokta iermiyorsa ve sonunda bir ekte yoksa sayi int,uint,long,ulong(sras nemli) trlerinin hangisinin trne giriyorsa sabit o trdendir.rnekler aagidaki gibidir. 123 -> int 3000000000 -> uint 5000000000 -> long 2-)Sayi nokta iermiyorsa veya sayinin sonunda L veya l( kk L harfi) varsa sabit sirasiyla long,ulong(sras nemli) trlerinden hangisini sinirlarin iersinde ilk kaliyorsa o trdendir. 100L -> long 0 -> int 0L -> long 3-)Sayi nokta iermiyorsa ve sayinin sonunda u yada U varsa; sabit uint,ulong(sras nemli) trlerinden hangisinin sinirlari ierisinde ilk giriyorsa o degerdir. 100u -> uint 5000000000 -> ulong 4-)Sayi nokta iermiyorsa ve sayinin sonunda ul yada lu son eki varsa (u ve l `ler kk yada byk olabilir) sabit ulong trdendir. Anahtar notlar: Yukaridaki maddelerde diger sayi ulong trlerinin sinirinin ierisindede degilse sistem hata verir. 5-)Sayi nokta ieriyorsa ve sonun hibir ek yoksa ya da sayi nokta iersin ya da iermesin sonun kk harf d ya da byk harf D varsa sabit double trdendir. 12D -> double 12.3 -> double 12.3D -> double 17 Mert KPRC(mrtkprc@gmail.com) Sayfa 18 / -206- *** Pek ok dilde noktanin sagina bir ey yazmamak sifir yazmi kabul edilir. Dolayisiyla 12. gibi bir sayi geerlidir ve double trdendir. C# bu say geersizdir. Ancak, . 3 gibi bir sayi geerlidir ve 0.3 anlamina gelmektedir. 6-)Sayi nokta iersin ya da iermesin sayinin sonunda kk harf f yada byk harf F varsa sabit float trndendir. 5F -> float 5.2F -> float 7-)Sayi nokta iersin ya da iermesin sayinin sonunda kk harf m ya da byk harf M varsa sabit decimal Trndedir. 8-)true ve false anahtar szckler bool trden sabit belirtmektedir. 9-)bir karakteri tek tirnak ierisine alirsak bu bize char trn belirtir. `k -> char "string -> string *** Tek tirnak ierisindeki karakterlerin sayi kariligi aslinda sayi kariligi vardir. Unicode karakterinin ilk 128 karakterlerinin kariligi ASCII Tablosuyla aynidir. *** Bazi basilamayan non-printable tek tirnak iersinde nce bir ters bl sonra bir karakter bileeniyle ifade edilmektedir. `\a -> alert `\b -> backspace `\f -> form feed `\n -> new line `\r -> Bulunan satirin baina getirilir. carriage return `\t -> tab `\v -> vertical tab rnegin; System. Console. WriteLine("c:\temp\alert.dat); // yazdik diyelim alacagimiz karilik aagidaki gibidir. c: empler.dat // Dikkat edersek bir tab boluk grd yazimiz ve bilgisayarimizda bip sesi geldi *** Ters bl karakterleri iki tirnak ierisinde de kullanilir *** Ters bl iaretine escape sequence karakteri denir. *** \ iaretine belirtmek iin \\ eklinde belirtiliir. ***Tek tirnak karakterini yazdirma iinde char ch =\ *** Tek tirnak ierisinde ift tirnak, ift tirnak ierisinde de tek tirnak dogrudan yazilabilir. Fakat istenirsede ift tirnak karakterinin kendisi ` \ eklinde yazilir 10-)C#da short,ushort,byte,sbyte trnden sabit kavrami yoktur.... 4.Hafta 2.Gn (26 Haziran 2011) OPERATRLER Bir ileme yol aan, o ilem sonrasinda bir deger olumasini saglayan atomlara operatr denir. 18 Mert KPRC(mrtkprc@gmail.com) Sayfa 19 / -206- Operatrler 3e ayrilir; 1-)levlerine Gre: * Aritmetik Operatrler(Arithmetic Operatr) * Karilatirma Operatrleri(Comprassion op) * Mantiksal Operatrler(Logical Op) * Bit Operatrleri(Bitwise Operatrler)(Uygulama 1 kursunda anlatilacak...) * zel Amali Operatrler(Special purpose) 2-)Operand Saylarna Gre Snflandrma Operatrn ileve soktugu ifadelere operand denir... * Tek Operandli Operatrler(Unary)rnek: ! * Iki Operandli Operatrler (Binary)rnek: + * operandli operatrler(Ternary op.)rnek: a ? b : c
3-)Operatrn Konumuna Gre * Ara operatr (infix)rnek: a + b * nek operatrler(Prefix) rnek: !a * Son Ek Operatrleri (Postfix)rnek:Foo() Bir operatr teknik olarak tanimlayabilmek iin bu siniflanma biimde nereye dtgn belirtilmesi gerekir. rnegin : " \ operatr iki operandli araek bir aritmetik operatrdr.(Binary-infix-aritmethic op.) : ! operatr tek operandli n ek bir mantiksal operatrdr.(Unary-prefix- logical op.) OPERATRLER ARASINDAK NCELK LKS(Precedency) a = b+c * d; Yapilan Ilemin Sirasi ve Atanii... i1 = c*d; i2 = b+i1; i3=a=i2; Operatrlerin arasindaki ncelik ilikisi operatrlerin ncelik tablosu adindaki tabloda belirlenir. Tablodaki ayni satirdaki ayni ncelik ilemlerine, sttekiler alttakilerden daha nceliklidir. ***ncelik tablosu satirlardan oluur, st satirdakiler alt satirdakilerden daha nceliklidir, ayni satirdakiler eit nceliklidir. Eit ncelikli operatrler; ifade ierisindeki konumlara gre soldan saga yada sagdan sola eit nceliklidir. rnegin: () soldan-saga * / soldan -saga + - soldan-saga = sagdan-sola 19 Mert KPRC(mrtkprc@gmail.com) Sayfa 20 / -206-
arp,Bl,Art ve Eksi operatrleri(* / + -) Iki operandli ara ek aritmetik operatrleridir. Temel drt ilemi yaparlar. YZDE OPERATR (%) Iki operandli ara ek aritmetik operatrdr. Mod ilemi yapar. Bu operatr soldaki operandin sagda ki operanda blmnden kalani verir. Yzde operatr(%) ncelik tablosunda arpi ve bl operatryle ayni ncelikte soldan saga operatrdr. () soldan-saga * / % soldan -saga + - soldan-saga = sagdan-sola
ARET + ve ARET - OPERATRLER Bunlar tek operandli n ek aritmetik operatrlerdir. Iaret - operatr operandi negatifin retir. Iaret arti operatr ise operandi ile ayni degeri retir. Iaret arti ve iaret eksi operatrleri ncelik tablosunun ikinci dzeyinde sagdan sola ve grupta bulunurlar.
Anahtar Notlar: Derleyici nce kaynak kodu atomlara ayirir sonra atomlari baka bir modle ileterek programin sentax geerliligini kontrol eder. Derleyicilerin bu kaynak kodunu atomlara ayiran ilk modlne scanner, lexical ya da lexical analyzer denilmektedir. Scanner modl boluklara ayrilmami karakterler grdgnde en uzun karakter diziliminden atom yapmaya alimaktadir. Dolayisiyla a>=b gibi bir ifade biimde aagidaki gibi atomlarina ayrilir; a >= b 20 Mert KPRC(mrtkprc@gmail.com) Sayfa 21 / -206- ++ VE -- OPERATRLER ++ operatrne Artirma (increment) denir -- operatrne Eksiltme (decrement) denir *** Bu operatrler tek operandli hem n ek hem son ek olabilirler. ++ operatr operandin degerini bir arttirmak iin -- operatr bir eksiltmek iin kullanilmaktadir. ++ ve - operatrleri ncelik tablosunun ikinci dzeyinde sagdan sola grupta bulunur. () soldan-saga + - ++ -- sagdan-sola * / % soldan -saga + - soldan-saga = sagdan-sola
***Bu operatrlerin n ek ve son ek kullanimlarin anlamlari farklidir her iki durumda da operatr tablodaki ncelikle yapilir sonraki ileme n ek kullanimda arttirilmi veya eksiltilmi deger son ek kullanimda arttirilmami veya eksiltilmemi deger sokulur. int a = 3; int a=3 int b; int b b= ++a*2; b=a++*2; // a=4,b=8 //a=3,b=6 *a artirilarak ileme sokulur *ilem yapilir ondan sonra arttirilir
*** ++ ve - - operatrnn operandlari degiken olmak zorundadir. *** C#da ++ ve - - operatrleriyle kullanilmi degikenin ayni ifade bir daha gzkmesi tanimsiz davrania yol amaz. Fakat bu tr ifadelerden kainmak gerekir. rnek : b = ++a + a; KARILATIMA OPERATRLER C # `da toplam 6 karilatirma operatr vardir. Bu operatrlerin hepsi iki operandli ara ek operatrlerdir. Btn karilatirma operatrlerin hepsi aritmetik operatrlerinden dk nceliklidir. () soldan-saga + - ++ -- sagdan-sola * / % soldan -saga + - soldan-saga == != sagdan sola = sagdan-sola
21 Mert KPRC(mrtkprc@gmail.com) Sayfa 22 / -206- *** Karilatirma operatrleri bool trden deger retir. *** C# bool tr hi bir trle ileme sokulamaz sadece bool tryle ileme sokulur. MANTIKSAL OPERATRLER C# 3 mantiksal operatr vardir. Bunlar ! , && , || ** && ve || operatrler iki operandli ara ektir. ** ! operatr tek operandli n ek operatrdr. ** C# mantiksal operatrlerin operandlari bool trden olmak zorundadir.
A B A && B A || B true true true true true false false true false true false true false false false false
A !A true false false true
** nlem operatr tablonun ikinci dzeyinde bulunur, && ve || karilatirma operatrlerinden daha dk grupta yer alir. () soldan-saga + - ++ -- ! sagdan-sola * / % soldan -saga aritmetik operatrler + - soldan-saga == != sagdan sola && soldan saga || soldan saga = sagdan-sola
** Genellikle mantiksal operatrler karilatirma operatrleriyle kombine edilerek kullanilir. KAAN HOCANIN INGILIZCE KITAP NERISI.. =>Kitap nerisi : Programming in the Key of C # , Thinking in C#, C# Primer => www.library.nu (Kitap Sitesi nerisi)
MANTIKSAL OPERATRLERN KISA DEVRE ZELLG 22 Mert KPRC(mrtkprc@gmail.com) Sayfa 23 / -206- && ve || operatrlerin kisa devre zelligi vardir.(short-circum). ** && ve || operatr nce sol tarafi tamamen yapilir bitirilir. Sag tarafinda ncelikli operatr bulunsa bile duruma gre sag taraf yapilir. && operatrn sol tarafindaki ifade false ise sag tarafindaki ifade hi yapilmaz. True ise yapilir. ubuk ubuk operatrndeki sol tarafindaki ifade true ise sag taraf yapilmaz. *** Eger tm ilemlerin yapilmasi isteniyorsa bit dzeyinde tek anpersan(&) ve tek ubuk iareti kullanilabilir. *** C # da tek & ve tek | operatrleri aslinda bit dzeyinde ilem yapan operatrlerdir. Bit dzeyi operatrlerin ksa devre zellikleri yoktur. Bu operatrler bool operandlariyla da kullanabilmektedir. Bu durumda adeta kisa devre zelligi olmayan or ve and operatrleri yerine gemektedir. SONU OLARAK; C# & operatr && operatrn, | operatr || operatrnn ksa devre zelligi olmayan biimi olarak kullanlabilmektedir. int a=3,b=4; bool result; result = a>10 && ++b <Foo(); System.Console.WriteLine("a = {0} b = {1},a,b); // Ilemin ekrana a = 3 b = 4 yazar; 5.Hafta 1.Gn (02 Temmuz 2011) && ve || operatrleri ayni ifade ierisinde kullanildiginda soldaki operatrn sol tarafi nce yapilir. (Bu operatrler ncelik tablosundaki sirada belirtilmi eklinde yapilsa da ayni sonu ikar).Duruma gre diger operatrler yapilmaktadir. ATAMA OPERATR Atama operatr iki operandli ara ek operatrdr. Sol tarafindaki operandin degiken belirtmesi gerekir. Atama operatr de bir deger retir. Atama operatrnde retilen deger sol tarafa atanmi degerdir. Atama operatrnden elde edilen rn kullanmak zorunda degiliz. a=b=3; Atamasinin aiklamasi aagida yer almaktadir. i1 : b=3=>3 i2 : a=i1; y=(x=5)+3; i1: x=5 =>5 i2: i1+3=>8 i3: y=i2=>8 *** Metotlarin geri dn degeri degiken belirtmez... Foo() = 3; // ERROR 23 Mert KPRC(mrtkprc@gmail.com) Sayfa 24 / -206-
ETKSZ FADELER 2 + 3; // Error Bazi ifadeler ya da operatrler programda durum degiikligine yol amayabilir Bir ilemin yapilmasi programda hi bir durum degiikligine yol amiyorsa C # `da error oluturmaktadir. Burada + operatrnn yol atigi bir durum degiikligi yoktur. Yani bu kod kaldirilirsa da programda hi bir degiiklik oluturulmaz. Etkisiz bir koddur. NOKTALI VRGLN LEV(;) Noktali virgl ifadeleri sonlandirarak onlari birbirinde ayirmaktadir. Iki noktali virgl ifadesinde ifade bagimsiz olarak ayritirilir. Eger noktali virgl unutulursa nceki ifade ile sonraki ifade tek bir ifade olarak degerlendirilir ve error verir. DEYMLER Ifade = > Expression Deyim => Statement Deyimler programlama dillerinde alima birimleridir. Program deyimlerin alitirilmasiyla alimaktadir. DEYMLER 5 GRUBA AYRILABLR. 1-)BASIT DEYIMLER(Simple Statements) Bir ifadenin sonuna noktali virgl konursa ifade deyim olur buna basit deyim denir. rnegin a=10; b = a + 20; ifade; => Deyim 2-)BILEIK DEYIMLER(Compound Statements) Bir blok iersinde sifir tane yada daha fazla deyim yerletirilirse blogun tamamida bir deyim olur. Buna bileik deyim denir. { a=3; b=4; c=5; { 24 Mert KPRC(mrtkprc@gmail.com) Sayfa 25 / -206- d=6; e=7; } } f=8; // YUKARIDAK KODA BAKTIGIMIZ ZAMAN K DEYM VARDIR.
3-)KONTROL DEYIMLERI(Control Statement) Program akii zerinde etkili olan if, for, while gibi deyimlere kontrol deyimi denir. Bunlar tek bir deyimdir. 4-)BILDIRIM DEYIMLERI(Declaration Statement) Bildirim yapmakta kullanilan deyimlerdir. rnegin: int a,b,c; double x,y,z; 5-) BO DEYIMLER(Null statement) Solunda ifade bulunmadan tek baina kullanilan noktali virgllere bo deyim denir. a=3; ; ; Ilk noktali virgln oluturdugu basit deyim, sonraki noktali virgller ise bo deyimi oluturur. *** BO DEYIM KULLANILABILINIR. BUNUN BIR ETKISI YOKTUR. * Her deyimin alitirilmasi sirasinda bazi ilemler gerekletirilmektedir. Bir basit deyimin alitirilmasi demek, ilgili ifadenin yapilmasi demektir. Bileik deyimin alitirilmasi demek; onu oluturan ifadelerin teker teker alitirilmasi demektir. Bir kontrol deyiminin alitirilmasi sirasinda ne olacagi ileride ele alinacaktir. Bir bildirim deyiminin alitirilmasi bildirilen degikenler iin yer almasi demektir. Bir bo deyimin alitirilmasi sirasinda hi bir ey yapilmaz... *** Aslinda metotlar birer bileik deyim belirtmektedir. Bir metotun agrilmasi demek metotun belirttigi bileik deyimin alitirilmasi demektir. O halde bir C # ` programinin alimasi demek Main metodunun alimasi demektir. KONTROL DEYMLER F DEYM if(<bool trden ifade>) 25 Mert KPRC(mrtkprc@gmail.com) Sayfa 26 / -206- <deyim> else <deyim> *** If deyiminde else kisminin olma zorunlugu yoktur. * If deyimin kendiside diaridan bakildiginda tek bir deyimdir. If anahtar szcgnde sonra derleyici parantezler ierisinde bool trden bir ifade bekler. If deyimin dogruysa yanlisa kismi vardir. Dogruysa yanlisa da tek bir deyim bulunmak zorundadir. Eger birden fazla deyim bulundurulmak isteniyorsa bloklama yapilarak bileik deyim eklinde ifade edilmelidir. If deyimi yle aliir: If ifade parantezi iersindeki deger hesaplanir. Bu deger true ise yalnizca dogruysa kismindaki deyim false ise yalnizca yanli kisminda ki deyim alitirilir ve if deyimi sonlandirilir. If deyimin yanlisa kismi bulunmayabilir. Bu durumda else kismi olmayan if sz konusudur.. Derleyici if deyiminin dogruysa kismindan sonra else anahtar szcgnn kullanip kullanilmadigina bakar eger else yoksa bunun else kismi olmayan bir if olduguna karar verir. rnegin:
if(ifade1) ifade2; ifade3; ** Burda diaridan bakildiginda 2 deyim vardir. ** Bazen if deyiminin yanlilikla bo deyimle kapatilmasiyla karilanmaktadir. Elde edilen durum geerli oldugu halde programcinin istedigi gibi degildir. rnegin : if(ifade1); ifade2; *** If deyiminin dogruysa kisminda baka bir if deyimi bulunabilir rnegin if(ifade1) if(ifade2) { ifade2; ifade3; } else ifade5; else ifade6; ifade7;
*** Iki if deyimine kari tek bir else varsa else kismi iteki if deyimine ilikindir. if(ifade1) if(ifade2) ifade3; else ifade4; 26 Mert KPRC(mrtkprc@gmail.com) Sayfa 27 / -206- Eger bir durumda ditaki if deyimine ilikin olmasi isteniyorsa bilinli bloklama yapilmalidir. rnegin: if(ifade1) { if(ifade2) ifade3; }else ifade4; ****Iki ya da daha fazla karilatirma eger karilatirmalardan biri dogruyken digerlerinin dogru olma olasiligi yoksa bu karilatirmalar ayriktir. rnegin : x==2 x==3 Karlatrmalar ayrktr x>0 x<0 x==0 Fakat: a>0 a>10 => Karilatirmalar ayrik degildir. *** Ayrik karilatirmalar ayri if lerle yapmak kt bir tekniktir. Bunlarin else if ile ifade edilmesi daha iyidir. Kt Olan: if(a==2) { //.. } if() { //... } Iyi Olan : if(a==2) { //... }else 27 Mert KPRC(mrtkprc@gmail.com) Sayfa 28 / -206- if(a==3) { //... } Birden fazla ayri karilatirma sz konusu oldugunda; else if merdiveni kullanilir. if(a==1) ifade1; else if(a==2) ifade2; else if(a==3) ifade3; 5.Hafta 2.Gn (03 Temmuz 2011) VSUAL STUDO IDE'SNN KULLANIMI * Bundan sonra Visual Studio (VS) olarak kisaltilacaktir. * VS daki men isimlerinin sonun . (elipsis) varsa bu yeni bir diyalog penceresi ailacaktir anlamina gelmektedir. VS IDESIYLE SIRASIYLA UNLAR YAPILMALIDIR. 1. Ilk yapilacak ey proje yaratmaktir.Bunun iin File /New / Project seilir. 2. Karimiza New Project penceresi ikar. 3. Burada Project Type VS C# /Windows sekmesinden Template ise Empty Project seilir. 4. Her projenin bir ismi vardir VS, her proje iin ayri bir dizin aar. Projeler tek balarin degil, solution denen kaplarin iersinde bulunur. Bir proje yaratildiginda ayni zamanda bir solution yaratilmaktadir. Proje solutionun ierisine yerletirilmektedir. "Location : kisminda projenin yaratilacagi dizin belirtilir. "Create directory for solution arpilanirsa (checked) solution ve projeler iin ayri dizinler yaratilir. arpilanmazsa ayni dizinin ierisinde organize edilir. Biz arpilamayacagiz(unchecked). 5. Bir Solution yaratildiginda bu solutionu ynetmek iin "Solution Explorer " denen bir pencere kullanilir. Bu pencere View mensnde ailabilir ya da Ara ubugunda uygun simge ile de ailabilir. 6. Artik sira derlenecek kaynak dosyanin proje yerletirilmesiyle gelmitir. 7. Eger yeni bir dosya yaratip proje yerletirmek isteniyorsa Project / Add New Item seilir. Ya da ayni ilem Solution Explorerda project zerine gelerek context (Baglam) menden Add New Item seilerek de yapilabilir. Eger var olan bir dosya proje eklenecekse "Add New Item " yerine "Add Existing Item " seilir. 8. Add New Item dedigimiz zaman bizim ekleyecegimiz "Code Filedir ve kaynak dosyaya herhangi bir isim verilir. Bylece Projeye eklenmi olur. 9. Program yazilir derleme ilemi iin Build /Build Solution yada Build / xxxx(Dosya ismi) seilebilir. 10. Programi alitirmak iin Debug/Start Without Debugging Seilir. (Ksayol tuu : ctrl + F5). 28 Mert KPRC(mrtkprc@gmail.com) Sayfa 29 / -206- 11. Aslinda dogrudan program alitirilmak istenildiginde nce otomatik Compiler Derlemede yapilmaktadir. 12. O halde tek yapilacak ey Ctrl + F5 tuuna basmaktir. 13. Daha nce yaratilmi bir solution amak iin File / Open / Project - Solution seilir. 14. Bunun iin uygun klasre gelinir ve uzantisi .sln olan dosya seilir. 15. Aslinda VS IDE sini sanki bir notepad editrym gibi C# programi yazmakta kullanilabiliriz. Bu Durumda Proje amayiz ve derlemeyi komut satirinda yapariz.
DNG DEYMLER(LOOP) Bir program parasini yinelemeli olarak alitirilmasini saglayan kontrol deyimlerine dng denir. C# dngler gruba ayrilir. 1. while dngleri a. Kontroln Bata Yapildigi b. Kontroln Sonda Yapildigi(do - while dngleri) 2. for dngleri 3. foreach dngleri KONTROLN BADA YAPILDIGI while DNGLER while(<bool trden ifade>) <deyim> *** Derleyici while anahtar szcgnde parantezler ierisinde bool trden bir ifade bekler. *** Dngnn ierisinde bir deyim vardir. Birden fazla deyim bulundurulacak bileik deyim eklinde ifade edilmelidir. while dngs yle alr: while parantezin ierisindeki ifade hesaplanir. Bu deger true ise dng deyimi alitirilir ve baa dnlr. false ise dng deyimi sonlandirilir. **ctrl + j => VS de kodlari yazarken context meny ikartir... **Parantez nceligi aagidaki kodda gsterilmitir. int val;
while ((val= int.Parse(System.Console.ReadLine())) !=0) { System.Console.WriteLine(val*val);
}
29 Mert KPRC(mrtkprc@gmail.com) Sayfa 30 / -206- *** Bazen yanlilikla while dngsnn bo deyimle kapatilmasiyla karilanmaktadir. rnegin : while(i<10); { System.Console.WriteLine(i); ++i; } // ILEMIN SONUCUNDA SONSUZ DNG OLUUR. (infinit loop)
***while parantezi ierisinde son ek bir ++ ya da - - operatr varsa arttirim ya da eksiltim nce yapilir fakat karilatirma ilemine arttirilmami ya da eksiltilmemi ilem yapilir int i = 0;
while (i++ < 10) System.Console.WriteLine(i); Sonu 1 dahil ve 10 dahil [1-10] olan sayilar yazilir. int i = 0;
while (++i < 10) System.Console.WriteLine(i); Sonu 1 dahil ve 9 [1-9] dahil olan sayilar yazilir. *** Burada kk bir ayrinti var. Eger ++ ya da -- NDE olursa bu degerini arttirir ve bundan sonraki ileme arttirilmi ya da eksiltilmi degerinle gir demektir. Peki ++ ya da -- i degikenimizden SONRA yer alirsa ki anlam ise; degerini arttir yada eksilt fakat ondan sonraki ileme girerken arttirilmi ya da eksiltmi degerinle girme degerini koru bundan sonraki ilemlerde bu arttirilmi yada eksiltmi degerini programa yansitirsin demektir. KONTROLN SONDA YAPILDIGI while DNGLER (do while) Dngnn genel biimi yledir. do <deyim> while(<bool turden bir ifade>); rnek : do { System.Console.WriteLine(i); }while(i<10);
30 Mert KPRC(mrtkprc@gmail.com) Sayfa 31 / -206- **** While parantezinden sonraki noktali virgl sentaksin bir parasidir. Bu dngnn digerinden tek farki kontrol noktasinin sonda olmasidir. Kontrol sonda yapildigi dngler, bata yapildigindan ok daha seyrek kullanilir.
do while rnek Kullanm: int i = 0; do { System.Console.WriteLine(i); ++i; } while (i<10);
**** do anahtar szcg derleyicinin kontroln sonda yapildigi anlamasi iin sentaksa eklenmitir. do - while tipik bir rnegi: char ch;
do { System.Console.Write("(e)vet mi (h)ayir mi ? : "); ch = char.Parse(System.Console.ReadLine()); }while(ch != 'e' && ch !='h');
LEML ATAMA OPERATRLER (Compound Assignment Operator ) <op> => Herhangi bir operatr anlamindadir. a <op>=b Aiklamasi ** C# da bir grup art eit , eksi eit , arp eit, bl eit biiminde a <op> eit b olarak zetleyebilecegimiz operatrler vardir. Genel olarak a = a <op> b; ayni alama gelmektedir(a <op>=b;) rnek: int a = 3; a +=2; Ailimi: a = a +2; Sonu => 5; 31 Mert KPRC(mrtkprc@gmail.com) Sayfa 32 / -206- Ilemli atama operatrlerin hepsi ncelik tablosunda sagdan sola atama operatrleriyle ayni yerde bulunur. rnek: i = 2; i *= 3+2; Ilem basamaklari; i1 : 3+2; i2 : i*i1; Sonu => 10; *** Ilemli atama operatrlerinde de bir deger elde edilir. Elde edilen deger sol tarafa atanmi degerdir. int a = 10,b; b = a *= 3+1; 6.Hafta 2.Gn (10 Temmuz 2011) U AN YOK... 7.Hafta 1.Gn (16 Temmuz 2011) Continue Deyimi continue, seyrek kullanilan bir deyimdir. Dng deyimini sonlandirir. Aki sonraki yinelemeye geer. Kullanimi yledir: rnek : namespace CSD { class App {
public static void Main() {
int val;
for (; ; ) {
System.Console.Write("Bir Sayi Giriniz :"); val = int.Parse(System.Console.ReadLine());
if (val==0) 32 Mert KPRC(mrtkprc@gmail.com) Sayfa 33 / -206- { break; }
if (val%2==0) { continue; } System.Console.WriteLine("Karesi {0} ",val*val); }
} } } Continue deyimi sadece dngler ierisinde kullanilabilir. SABT FADELER(CONSTANT EXPRESSON) Yalnizca operatr ve sabitlerden oluan ifadelere sabit ifadeleri denir. Sabit ifadelerin net sayisal degerleri derleme aamasinda belirlenebilir. switch Deyimi switch deyiminin genel biimi yledir. switch deyimi yle aliir derleyici switch parantezi ierisindeki degeri hesaplar... Sonra tek buna eit olan case blmn aratirir. Bulursa akii oraya ynlendirilir. Eger switch parantezi ierisindeki sayisal degeriyle eit olan bir case blm yoksa, fakat switch deyiminin default degeri varsa aki oraya ynlendirilir. Eger default blmde yoksa aki switch deyimine girdigi gibi ikar. Bir switch deyimin de hi case blm olmayabilir. switch (<ifade>) { case <sabit ifade>: //... [break]; case <sabit ifade>: //... [break]; //... [default:] //...; break; } case 1: -> olur case 1+2: ->olur case 1+x:->olmaz rnek sentaks: switch (val) {
case 1: System.Console.WriteLine("Bir"); 33 Mert KPRC(mrtkprc@gmail.com) Sayfa 34 / -206- break; case 2: System.Console.WriteLine("Iki"); break; case 3: System.Console.WriteLine(""); break; default: System.Console.WriteLine("Dier"); break;
}
rnek : namespace CSD { class App {
public static void Main() {
int val;
System.Console.Write("Lutfen Bir Sayi Giriniz : "); val = int.Parse(System.Console.ReadLine());
switch (val) {
case 1: System.Console.WriteLine("Bir"); break; case 2: System.Console.WriteLine("Iki"); break; case 3: System.Console.WriteLine(""); break; default: System.Console.WriteLine("Hibiri"); break;
} } } }
C#da switch deyimiinde aagiya dme (fall through) kurali yoktur. Aki bir case blmnde digerine geerse yani geebilecek durumda ise bu durum error oluturur. Akiin bir case blmnde diger case blmne gemesi iin en tipik break kullanilir. 34 Mert KPRC(mrtkprc@gmail.com) Sayfa 35 / -206- Fakat return deyimi de goto deyimi de hatta sonsuz dng bile bu geii engelleyebilir. switch deyiminin sonundaki case ve default iinde break deyiminin bulunmasi gereklidir. *** switch deyiminin case blmnn sirali olmasi gerekli degildir. *** default deyimi en bata da bulunabilinir. *** Ayni sayisal degeri ait case deyimi bulunamaz... ***Istisna Olarak; eger bir case blmnden sonra hi bir deyim yoksa hemen arkasindan diger bir case blm gelebilir. rnek: case 1: case 2: case 3: System.Console.WriteLine("Bir,iki yada u"); break;
*** Yukaridaki rnegi saglamanin daha pratik bir yolu yoktur. ***C# da aaya doru dme etkisini yaratai!mek i"in goto case ; goto default; i"iminde ya!n#$a switch i"erisinde ku!!an!ai!en% &ki 'eyim da(a )ardr. goto DEYM *** goto deyimi programin akiini koulsuz olarak istedigimiz yere ynlendirmeyi saglar. Aki goto deyimine geldiginde etiket ile belirtilen yere ziplar. Genel Biimi : goto <etiket> <etiket>: int i= 0; REPEAT : System.Console.WriteLine(i); if(i<10) goto REPEAT; rnek (kt olan): int i=0;
REPEAT: System.Console.WriteLine(i); ++i; if (i<10) { goto REPEAT; }
** goto deyiminin kullanilmasi gereken bir ka durum vardir. Bu durumlarda goto kullanilmali bu durumlarda goto kullanilmali diger durumlarda kullanilmamalidir. *** I ie dnglerden ya da dng ierisindeki switch deyiminde tek hamlede ikmak iin goto kullanilabilinir. goto etiketinden sonra en az bir deyim bulunmak zorundadir. *** goto deyimi ters sirada boaltim yapmak iinde siklikla kullanilmaktadir. 35 Mert KPRC(mrtkprc@gmail.com) Sayfa 36 / -206- http://www.codeproject.com/ Microsoftun destekledigi kod sitesi KOUL OPERATR ** Koul operatr adeta if deyimi gibi alian bir operatrdr. operand almaktadir. ifade1 ? ifade2 : ifade3 *** Soru iaretinin solundaki operand bool trden olmalidir. Koul operatrnn operandlari birer ifade olabilir operatr ncelik tablosunda atama ve ilemli atama operatrlerinin hemen yukarisinda sagdan sola grupta bulunmaktadir. .... : ? sagdan sola =,+=,-=,*=,..... sagdan sola Koul operatr yle aliir: Soru iaretinin solundaki ifade hesaplanir. Bu deger true ise sol iareti ile iki nokta st ste arasindaki ifade yapilir. false ise iki nokta st stenin sagindaki ifade yapilir. Bu operatrn rettigi deger bu ifadenin sonularidir. rnegin : result = a>0 ? 10 + 20 : 30 +40; rnek : namespace CSD { class App {
public static void Main() {
int a, result;
System.Console.Write("Bir Sayi Giriniz : "); a = int.Parse(System.Console.ReadLine());
result = a > 10 ? Foo() : Bar(); System.Console.WriteLine(result); } public static int Foo() {
System.Console.WriteLine("Foo"); return 10; } public static int Bar() {
System.Console.WriteLine("Bar"); return 20; } } }
Anahtar Notlar : 36 Mert KPRC(mrtkprc@gmail.com) Sayfa 37 / -206- Artik Yil Tespit Etme Kurali yledir. 400 Tam blnen yillar arttiktir. Ayrica 4 tam blnen ve 100 tam blnmeyen yillarda artik yildir. (leap year) =>=> tarihin hangi gne geldigini bulan programini incele... Koul operatrn diger operatrlerle ayritirabilemesi iin ncelik parantezi gerekmektedir. rnegin : result = (a>0?100:200)+300; *** Burada nce koul operatr yapilir... Koul operatrnden elde edilen 300 le toplanipresult degikenine atanir.... KOUL OPERATRNN KULLANILMASININ TAVSYE EDLDG DURUM VARDUR. 1-) Karilatirmanin sonucunda elde edilecek degeri bir degikene atandigi durumlar... result = a>0 ? 10 :20; (Elenigi) if(a>0) result = 10; else result= 20; 2-)Metot agirirken argman ifadesinde koul operatr kullanilabilinir.... rnegin : Foo (a>0 ? 10 : 20); (Elenigi) if(a>0) Foo(10); else Foo(20); rnegin : System.Console.WriteLine(a>0?Pozitif:Negatif yada sifir); rnegin : Foo(a>b ? a : b); 3-)return ifadelerinde de koul operatryle karilailmaktadir. rnegin : return a > 0 ? 10 : 20; Derleyici soru iaretinin sonuna dogru ilerler, atama ya da ilemli atama grene kadar olan tm ifadeyi koul operatrnn ilk operandi kabul eder. Koul operatr i ie kullanilabilinir. 37 Mert KPRC(mrtkprc@gmail.com) Sayfa 38 / -206- Bu durumda hi bir parantez kullanmaya gerek yoktur. Fakat parantezler okunabilirligi arttirmaktadir. rnegin sayinin en bygn yle bulabiliriz : int max; max = (a>b)?(a>c?a:c):(b>c?b:c); for (int i = 0; i < 100; i++) { System.Console.Write("{0} {1}",i,i%5==4?'\n':' '); } VERLEN TARHN HANG GN OLDUGUNU BULAN PROGRAM (LEAP YEAR - ARTIK YIL) namespace CSD { class App { public static void Main() { int day, month, year; System.Console.Write("Gun:"); day = int.Parse(System.Console.ReadLine()); System.Console.Write("Ay:"); month = int.Parse(System.Console.ReadLine()); System.Console.Write("Yil:"); year = int.Parse(System.Console.ReadLine()); switch (GetTotalDays(day, month, year) % 7) { case 0: System.Console.WriteLine("Pazar"); break; case 1: System.Console.WriteLine("Pazartesi"); break; case 2: System.Console.WriteLine("Sali"); break; case 3: System.Console.WriteLine("arsamba"); break; case 4: System.Console.WriteLine("Persembe"); break; case 5: System.Console.WriteLine("Cuma"); break; case 6: System.Console.WriteLine("Cumartesi"); break; } } 38 Mert KPRC(mrtkprc@gmail.com) Sayfa 39 / -206- public static int GetTotalDays(int day, int month, int year) { int total = 0; for (int i = 1900; i < year; ++i) total += IsLeapYear(i) ? 366 : 365; switch (month - 1) { case 1: total += 31; break; case 2: total += IsLeapYear(year) ? 29 : 28; goto case 1; case 3: total += 31; goto case 2; case 4: total += 30; goto case 3; case 5: total += 31; goto case 4; case 6: total += 30; goto case 5; case 7: total += 31; goto case 6; case 8: total += 31; goto case 7; case 9: total += 30; goto case 8; case 10: total += 31; goto case 9; case 11: total += 30; goto case 10; case 12: total += 31; goto case 11; } total += day; return total; } public static bool IsLeapYear(int year) { return year % 4 == 0 && year % 100 != 0 || year % 400 == 0; } } } 7.Hafta 2.Gn (17 Temmuz 2011) FARKLI TRLERN BRBRLERNE ATANMASI Bir atama ileminde kaynak trler hedef tr birbirinden farkli olabilir. Bu durumda kaynak tr hedef tre dntrlr ve atama yapilir. C# `da T1 trnden T2 trne 39 Mert KPRC(mrtkprc@gmail.com) Sayfa 40 / -206- atamanin mmkn olabilmesi iin T1 trnden T2 trne otomatik dntrmenin (dogrudan dntrmede denilebilir) var olmasi gerekir. C# her tr her tre dogrudan atanamaz eger o trden o tre dogrudan dntrme (implicit conversion) varsa atanabilir. C# da genel olarak kk trde byk tre otomatik dntrme vardir. Fakat byk trden kk tre otomatik dntrme yoktur. rnegin: int, long trne otomatik olarak atanabilir. long tr ise int trne direk atayamayiz. Kk trden byk tre otomatik dntrme kuralinin bazi ayrintilari vardir. 1-)Kk iaretli tam sayi trnden byk iaretsiz tam sayi trne otomatik dntrme yoktur. rnegin: short tr uint trne otomatik atanamaz. nk short tr negatif sayilari da iermektedir. 2-)C# `da tm tam sayi trlerinden gerek sayi trlerine otomatik dntrme vardir fakat, gerek sayi trlerinden tam sayi trlerine otomatik dntrme yoktur. 3-) char tr iki byte iaretsiz bir tam sayi tr olarak dnlmtr. Bu nedenle char trnden ushort ve yukarisina otomatik dntrme vardir. Fakat diger trlerden char trne yoktur. 4-)Ayni trnden iaretli ve iretsiz trleri arasinda otomatik dntrme yoktur. 5-)float ve double trnden decimal trne, decimal trnden de float ve double trlerine otomatik dntrme yoktur. 6-) hi bir trden bool trne, bool trden de hi bir tre otomatik dntrme yoktur. rnekler: float -> double var double -> decimal yok short -> uint yok ushort -> int var long -> ulong yok char -> ulong var 7-) int trden bir sabit ifadesi belirttigi deger hedef trn sinirlari ierisinde kaliyorsa byte, sbyte, short, ushort trlerine otomatik dntrlebilir. byte b; b = 10;// geerli Fakat rnegin: int a = 10; byte b; b = a; // error **Ayrica bu kuralin devami olarak int trden bir sabit ifadesi hedef trn sinirlari ierisinde kaliyorsa uint ve ulong trlerine de atanabilir, long trden bir sabit ifadesi de belirttigi deger hedef trn sinirlari ierisinde kaliyorsa ulong trne otomatik 40 Mert KPRC(mrtkprc@gmail.com) Sayfa 41 / -206- dntrlebilir. Byk trden kk tre atama sirasinda derleyici byk trn ieresindeki degere bakmamaktadir. Yalnizca trlere bakmaktadir. Nihayet hangi trden hangi tre otomatik dntrme oldugunu ifade edilebilir. sbyte -> short,int,long,float,double,decimal byte -> short,ushort,int,uint,long,ulong,float,double,decimal short -> int , long, float,double,decimal ushort -> int,uint,long,ulong,float,double,decimal, int -> long,float,double,decimal uint -> long,ulong,float,double,decimal long -> float,double,decimal ulong -> float,double,decimal char -> ushort,int,uint,long,ulong,float,double,decimal float -> double LEM NCES OTOMATK TR DNTRMELER Programlama dillerinde degikenlerin yada sabitlerin degil her ifadenin bir tr vardir. C# derleyici bir operatrle karilatiginda nce operatrlerin trlerini karilatirir. Eger operatrler ayni trdense sonuta ayni trden ikar.. Eger operandlar farkli trdense Derleyici nce bunlari ayni tre dntrr sonra ileme sokar... Ilem ncesi otomatik tr dntrmelerin zet kurali; kk trn byk tre dntrlmesi ve sonucun byk trden ikmasi. Dntrme geici degiken yoluyla yapilmaktadir. Yani nce byk tr trnde geici bir degiken yaratilir kk tr bunun ierisine atanir ve ilemde bu geici degiken kullanilir sonrada bu geici degiken yok edilir. rnegin : int a; long b; int c;
c = a + b; // error ***Ilem ncesinde kk trn byk tre dntrlmesinin bazi ayrintilari vardir. 1-)Blme ileminde iki operanda tam sayi trlerine eitse sonu tam sayi trlerinden ikar. Sayinin noktandan sonraki kismi atilmaktadir. double result; result = 10 / 4; System.Console.WriteLine(result); // CEVAP 2 ikar ------------------------------------------------------------------------------ double result; result = 10D / 4; System.Console.WriteLine(result); // CEVAP 2,5 ikar 2-) Kk iaretli tam sayi trnden byk iaretsiz tam sayi trne otomatik dntrme olmadigi iin kk iaretli tam sayi tr ile byk iaretsiz tam sayi tr ileme sokulamaz.. 3-) Tam sayi trleriyle gerek sayi trleri ileme sokulursa dntrme her zaman gerek sayi trlerine dogu yapilir. 41 Mert KPRC(mrtkprc@gmail.com) Sayfa 42 / -206- 4-)C#da int trnde kk tam sayi trleri kendi aralarinda ileme sokuldugunda nce her iki operanda int trne dntrlr ve sonu int trnde ikar. rnegin : short+ short, sbyte + ushort,bte +byte ...gibi ilemlerin sonucu int olur. rnegin : byte a = 20, b = 24, c;
c = a + b; // HATA a + b isleminin sonucu int turunden ikacaktir ve byte turune atanamaz...
5-) float ve double tr decimal tryle ileme sokulamaz... 6-)bool tr baka hi bir trle ilem sokulamaz.... 7-)char tr, ushort ve daha byk trlerle ve kendi tryle ileme sokulabilir. 8-) Bir ilemin sonucu eger ilgili trn sinirlari diinda kaliyorsa bu duruma overflow yani tama denir. Tama olutugunda iinde bulundugumuz baglama gre(context) `e gre ne olacagi degimektedir. Eger kontrolsz (unchecked) baglamda bulunuyorsa Exception(Beklenmedik Hata) olumaz. Sayinin say zerinde kirpilma oluur. Eger kontroll(checked) baglamda bulunuyorsak programin alima zamani sirasinda exception oluur. Default baglamin ne oldugu standartlarda derleyiciyi yazanlarin istegine birakilmitir. Microsoft derleyicilerin de kontrolsz baglam (unchecked)dir. Baglam degitirmek iin checked ve unchecked bloklari kullanilir. TR DNTRME OPERATR Otomatik Dntrmeye: implicit (bilinsiz) Tr Dntrme operatryle yapilan: explicit (bilinli) Animsanacagi gibi byk trden kk trde otomatik dntrme(implicit) dntrme yoktur. Bunun nedeni programcinin yanlilikla bilgi kaybina yol aacak ilem yaptirmamaktir. Programci eger isterse tr dntrme denen operatrle bool tr diinda her tr birbirine dntrlebilir. rnegin: long tr int trne dogrudan atanamaz fakat long tr int trne tr dntrme operatryle atanabilir. *** Tr dntrme operatr tek operandli n ek bir operatrdr.(Uniary - prefix ) kullanimi yledir. (<tr>) operand; rnegin : long a = 20; int c;
c = a; // HATA long a = 20; int c;
c = (int)a; // Tur Dnusturme operatrleriyle yapilan sonuc * Tr dntrme operatr ncelik tablosunda ikinci ncelikli sagdan sola bulunur. 42 Mert KPRC(mrtkprc@gmail.com) Sayfa 43 / -206- ** Tr dntrme ilemi sirasinda dntrlecek trnde bir degiken yaratilir. Sonra dntrlecek deger oraya yerletirilir. Ilemde geici degiken kullanilir. Sonrada yok edilir. rnegin : a = (long) b * c; i1 : (long) b i2 : i1 *c; i3:a=i2; rnegin : a = (long) (b*c); a = (double)(long)b * c; i1: (long)b; i2:(double)i1; i3:i2*c; i4:a=i3;
int a = 10, b = 4; double c;
c = (double) a / b;
System.Console.WriteLine(c); Anahtar Notlar: Bir Programi Sonlandirmak iin System.Environment.Exit(); bu metoda biz bir iki kodu vermeliyiz verecegimiz iki kodunun bir nemi yoktur fakat geleneksel olarak baarili ikilar iin 0 baarisiz ikilar iin 0 dii degerler kullanilir. 8.Hafta 1.Gn Dernek Tatili(23 Temmuz 2011) 8.Hafta 2.Gn Dernek Tatili(24 Temmuz 2011) 9.Hafta 1.Gn (30 Temmuz 2011) Tr Dntrme operatryle dntrme yapilirken bilgi kaybi sz konusu olabilir. Bilgi kaybinin nasil oluacaginin eitli kurallari vardir. 1-) Eger kaynak tr ile belirtilen sayi hedef trn sinirlari iersinde kaliyorsa, bilgi kaybi sz konusu olmaz. Kaynak trdeki sayi degiiklige ugramadan hedef tre dntrlr. 2-) Byk tam sayi trnden kk tam sayi trne yapilan dntrmelerde sayinin yksek anlamli byte degerleri atilir. Dk anlamli byte degerleri elde edilir. Elde edilen deger ilkiyle ilgisiz bir grnmde olabilir. Sayinin yksek anlamli bytelari atildiktan sonra elde edilen sayi ters iaretli bile olabilir. 43 Mert KPRC(mrtkprc@gmail.com) Sayfa 44 / -206- 3-)Ayni trn iaretli ve iaretsiz trleri arasinda dntrme yapildiginda sayinin bit kalibi degimez. Yalnizca iaret bitinin yorumlanmasi degiir. 4-)Kk iaretli tamsayi trnden byk iaretsiz tam sayi trne dntrme iki amada gerekleiri. Birinci aama sayi byk trn iaretli biimine dntrlr. Ikinci aamada byk trn iaretli biiminden byk trn iaretsiz biimine dntrme yapilir. 5-)Gerek sayi trlerinden tam sayi trlerine dntrme yapilirken sayinin noktadan sonraki kismi atilir tam kismi elde edilir. Sayinin noktadan sonraki kismi atildiktan sonra sayi hala hedef trn sinirlari ierisine girmeyebilir. Bu durumda kontroll baglam(checked ) sz konusu ise exception oluur. Kontrolsz baglam sz konusu ise (unchecked), dntrmeden elde edilen deger herhangi bir deger olabilir fakat microsoft derleyicileri bu durumda yine sayinin yksekli anlamli byte degerlerini atmaktadir. 6-)Decimal trnden ,float ve double trne dntrme yapildiginda float ve double trnden decimal trne dntrme yapildiginda asil degere en yakin deger elde edilir. 7-)Double trnde float trne dntrme yapildiginda eger kaynak tr ile belirtilen deger hedef trn basamaksal olarak sinirlari ierisine giriyorsa ifade edilebilen en yakin deger ifade edilir. Fakat girmiyorsa arti sonsuz ya da eksi sonsuz sayilar elde edilir. 8-)Herhangi bir trden bool trne, bool trnden herhangi bir tre tr dntrme operatryle bile dntrme yapamayiz... ADRES KAVRAMI Ana bellekler bytelardan olumutur ve entegre devre biiminde imal edilmitir. Bellegin her bir bytena 0 dan balayarak artan bir sayi karilik drlmtr bu sayiya ilgili bytein adresi denilmektedir. Degikenlerde ana bellekte yaratildigina gre onlarinda adresi vardir. Bir bytedan uzun olan degikenlerin adresleri onlarin en dk adres degeriyle ifade edilir. rnegin a 1000 - 1004 arasindaki bir degikenin 1000 biiminde yer ifade edilir. DEGKENLERN MRLER Her degiken belli bir zamanda yaratilir belli bir noktada yok edilir. Yerel Degikenlerin mrleri Yerel Degikenler, programinin akii degikenin bildirildigi noktaya geldiginde yaratilir. Aki degikenin bittigi bloktan iktiginda yerel degikenler yok edilir. Yerel degikenler stack blgesinde yaratilir. stackde yaratim ve yok etme ilemleri ok hizli yapilmaktadir. Bir yerel degikenin blok diinda kullanilamamasinin asil nedeni, onun blok diinda yaamamasindandir. Parametre Degikenlerin mrleri Metotun parametre degikenleri agrildiginda yaratilir metot alitigi srece yamaya devam eder metotun alimasi bittiginde yok edilir. Metotun parametre degikeni de stack blgesinde yer alir. SINIFLARIN VER ELEMANLARI 44 Mert KPRC(mrtkprc@gmail.com) Sayfa 45 / -206- Bir sinif kabaca veri elamanlarindan ve metotlardan olumaktadir. Metotlar ve beri elemanlari statik olabilir yada olmayabilir. Sinifin tm elemanlari birer eriim belirleyici almaktadir. (Bu eriim belirleyici belirtilmezse default, private anlailir fakat biz public kullanacagiz. Anahtar Notlar : Yerel degikenler static olamaz ve onlara eriim belirleyicisi anahtar szckler getirilemez. C#da her sinif ayrica bir trde belirtir. Biz bir sinif belirttigimizde bir trde oluturmu oluruz. O trden bildirim yapabiliriz. Referans Trleri ve Deger Trleri Trler kategori olarak deger trleri (value types) ve referans(refrence type) Trleri olmak zere ikiye ayrilir. Eger bir tr trnden degiken , degerin kendisini tutuyorsa bu tr kategori olakra deger trlerine ilikindir. Br tr trnden degiken , degerin kendisini degilde degerin bellekte bulundugu yerin adresini tutuyorsa o tr kategori olarak referans trleriyle ilikilidir. Bu gne kadar grdgmz tm temel trler ; deger trdr. Snf Trnden Degikenler Btn siniflar , Referans Trleridir. C#da tm sinif trleri referans trlerine ilikindir. Bir sinif trnden bir degiken bildirildiginde o degikenin degiernin kendisini degil bir adres tutar. Bir sinif trnde bir degiken bildlrilgiden yalnizca bir referans bildlrimitir. C#da iiersinden adres tutan degikenlere referans denilmektedir.Sinif nesnesinin kendisi new operatryle yaratilir. new oeperatrnn genel biimi yledir. new <sinif ismi>([arguman listesi]) rnein : new Sample(); * new operatryle sinif nesnesi yaratilir. Sinif nesnesi bileik bir nesnedir. Yani paralardan olumaktadir. Sinif nesnesini oluturan paralar, sinifin statik olmayan veri elemanlaridir. O halde new ilemi yapildiginda yalnizca sinifin statik olmayan veri elemanlari kadar yer ayrilmaktadir. Sinif metotlari ve statik veri elemanlari baka yerde tutulmaktir. Sinifin statik olmayan veri elemanlari sinif nesnesi ierisinde ardiik bir ekilde yer alirlar. new operatr tahsis ettigi nesnenin blok olarak balangi adresini verir. new operatryle elde edilen bu adres ayni trden bir referansa atilmalidir. new operatryle bellegin heap blgesine tahsisat yapilmaktadir. Heap `de sinif nesnesinin tahsis edilmesi greli olarak daha yavatir. Sinif nesnesi sadece bir ablondur. Bildirimde ki degikenler ancak new ilemi yapildiginda yer ayrilir.
class Sample { public int a; public int b; public static int c;
public static void Foo() {
45 Mert KPRC(mrtkprc@gmail.com) Sayfa 46 / -206- //...
} public void Bar() { //... } } Sample s; s = new Sample();
SINIFIN STATK OLMAYAN VER ELEMANLARINA ERM r ` bir sinif trnden bir referanssa da bu sinifin statik olmayan bir veri elamani olmak zere r.a ifadesiyle, r referansini gsterdigi yerdeki nesnenin a elemanina eriilir. Sample s; s = new Sample(); s.a = 10; s.b = 20; ** Btn yerel degikenler ister referans olsun, ister temel trlere ilikin olsun stackde yaratilir. Yani stackdeki referans heapdeki sinif nesnesini gstermektedir. her new ilemi ayri bir nesnenin yaratilmasina sebep olmaktadir. namespace CSD { class App { public static void Main() {
class Sample { public int a; public int b; public static int c; public void Foo() { //... } public static void Bar() { //... }
} }
46 Mert KPRC(mrtkprc@gmail.com) Sayfa 47 / -206-
* Ayni trden iki referans tr birbirine atanabilir iki referans da ayni tr gsteriyor olur. Artik nesnenin elemanlarina hangi referansla eritigimizin bir nemi yoktur. 9.Hafta 2.Gn (31 Temmuz 2011) SINIFIN STATK OLMAYAN METOTLAR *** Sinifin static olmayan metotlari, sinifi static olmayan veri elemanlarini dogrudan kullanabilir. Yani sinifin statik olmayan veri elemanlari, sinif tarafindan ortak biimde kullanilan degikenlerdir. ** Sinifin statik metotlari sinif ismiyle agrilirken, static olmayan metotlari ise o sinif trnden bir referansla agrilir. *** r bir sinif trnden bir referans, Foo ise bu sinifin statik olmayan bir metotu olmak zere agrima ilemi r.Foo() eklinde yapilir. *** static olmayan metotlar ierisinden kullanilan, sinifi statik olmayan veri elemanlari o metotlar hangi referansla agrilmisa o referansin gsterdigi nesnenin elemanlaridir. rnek : namespace CSD { class App {
public static void Main() {
Date date = new Date(); date.Set(10, 12, 2004); date.Disp();
}
} class Date {
int day, month, year;
public void Set(int d,int m, int y) { day = d; month= m; year = y; } public void Disp() {
47 Mert KPRC(mrtkprc@gmail.com) Sayfa 48 / -206- }
}
Anahtar Notlar : Bir sinif bir konuya iliskin faydali islemleri yapan bir veri yapisidir. rnein date gibi bir siniftan tarih islemlerini yapmasini bekleriz. SerialPort gibi bir siniftan Seri Port islemlerini yapmasini bekleriz. Nesne Ynelimli programlamada projeye iliskin tum gerekler nesneler ve kavramlar nce siniflarla temsil edilir. Sonra bu siniflar kullanilarak program yazilir. Sinif bir kavram belirtmektedir. rnein bir aa sinifi belirli bir aaci deil tum aalara iliskin bir kavram belirtmektedir. Fakat biz new operatruyle bu aa sinif turunden bir nesne yaratsak artik spesifik bir aa olusturmus oluruz. Ingilizce bir sinif turunden nesneye class instance yani o sinif kavramindan bir rnek de denilmektedir. *** Sinifin statik olmayan bir metotu sinifin baka bir static olmayan metodunun dogrudan agirabilir. Bu durumda agiran metota hangi referansta agrilmisa agrilan metotunda ayni referansta agrildigina farz edilir. SINIF TRNDEN REFERANSLARIN METOT PARAMETRES OLARAK KULLANMA Bir metotun parametre degikeni bir sinif trnden bir referans olabilir bu durumda metotu, ayni sinif trnden bir referanslar agirmaliyiz. Bylece metot o referansin gsterdigi nesneyi kullanabilir. METOTLARIN GER DN DEGELERNN BR SINIF TRNDEN REFERANS OLMASI Bir metotun geri dn degeri bir sinif trnden bir referans olabilir. Bu durumda return deyiminde ayni sinif trnde bir referansin kullanilmasi gerekir. Tipik olarak metot ierisinde sinif nesnesi new operatryle tahsis edilip onun referansiyla geri dnelebilir.
namespace CSD { class App {
public static void Main() { Date d;
d = Test(); d.Disp(); }
public static Date Test() { Date date = new Date(); date.Set(10, 10, 2004); return date;
}
} class Date { int day, month, year; 48 Mert KPRC(mrtkprc@gmail.com) Sayfa 49 / -206-
public void Set(int d,int m, int y) { day = d; month= m; year = y;
} public void Disp() { System.Console.WriteLine("{0}/{1}/{2}",day,month,year); }
}
}
Anahtar Notlar : Bir metotun ierisinde new operatruyle sinif nesnesi yaratildiinda metottan ikildiinda o metotun ierisindeki tum deiskenler yok edilir.Fakat new operatruyle tahsis edilen metotun ikilsa bile tahsis edilmis olarak kalir. Ta ki p toplayici (Garrabage Collecotr) silene kadar. SINIFLARIN STATK VER ELEMANLARI Sinifin statik veri elemanlarini toplamda tek bir kopyasi vardir. Her new ilemi yapildiginda onlar iin yer alamaz. Program alimaya baladiginda sinifin statik veri elemanlari iin yer ayrilmi durumdadir. Biz programin sonuna kadar onu istedigimiz kadar kullanabiliriz. Sinifi statik veri elamanlarina diaridan erimek iin, referansla degil sinif ismiyle eriilir. *** Sinifin statik veri elemanin kullanmak iin daha nce o sinif trnden nesne yaratmaya gerek yoktur. SINIFIN STATK METOTLARI * Sinifi statik metotlari sinif ismiyle agrilir. Bu nedenle sinifin bir statik metotu ierisinde sinifin statik olmayan veri elemanlari dogrudan kullanilmaz ve statik olmayan metotlar dogrudan agrilamaz. Sinif statik bir metotu ierisinde sinifin statik veri elemanlari dogrudan kullanilabilinir ve statik metotlari dogrudan agrilabilinir. STATK OLAN VE STATK OLAMAYAN METOTLARIN SINIF ELEMANLARI KULLANMASI. * Sinifin statik metotlari yalnizca sinifin statik veri elemanlari dogrudan kullanabilir ve statik metotlarini dogrudan agirabilir. Fakat sinifin statik olmayan metotlari sinifin hem statik olmayan hem de statik olan veri elemanlarini dogrudan kullanabilir ve metotlarini dogrudan agirabilir. Anahtar Notlari: Sinifin elemani demekle, hem veri elemanlari hem de metotlar anlasilmaktadir. Sinifin statik elemanlari denince hem statik veri elemanlari hem de statik metotlar anlasilmakta. Sinifin statik olmayan veri elemanlari denildiinde hem statik olmayan veri elemanlari hem de statik olmayan metotlari anlasilmaktadir. Kimin kimi kullanabildii konusunda , 1-) Sinifin statik metotlari, yalnizca statik veri elemanlarini dorudan kullanabilir. 2-)Sinifin statik olmayan metotlari, sinifin hem statik olmayan hem de olanlarini dorudan kullanabilir. RASTGELE SAYI RETM 49 Mert KPRC(mrtkprc@gmail.com) Sayfa 50 / -206- Rast gele sayi retmek iin rassal olaylarin kullanilmasi gerekir. Bilgisayarlara ancak aritmetik ilemlerde rastgele sayi retiriz. Byle retilen rastgele sayilara sahte rastgele sayilar denilmektedir.(Pseudo random number) System isim alani ierisindeki random sinifi rastgele sayi retmek iin kullanilir. Random sinifinin statik olmayan aagidaki Next metodu() iki deger arasinda rastgele bir sayi reterek onunla geri dner.. public Next(int minValue,int maxValue) minValue dahil , maxValue dahil deildir.
Random sinifin static olmayan Next metodu bize rastgele bir tam sayi vermektedir. Fakat bazi uygulamalar da noktali rastgele sayinin retilmesi istenebilir. Bu durumlarda retilen rastgele tam sayinini st degere blnmesi gerekir. phesiz st degerin yksek olmasi sayinin kalitesini arttirir. 10.Hafta 1.Gn (06 Agustos 2011) METOTU NE ZAMAN STATK YAPMALIYIZ NE ZAMAN YAPMAMALIYIZ. Eger metotumuz, sinifin statik olmayan elemanlarini kullaniyorsa zaten biz bu metotu istesekte statik yapamayiz. Fakat metotumuz sinifin hi bir statik olmayan elemanini kullanmiyorsa biz bu metotu statik de yapabiliriz statik olmayan metotda yapabiliriz. Bu durumda dogru teknik onu statik yapmaktir. nk biz onu statik olmayan metot yaparsak gerekmedigi halde onu bir referansla agirmak zorunda kaliriz. Benzer biimde bir sinifin bir metotunun statik olmadigini grdgmzde onun kesinlikle sinifin statik olmayan bir veri elemanini kullandigini dnmeliyiz. zetle bu konuda iki ey sylenebilir 1-)Eger biz metot ierisinde sinifin statik olmayan bir elemanini kullanmisak, zaten o metotu statik yapamayiz. 2-)Eger bir metot ierisinde biz sinifin hi bir statik olmayan elemaninin kullanmamisak metotu statikte yapariz statik olmayanda yapabiliriz. Fakat dogru teknik statik yapmaktir. FARKLI PARAMETRK YAPILARA LKN AYNI SML METOTLARIN BULUNMASI DURUMU(METHOD OVERLOAD) C#da zaten farkli siniflarda ayni isimli ayni parametrik yapilara sahip metotlar bulunabilmektedir. Bunlar birbirlerine karimazlar nk farkli siniflardadir. Fakat burada sz edilen konu ayni sinif ierisinde ayni metotlarin bulunabilmesidir. C#da ayni sinif ierisinde parametrik yapilari farkli olmak kouluyla ayni isimli birde fazla metot bulundurulabilinir. Parametrik yapilarin farkli olmasi demek parametrelerin tr veya sayica farkli olmasi demektir. Parametre degikenlerinin isimlerinin farkli olmasinin hi bir nemi yoktur. rnegin aagidaki ayni siniftaki metot ayni anda bulunabilir. Bu zellige nesne ynelimli programlamada dillerinde "Metot overloading denilmektedir.
public static void Foo(int a, int b) 50 Mert KPRC(mrtkprc@gmail.com) Sayfa 51 / -206- { } public static void Foo(int a) { } public static void Foo(int a, long b) { } *** Geri Dn Degerlerinin trlerinin farkliligi bu konuda bir neme sahip degildir. Yani ,ayni parametrik yapiya sahip ayni isimli , fakat geri dn degerlerinin trleri farkli olan metotlar bir arada bulunamamaktadir. Benzer biimde metotun statik olup olmamasi da farklilik yaratmamaktir. Eriim belirleyicide farklilik oluturmaz. Yalnizca parametrik yapilarin farkliligi nemlidir. *** Bir metotun ismi ve sirasiyla ve parametre trlerinin oluturdugu dizilime metotun imzasi denir. rnegin public static void Foo(int a, long b) { } IMZA : Foo,int,long public static void Foo(long a, int b) { } IMZA : Foo,long,int
*** Imzada dizilimdeki sira nemlidir. *** O HALDE AYNI SINIF ERSNDE AYNI MZAYA SAHP BRDEN FAZLA METOT BULUNAMAZ... Ayni isimli bir metot agrildiginda aslinda hangisinin agrilmi oldugunun tespit edilmesi srecine "overload resolution " denilmektedir. zet kural yledir: agrilma ifadesindeki argman trlerine bakilir bu trle tam uyuan bir parametre yapisina sahip yapi o varsa o agrilir.
namespace CSD { class App { public static void Main() {
Sample.Foo(10);//int Sample.Foo(10.2);//dobuble
}
} class Sample { public static void Foo(int a) { 51 Mert KPRC(mrtkprc@gmail.com) Sayfa 52 / -206- System.Console.WriteLine("int");
} public static void Foo(long a) { System.Console.WriteLine("long");
} public static void Foo(double a) { System.Console.WriteLine("double");
} public static void Foo(float a) { System.Console.WriteLine("float"); }
} }
** Fakat overload resolution ileminin bazi ayrintilari vardir. Overload resolution ilemi 3 aamada yrtlr nce aday metotlar (candidate methods) seilir sonra aday metotlar arasinda bazi metotlar atilir. Uygun(applicable) olanlar seilir. Nihayet uygun metotlar arasinda en uygun (the most applicable) metot seilebilir byle bir metot yoksa error oluur. agrilma ifadesindeki isim ile ayni isimli olan sinifin tm metotlari aday bir metotlardir. agrilma ifadesindeki her argmanin trnden aday metotun trne dogrudan dntrmenin yani atamanin mmkn oldugu metotlar uygun metotlardir. Metotun uygun olabilmesi iin her eyden nce argman sayisiyla parametre sayisi ayni olmak zorundadir. Artik sira en uygun metotun seilmesine gelmitir. Dogrudan dntrmelerin arasinda kalite farki vardir. En uygun metot seilmesinde bu kalite farkliliklari gz nne alinmaktadir. En uygun metot yle bir metottur ki agrilma ifadesindeki her argmandan parametre degikenine yapilan dntrmelerin kalitesine bakildiginda her argman parametre dntrmesi ya digerlerinden daha iyidir yada digerlerinden daha kt degildir. Dogrudan dntrmeler arasinda yle belirlenir. 1-)T1 -> T2, T1->T3 dntrmelerinde t2 yada t3 hangisi t1 ile ayniysa o dntrme daha iyidir. rnegin :int -> long , int -> int ; burada intten inte dntrme daha iyidir 2-) T1 -> t2 t1->t3 dntrmelerinde T2 den t3 e dogrudan dntrme var fakat t3den t2ye yoksa t1 -> t2 dntrmesi daha iyidir. rnegin: int -> long , int -> double dntrmelerinde int -> long daha iyidir. rnek 2: int ->float, int ->double; burada int - > float dntrmesi daha iyidir. 3-) T1 -> t2 t1->t3 dogrudan dntrmelerinde ne t2 den t3 e ne de t3 den t2 ye dogrudan dntrme varsa bu durumda iaretli tre yapilan dntrme daha iyidir. 52 Mert KPRC(mrtkprc@gmail.com) Sayfa 53 / -206- rnegin : uint -> long , uint -> ulong burada uint ->long yapilan dntrme daha iyidir.
*** En uygun metot yle bir metottur ki tm argman parametre dntrmesi, digerlerinde daha iyidir yada daha kt degildir.Byle bir metot bulunmayabilir. Bu durumda error oluur. namespace CSD { class App { public static void Main() {
float a = 30; ushort b = 13;
Sample.Foo(a,b);
} } class Sample { public static void Foo(int a,int b) { System.Console.WriteLine("int,int");
} public static void Foo(int a ,long b) { System.Console.WriteLine("int ,long");
} public static void Foo(int a, double b) { System.Console.WriteLine("int ,double");
} public static void Foo(double a,double b) { System.Console.WriteLine("double, double"); } public static void Foo(double a, int b) { System.Console.WriteLine("double , int");
} public static void Foo(double a) { System.Console.WriteLine("double");
} public static void Bar(double a) { System.Console.WriteLine("double"); }
} }
53 Mert KPRC(mrtkprc@gmail.com) Sayfa 54 / -206- *** . NET sinif ktphanesinde siniflarin pek ok overload edilmi metotlari vardir. rnegin Console Sinifinin pek ok write ve writeline metotlari vardir. Biz argmani verdigimizde uygun olan metot agrilmaktadir. rnegin Random sinifinin aslinda farkli next metotu varidir. BLGSAYARLARIN KISA TARH Bilgisayarlarin tarihi 4 dnemde incelenebilinir. Birinci dnem tamamen mekanik olarak bilgisayarlarin yapilmaya aliildigi dnemdir. Bu devrin en nemli ismi Charles Babage `dir. Babage 1800 yillarin ortalarinda "Analytic Engine ve "Difference Engine diye tanimlanan aygitlari yapmitir. Hatta bir dnem Babage `in asistanligi yapmi Ada Lovelace `in bu makineler iin yazdigi ynergeler yznde Dnyanin ilk programcisi oldugu iddia edilmektir. 1800 yillarin sonlarina dogru ve 1900 yillarin ilk yillarinda bilgisayar bilimleri iin nemli olan pek ok gelime yaanmitir. Ikilik sistem ve bool cebri ortaya konmutur. Bylece mantik devreleri kavramsal olarak tasarlanmaya balanmitir. 1900 yillarin ilk yarisinda en nemli kiilerinden biri John von Neumann; Alan Turing iin daha ok hesaplama kismiyla ilgilenmitir. Bir bilgisayarin neler yapabilecegi kisminda kafa yormutur. Von Neumannn pek ok alanda alimitir. Bugnk bilgisayarlarin temel mimarisini oluturan kiilerdendir. Nihayet ilk elektronik bilgisayar 40li yillarda ortaya ikmitir. 40 yillarda transistrler yoktu ve vakum tplerle(lamba) gerekletirilmitir. Bu ikinci devre transistor ncesi dnem denilmektedir. Dnyanin ilk bilgisayarinin ne oldugu konusunda tartimalar vardir. Bazilari Konrad Zuse `nin Z - 1,2,3 bilgisayarlarinin ilk bilgisayar oldugu farz etmektedir. Yine Martk Bilgisayarlari (1944) ve ENIAC Amerikada yapilmi ilk bilgisayarlaridir. 1940 -50 yillarin ortalarina kadar kisitli sayida bilgisayar retilmi ve teknoloji gittike gelitirilmitir. 1950 yillarda transistrn gelitirilmesiyle transistor dnemi denen nc dneme girilmitir. Bu devirlerde bilgisayarin CPUsu transistlerin byk plakalara monte edilmesiyle gerekletirilmitir. O yillarin en nemli firmalari IBM ve DEC `dir. 1970 yillarda entegre devrelerin gelitirilmesiyle bu devir drdnc dnemi oluturmaktadir. Dnyanin entegre devre olarak yapilan ilk CPUsu Intelin 8080dir. Dnyanin ilk kiisel bilgisayari aslinda Ed Robertsin aklina gelen bir fikirle oluturulmutur. Bu adam tarafindan gelitirilen Altair Bilgisayarlari ilk kisel bilgisayarlaridir.(1975) Altair Balangita makine diliyle programlanmaktaydi. Daha sonra bunlara Bill Gates ve Paul Allen Basic Derleyicisi yazmitir. Bu ikili 1975 yilinda Microsoft irketine kurmutur. Bundan sonra Amerika da mikrobilgisayarlar hizla gelitirilmeye balanmitir. Microsoft Bunlara BASIC derleyicisi satarak para kazanmitir. Daha Sonra IBM Firmasinda kiisel bilgisayar yazma iine girimitir. Bugn kullandigimiz bilgisayar mimarisi IBM tarafindan gelitirmitir. Fakat IBM bu makineler iin iletim sistemini kendisisi yazmami taeron olarak bir firmaya yaptirmak istemitir. Ite Microsoft bu dnemde IBM ile anlaarak en nemli yazilimi olan DOSu bu IBM makinelerinde kullanilmak zere gerekletirmitir. Ilk kiisel bilgisayar 1980 - 1981 yillarinda Donanimi IBMin iletim sistemini Microsoftun oluturdugu biimde yapildi. 10.Hafta 2.Gn (07 Agustos 2011) 40li yillar da ilk bilgisayarlar iktiginda bir yazilim teknigi de sz konusu degildi. Fakat 50li yillarda zellikle ALGOL diliyle birlikte ii paralara blme fikri de ortaya ikti. Ilk yksek seviyeli diller makina dilinden ok etkilenmiti ve goto kullanmak neredeyse 54 Mert KPRC(mrtkprc@gmail.com) Sayfa 55 / -206- zorunluydu. Daha sonra pek ok programlama dili revize edildi. 70li yillarda yapisal programlama teknigi yayginlati. Yapisal programlama teknigine prosedrel teknik de denir. Bu dillerde sinif yoktur, Prosedrler (fonksiyonlar ) ile i paralara blnr. 80li yillara kadar yapisal teknik gereksinimleri karilamaya yetmitir. Fakat 80li yillardan sonra kiisel bilgisayarlarin ortaya ikmasi ile artik donanimlar hizla gelimeye balamitir. Donanimlarin gelimesiyle yazilimlar ayrintili olmaya baladi. Yazilim projelerin satir sayisi artmaya baladi. Ite nesne ynelimli programlama teknigi bu yillarda ortaya ikmaya balamitir. Nesne ynelimli programlama teknigi algisal kolaylik ve aiklik saglamak amaciyla gelitirilmitir. Yani bu teknikle artik bir proje prosedrlerin kullanilmasiyla degil siniflarin kullanilmasiyla tasarlanmaktadir. Nesne Ynelimli Programlama tekniginin ilk alimalar 70li yillarda yapilmi olsa da asil yayginlik kazanmasi 90li yillarda olmutur. 90li yillar da neredeyse her programlama diline siniflar eklenmitir. SIMULA, SmallTalk ve C++ ilk nesne ynelimli programlama dili teknigine adaydir. NESNE YNELML PROGRAMLAMA TEKNG NEDR? Nesne ynelimli programlama tekniginin tek bir cmleyle tanimina yapmak zordur. Fakat "Siniflar Kullanarak programa yazma teknigidir. Aslinda nesne ynelimli programlama teknigi bir ka anahtar kavramlarin toplamindan oluturmaktadir. Bu anahtar kavramla birbirinde ayri degil i ie gemi durumdadir. Bu anahtar kavramlarin hepsinin ortak zelligi algisal kavramayi kolaylatirmaktir. AYNI SML METOTLARIN ANLAMI Bir sinifta benzer ilemleri yapan metotlara ayni isimlerin verilmesi iyi bir tekniktir. Bylece ok fazla ey var duygusundan uzaklailir ve kafa kariikligi engellenir. rnegin: Random Sinifinin Farkli Metodu vardir. Fakat bunlar bizim iin farkli metotlar degildir. Tipki 3 Sandalyenin birbirinden farkli olmasi fakat 3nnde sandalye olmasi gibi. STRNG SINIFI System ierisindeki string isimli sinif yazilar ierisinde ilem yapmak iin kullanilmaktadir. Bir string nesnesinin ierisinde yaziyi oluturan karakterler ve onun karakter uzunlugu bulunmaktadir. string nesneleri new operatryle oluturulabilinir fakat bunlar otomatik de oluturulabilinir. C# `da ne zaman iki tirnak("......) ierisinde bir yazi yazilsa derleyicinin kendisi new operatryle bir string nesnesi oluturur. Iki tirnak ierisindeki nesneyi oraya yerletirir yazinin uzunlugun da yerletirir o nesnenin referansinin bize verir. Yani C#da iki tirnak ierisindeki yazilar " Bir string nesnesi yarat referansini bana ver " anlamina gelmektedir. System.String s; s = "Istanbul";
System.String sinif ok kullanildigi iin string anahtar szcg ile de temsil edilmitir. Yani System.String s; ile string s; ayni anlamdadir. 55 Mert KPRC(mrtkprc@gmail.com) Sayfa 56 / -206- Console Sinifinin string parametreli Write ve WriteLine metotlari bizden bir string referansini alip o stringin karakterlerini ekrana yazar. LENGTH PROPERY String sinifinin int trden Length isimli property elemani nesne ierisindeki yazinin karakter uzunlugunu verir. A iki tirnak kapat iki tirnak yani " eklinde bir string olabilir bu durumda yine bir string nesnesi yaratilir. Fakat ierisinde karakter bulunmaz ve karakter uzunlugu da sifir olur. Anahtar Notlar : C#da eer bir sinifin indeksleyici (indexer) denen bir referans varsa o turden bir referans kseli parantez operatruyle kullanilabilinir. Indeksleyicinin parametresi demek kseli parantez ierisinde yazilanin turu demektir. Indeksleyicinin turu demek bu islem sonrasinda elde edilenin tuur demektir. NDEKSLEYC [] String sinifin int parametreli char trnden bir indeksleyicisi vardir. Yani s[i] ileminden s referansinin gsterdigi yerdeki nesnenin inci karakteri elde edilir. Console. ReadLine() METOTU Console Sinifinin ReadLine() isimli statik metodu bizden enter tuuna basilana kadar klavyeden bir yazi girmemizi ister bir string nesnesi yaratarak onun ierisine yerletirilir ve onun referansiyla geri dner. string s; s = System.Console.ReadLine(); System.Console.WriteLine(s);
SINIF ALIMASI Klavyeden bir yaz okuyunuz o yazy terste yazdrrz.
string s;
System.Console.Write("Yaziyi Giriniz : "); s = System.Console.ReadLine();
for (int i = s.Length-1; i >= 0; --i) { System.Console.Write(s[i]); }
System.Console.ReadLine();
Yaratilmi bir string nesnesinin karakterleri bir daha degitirilemez. Zaten sinifin indeksleyicisi de Read-onlydir. string s = "Mert; s[0] = `A; // OLMAZ HATA INDEXLEYICI SADECE Read-Onlydir 56 Mert KPRC(mrtkprc@gmail.com) Sayfa 57 / -206- ToLower() ve ToUpper() String sinifinin statik olmayan ToLower metodu yaziyi kk harfe evirmek iin, ToUpper Metodu ise yaziyi byk harfe evirmeyi saglar. Bu Metotlar Bize Dnm yeni bir yazi verirler. Substring() Metotu String sinifinin statik olmayan Substring() metodu: Belli bir index, belli bir karakterini alarak bize onu yeni bir string nesnesi gibi vermektedir. Eger index ve uzunluk bakiminda yazinin sonuna ikilirsa Exception oluur. Anahtar Notlar: Exception program alisirken ortaya ikan problemli durumlari anlatmak iin kullanilmaktadir. Eer bir Exception olusur ve biz bunu ele almamissak (Handle ) program ker. string s, k;
s = "Istanbul";
k = s.Substring(2, 3); System.Console.WriteLine(k); //tan IndexOf() Metotu String Sinifin IndexOf isimli metotlari bir yazi iersinde bir karakteri, baka bir yaziyi aramak iin kullanilmaktadir. Metotlar Eger Bulursa ilk buldugu yerin indeksini bize verirler eger bulamazlarsa -1 ile dnerler. SINIF ALIMASI Klavyeden bir yaz giriniz bu yaz ierisinde yalnza yaznn bir yerinde !arantez iierisnde bir "eyler olsun sonra !arantez ierisindekli bu yazy ekerek yazdrnz.
string s;
System.Console.Write("Parantezli Bir Yazi Giriniz : ");
s = System.Console.ReadLine();
int index1 = s.IndexOf('('); int index2 = s.IndexOf(')');
if (index1!=-1 && index2!=-1 && index1<index2) { string k = s.Substring(index1+1, index2-index1-1);
IndexOf metotlarinin yazinin belli bir blmnde arama yapan versiyonlari da vardir. LastIndexOf() Metotu 57 Mert KPRC(mrtkprc@gmail.com) Sayfa 58 / -206- String Sinifin LastIndexOf metotlar tamamen IndexOf Metotlari gibidir fakat aramayi sondan baa dogru yapar. Replace() Metotu String sinifinin yazinin belli bir indeksinden itibaren belli bir sayida karakterini atmak iin kullanilir. Metotlar Bize Silinmi yeni bir yazi verirler. string sinifinin Replace isimli metotlari bir yazinin ierisindeki btn yazilari baka bir yaziyla degitirmek iin kullaniliur. Trim() Metotu Trim metotlari bir yazinin baindaki sonundaki boluk karakterlerini atmak iin kullanilir. String sinifinin ift eit(==) ve nlem eit(!=) operatr metotlari vardir iki string referansi bu operatrlerle karilatirma ilemine sokulabilinir. Bu karilatirmalarda referansin gsterdigi yazilarin ayni olup olmadigina bakilmaktadir. 11.Hafta 1.Gn (13 Agustos 2011) Iki string referansi + operatryle toplanabilir. nk string sinifini + operatr vardir. Iki string referansi toplandiginda yeni bir string nesnesi yaratilir. Yeni yaratilan nesnenin iindeki yazi iki yazinin birleiminden olumaktadir. Toplama ileminden rn olarak yeni nesnenin adresi elde edilmektedir. rnegin: string s1 = "Ali"; string s2 = "Veli"; string s3;
string s = "Ali"; s += "Veli";//AliVeli ////-------------------->
Eger iki tirnak ifadesinin baina ona yapk bir biimde @ karakteri getirirsek byle stringlere tam tamina string (verbatim string) denilmektedir. Tam tamina stringler ayri bir tr belirtmez sadece yazili biimi belirtir. Bunlarin iki farkli zelligi vardir . 1. Bunlarin ierisindeki Ters bl karakterleri, gerek ters bl karakterleri anlamina gelmektedir. string s = @"c:\temp\a.dat";
2. Bunlar birden fazla satira yazilmi olabilir. string s = @"bugun 58 Mert KPRC(mrtkprc@gmail.com) Sayfa 59 / -206- hava ok guzel";
Bir assembly ierisinde; tamamen ayni karakterlerden oluan iki tirnakli yazilar varsa, bunlar iin tekrar tekrar yer ayrilmaz bir kez yer ayrilir hep ayni adres verilir Anahtar Notlar : System alanindaki object sinifinin ReferenceEquals isimli statik metodu iki referansin ierisinde ayni adres var mi diye kontrol eder. rnein
string s = "ankara"; string k = "ankara";
bool result = System.Object.ReferenceEquals(s, k); System.Console.WriteLine(result);//true
Anahtar Notlar : .NETTE Assembly terimi programi olusturan .exe ve .dll gibi dosyalara denilmektedir.
string sinifinin Format isimli statik metodu alima bakimindan Write ve WriteLine metotlarinin parametrik biimine benzemektedir. Ancak format metodu yaziyi ekrana yazdirmazda yazilacak yaziyi bize string nesnesi olarak bize verir. SINIF ALIMASI Bir Dng ierisinde klavyeden Console sinifinin ReadLine metoduyla yazi aliniz. "quit girilince dngden ikiniz girilen btn yazilari birletirerek dngden ikildiginda yazdiriniz. string s=""; string top = "";
for (; ; ) {
System.Console.Write("Metin Giriniz : ");
s = System.Console.ReadLine();
if (s=="quit") {
break; }else { top += s;
}
} System.Console.WriteLine(top);
59 Mert KPRC(mrtkprc@gmail.com) Sayfa 60 / -206- SINIFLARIN BALANGI METOTLARI(CONSTRUCTOR) new ilemiyle birlikte nesne iinde heapde yer tahsis edildikten sonra sinifin balangi metotu(constructor) metotudu otomatik agrilmaktadir. Bu metotun agrilmasi bittikten sonra new operatr geri dnmektedir. Balang metotu'nun ismi snf ismiyle ayndr. Bunlarn geri dn degerleri diye bir kavram yoktur. Geri dn degeri trne bir ey yazlmaz yazlrsa error oluur. Balang metotu statik degildir. rnein class Sample {
public Sample() {
// iste bu constructor metot sinif ismiyle ayni } public void Foo() {
} public static void Bar() {
} } *Balangi metotu overload edilebilir. public Sample() {
} public Sample(int a) {
} public Sample(int a, int b) {
} *** Parametresiz balangi metotuna default constructor metotu denir. public Sample() {
}
Sinifin hangi balangi metotuyla agrilacagi new sentaksiyla belirlenir.
Sample s = new Sample(10,20) Btn balangi metotlari aday metot olarak; Overload Resolution ilemine sokulur. 60 Mert KPRC(mrtkprc@gmail.com) Sayfa 61 / -206- Balangi metotlarinin kullanilmasinin nedeni bir takim ilk ilemleri gizlice yapmak ve sinifin veri elemanlarina ilk degerlerini atamaktir. Sinifin default constructor metotu sinifin iin hi balangi metotu yazmadiysak ; derleyici tarafindan public biimde ii bo olarak yazilmaktadir. new operatr ile bir sinif nesnesi yaratildiginda new operatr nce nesneyi heapde yaratir. Sonra bu veri elemanlarini sifirlar sonra da uygun balangi metotunu agirir. Yani biz balangi metotu ierisinde deger atamadiysak onun ierisinde 0 degeri bulunmaktadir. namespace CSD { class App { public static void Main() { Sample s, k; s = new Sample(); k = new Sample(10); System.Console.WriteLine(s.val);//0 System.Console.WriteLine(k.val);//10 } } class Sample { public int val; public Sample() {
} public Sample(int a) { val = a; } }
}
rnek : namespace CSD { class App { public static void Main() { Date d = new Date(10, 12, 1990); d.Disp(); } } class Date {
public int day,month,year;
public Date(int d,int m,int y) { day = d; month = m; year = y;
} public void Disp() 61 Mert KPRC(mrtkprc@gmail.com) Sayfa 62 / -206- {
Anahtar Notlar: Temel turlerin Parse metotlari yaziyi sayiya dnusturmektedir. rnein biz dd/mm/yyyy formatinda bir yaziyi asaidaki gibi ayristirabiliriz. string date = "11/10/2004"; day = int.Parse(date.Substring(0,2)); month = int.Parse(date.Substring(3, 2)); year = int.Parse(date.Substring(6, 4));
Anahtar Notlar: Aslinda bilgisayarin alisma prensibi dikkate alindiinda klavyeden sayi okunmaz, klavyeden yazi okunur. Aslinda programlama dillerindeki okuma fonksiyonlari arka planda nce yazi olarak okuma sonra onu yaziya dnusturur * string sinifin default constructoru yoktur fakat parametreli balangilari vardir. Aslinda biz bir string nesnesini new operatryle de yaratabiliriz. string s = new string('a', 10); System.Console.WriteLine(s); //aaaaaaaaaa DZLER Elamanlari ayni trden olan ve bellekte ardiik biimde bulunan veri yapilarina dizi denir. Anahtar Notlar: Yazilimda aralarinda anlamsal bir iliski bulunan bir grup nesneye veri yapisi(data structure) denir C#da diziler bir sinif gibi dnlm ve organize edilmitir. C#da her T tr iin T [] parantez eklinden T trnden bir dizi temsil eden bir tr de vardir. rnegin: int tr iin int [] keli parantez eklinde bir tr vardir yada string tr iin string[] eklinde bir trde vardir. T tr ister deger trne ilikin olsun isterse de referans trne ilikin olsun her zaman referans trne ilikindir. Dizilerde heapde new operatryle tahsis edilmektedir. Dizi nesnelerin new operatryle taratilmasinin genel biimi yledir: new <tur> <[uzunluk]> rnegin: int [] r; r = new int[10]; Yani T keli parantez trnden bir dizi nesnesi yaratmak iin new T [uzunluk] olur. 11.Hafta 2.Gn (14 Agustos 2011) Bir dizi bir sinif nesnesi gibidir nesnenin ierisinde hem elemanlar hem de dizinin uzunlugu tutulur. rnegin: 62 Mert KPRC(mrtkprc@gmail.com) Sayfa 63 / -206- int n = 5; int[] a; a = new int[n];
Dizinin her elemani bagimsiz bir degiken gibi kullanilabilir. Keli parantez ierisindeki parantez tam sayi trne ilikin olmalidir. Dizinin ilk elemani 0.(sifir) indisli elemanidir. Dizinin en nemli kullanilma nedeni bir dng ierisinde bir dng ierisinde tm elemanlarin gzden geirilmesidir. Dizilerin uzunluklari Length propertysiyle elde edilebilir ve bu property int trndendir ve read-onlydir. Dizi uzunluklari nesnenin ierisinde saklanmalidir. Bir dizi referansi herhangi bir uzunlukta diziyi gsterebilir. Ayni trden iki dizi referansi birbirlerine atanabilir. T1 -> T2 trne dogrudan dntrme olmasi T1[] trnden T2[] parantez trne dogrudan dntrme olacagi anlamina gelmez. rnegin: biz int trn long trne dogrudan atayabiliriz fakat int keli parantez trn long keli parantez trne dogrudan atayamayiz. Bir diziyi bir metota parametre yoluyla aktarabiliriz. Bu durumda Metotun parametre degikeni T[] trnden olur. Metotta ayni trden bir referansla agrilir. Bir metotun geri dn degeri de bir dizi trnden de olabilir bu durumda geri dn degeri T[] parantez biiminden belirtilir. namespace CSD { class App { public static void Main() { int[] a; a = GetArray();
DispArray(a);
} public static int[] GetArray() { int[] a = new int[10];
for (int i = 0; i < a.Length; ++i) { a[i] = i; } return a; } public static void DispArray(int[] b) { for (int i = 0; i < b.Length; i++) { System.Console.Write("{0} ",b[i]); } System.Console.WriteLine(); } }
} 63 Mert KPRC(mrtkprc@gmail.com) Sayfa 64 / -206-
Bir dizi nesnesi yaratildiginda elemanlarin ierisinde balangi 0 degeri vardir. Dizi elemanlarina new operatryle tahsisat sirasinda kme paranteziyle ilk deger verebiliriz. rnegin: int[] a; a = new int[10] { 1,2,3,4,5,6,7,8,9,10};
Eger kme parantezleri ierisinde ilk deger veriliyorsa bu durumda dizi uzunlugunun sabit ifadesi biiminde belirtilmesi zorunludur. int n = 5; int[] a = new int[n] { 1,2,3,4,5}; // HATA OLMAZ... Ayrica kme parantezleri ierisindeki deger sayisinin tam olarak dizi uzunlugu kadar olmasi zorunludur. Daha fazla yada daha az olamaz int[] a = new int[5] { 1,2,3,4}; // HATA OLMAZ Kme parantezleri ierisindeki ilk degerlerin sabit ifadesi olmasi gerekmez. Bir diziye ilk deger veriyorsak aslinda uzunlukta hi belirtilmeyebilinir. rnegin: int[] a;
a = new int[]{1,2,3,4,5}; Yukaridaki durumda veri elemanlarini sayar ve verini o uzunlukta aildigini kabul eder. Ancak uzunlugun belirtilmesi okunabilirligi arttirabilmektedir. Bazen pratik olarak diziyi yaratir yaratmaz ierisine ilk degerleri verip onu olarak argman biiminde gnderebiliriz. rnegin: DispArray(new int[] {1,2,3,4,5});
Bir dizi referansina dogrudan hi new kullanmadan kme parantezleri ierisinde ilk deger verilebilinir. Bu durumda new ilemi derleyici tarafindan yapilmaktadir. rnegin: int[] a = { 1,2,3,4,5};
Bu ilemin aagidakinden hi bir farki yoktur. int[] a = new int[] { 1,2,3,4,5};
***Bir Dizide en son degerden sonra virgl konulmasi problem yaratmaz. int[] a = { 1,2,3,4,5,};
Dizinin En Byk Sayisini Bulan Program namespace CSD 64 Mert KPRC(mrtkprc@gmail.com) Sayfa 65 / -206- { class App { public static void Main() {
int[] a = new int[] { 44,55,12,56,98,78,23,65}; int max = GetMax(a); System.Console.WriteLine(max);
}
public static int GetMax(int[] a) { int max = a[0]; for (int i = 1; i < a.Length; ++i)
if(a[i]>max) max = a[i];
return max; } } }
SINIF ALIMASI 10 elemanl bir diziyi ilk deger vererek bildiriniz bu dizide en ok yinelenen sayy bulunuz.(Birden fazla en ok say yineleniyorsa herhangi biri olabilir) namespace CSD { class App { public static void Main() {
int[] a = new int[] { 10,21,43,21,78,43,25,43,10,43}; int max = 0, count, maxVal = 0;
for (int i = 0; i < a.Length; ++i) { count = GetValCount(i, a); if(count>max) { max = count; maxVal = a[i];
} } System.Console.WriteLine("Mod Val: {0}",maxVal); } public static int GetValCount(int index, int[] a) { int count = 0;
for (int i = index; i < a.Length; ++i) if (a[index] == a[i]) ++count; return count;
}
65 Mert KPRC(mrtkprc@gmail.com) Sayfa 66 / -206-
} }
Dizilerin Sralanmas Gsterilmesi(Bubble sort) namespace CSD { class App { public static void Main() {
int[] a = new int[10] { 10,21,43,21,78,43,25,43,10,46}; BSort(a); Disp(a);
} public static void BSort(int[] a) { for (int i = 0; i < a.Length-1; i++) { for (int k = 0; k < a.Length-1-i; k++) { if (a[k]>a[k+1]) { int temp = a[k]; a[k] = a[k+1]; a[k + 1] = temp;
} } } } public static void Disp(int[] a) {
for (int i = 0; i < a.Length; i++) { System.Console.Write("{0} ",a[i]); } System.Console.WriteLine(); }
} }
Dizilerin Sralanmas (Selection Sort) namespace CSD { class App { public static void Main() {
int[] a = new int[10] { 10,21,43,21,78,43,25,43,10,46}; SSort(a); 66 Mert KPRC(mrtkprc@gmail.com) Sayfa 67 / -206- Disp(a);
} public static void SSort(int[] a) { int min, minIndex; for (int i = 0; i < a.Length-1; i++) { min = a[i]; minIndex = i;
for (int k = i+1; k < a.Length; k++) { if (a[k]<min) {
min = a[k]; minIndex = k;
} } a[minIndex] = a[i]; a[i] = min; } } public static void Disp(int[] a) {
for (int i = 0; i < a.Length; i++) { System.Console.Write("{0} ",a[i]); } System.Console.WriteLine(); }
} }
SINIF TRNDEN DZLER
Her bir elemani bir sinif nesnesinin referansini yani adresini tutan bir dizi sz konusu olabilir. rnegin : class Sample { //....
} //...
Sample[] s = new Sample[5]; Burada yalnizca sample dizisi iin tahsisat yapilmitir. Bu dizi elemanlarinin gsterecegi elemanlar henz tahsis edilmemitir. Bunu da yle tahsis edebiliriz.
for (int i = 0; i < s.Length; ++i) { s[i] = new Sample(); } 67 Mert KPRC(mrtkprc@gmail.com) Sayfa 68 / -206- O halde bir sinif dizisi, bir referans dizisi gibidir. rnek: namespace CSD { class App { public static void Main() {
Sample[] s = new Sample[5];
for (int i = 0; i < 5; i++) { s[i] = new Sample(i);
} for (int i = 0; i < 5; i++) { s[i].Disp(); }
}
} class Sample {
public int val;
public Sample(int a) {
val = a;
} public void Disp() { System.Console.WriteLine(val); } }
}
rnek 2: namespace CSD { class App { 68 Mert KPRC(mrtkprc@gmail.com) Sayfa 69 / -206- public static void Main() {
Sample[] s = { new Sample(10),new Sample(20),new Sample(30),new Sample(40),new Sample(50)}; for (int i = 0; i < 5; i++) { s[i].Disp(); }
}
} class Sample {
public int val;
public Sample(int a) {
val = a;
} public void Disp() { System.Console.WriteLine(val); } }
}
Yazilari tutan bir dizi oluturmak iin bir string dizisi kullanmak gerekiyor. rnegin: string[] names = new string[5];
Biz imdi yalnizca 5 tanesini string nesnesinin referanslarini tutacak bir dizi oluturduk. string nesnelerini iki tirnakla yaratabiliriz. names[0] = "Ali"; names[1] = "Veli"; ....
namespace CSD { class App { public static void Main() {
for (int i = 0; i < names.Length; i++) { System.Console.WriteLine(names[i]); }
}
}
} 12.Hafta 1.Gn (20 Agustos 2011) Anahtar Notlar : C#da istisna olarak stringler switch deyiminde kullanilabilir. Yani switch ifadesinin parantezinin iindeki string turunden referans olabilir case ifadeleri string turunde referans belirtebilir. String sinifinin; Split metotlari bir yaziyi eitli ayira karakterlerinden ayirarak bize ayrilmi yaziyi dizi olarak vermektedir. Pek ok Split metotu vardir en tipik olani udur public string[] Split(string[] seperator, System.StringSplitOptions options)
Metotun birinci parametresi ayira yazilarina ilikin string dizisini belirtir. Ikinci parametresi StringSplitOptions trnden bir enu#dur. Bu parametre yle girilmelidir. StringSplitOptions.RemoveEmptyEntries ; Metot bize ayrilmi yazilardan oluan bir string dizisi verir. Metotun char trden bir dizi alan bir versiyonu da vardir. public string[] Split(char [] seperator,System.StringSplitOptions options) Metotun bu versiyonunda ayira karakterleri tek bir karakter olmak zorundadir. `a -> bu bir sayi ile dner. "a -> bu bir ise referanstir. string s = "Ali , Veli , Selami "; string[] names;
for (int i = 0; i < names.Length; i++) { System.Console.WriteLine(names[i]); }
Anahtar Notlar: switch deyiminin case blumlerinin ok uzatilmasi iyi bir teknik deildir. Bunun yerine case blumunde yapilacaklari bir metota yaptirmak daha iyi bir tekniktir. Anahtar Notlar: Kod tekrarlarin mumkun olduunca uzatilmasi iyi bir teknik deildir. Bunu azaltmak iin ilk dusunulecek yntem tekrar eden kodlari bir metotta toplamaktir. Tekrari engellemenin en nemli faydasi kodu kisaltmasidir. Dier bir faydasi 70 Mert KPRC(mrtkprc@gmail.com) Sayfa 71 / -206- kodu anlasilir hale getirmesidir. Dier bir faydasi da deisiklikler yapilacai zaman onun tek yerden yapilmasini salamaktadir. Anahtar Notlar : Nesne ynelimli teknik her kavram ve gerek nesne birer sinifla temsil edilmeye alisilir. Siniflarla temsil etme algilamaya kolaylastirmaktadir.
Anahtar Notlar : Console ekraninin satir ve sutun uzunluu default olarak 80*25 biimindedir fakat Console sinifinin WindowWidth ve WindowHeight isimli satatik propertyleri elemanlari, genislik ve uzunluk elemanlarini bize vermektedir. Bu propertylere deer atandiinda Console ekranini istediimiz genislik ve yukseklie getirebiliriz. Anahtar Notlar : Random nesnesi yaratildiinda baslangi durumunu System deki saatten almaktadir. Dolayisiyla ayni saniye ierisinde iki Random nesnesi yaratildiinda bunlar ayni rastgele dizilimi verilir. Bu nedenle bu tur uygulamalarda birden fazla Random nesnesi kullanmak yerine disarida bir Random nesnesi yaratip tek bir Random nesnesini kullanmak daha uygun olur. 12.Hafta 2.Gn (21 Agustos 2011) $K %$&'(L' )*+*L,- C#da ok boyutlu diziler oluturabiliriz. ok boyutlu diziler uygulamada iki boyutlu matrisler biiminde karimiza ikmaktadir. Bazi olaylari modellemede ok boyutlu diziler kolay bir algilama sunmaktadir. Aslinda ok boyutlu diziler yapay bir konudur. nk bellek tek boyutludur. ok boyutlu diziler aslinda arka planda tek boyutlu dizi biiminde ifade edilmektedir. ok boyutlu dizi trleri keli parantez ierisine boyut sayisi - 1 tane virgl(,) yerletirilerek yazilir. rnegin int[, ,] : int trnden 3 boyutlu diziyi temsil etmektedir. ok boyutlu diziler new operatryle tahsis edilirken keli parantez ierisine tm boyutlu uzunluklari belirtilir. ok boyutlu dizilerin bir elemanina keli parantezin iinde birden fazla indis belirtilerek eriilir. Anahtar Notlar: Monoda Uygulama Gelistirmek Iin Kullanilan IDE = MONO DEVELOPDUR. namespace CSD { class App { public static void Main() { int[,] a = new int[3, 5];
for (int i = 0; i < 3; i++) { for (int k = 0; k < 5; k++) { a[i, k] = i + k; } }
for (int i = 0; i < 3; i++) { for (int k = 0; k < 5; k++) { System.Console.Write(a[i, k]);
} System.Console.WriteLine(); }
} } }
71 Mert KPRC(mrtkprc@gmail.com) Sayfa 72 / -206- ok boyutlu dizilere de new operatryle ilk deger verilebilinir. Bunun iin ayrica kme parantezine alinmasi gerekir. rnegin:
int[,] a; a = new int[3, 2] { {1,2},{3,4},{5,6}};
Tabi yine bu durumda uzunluk belirtilmeyebilir fakat bu durumda kme parantezleri ierisindeki degerlerinin sayilarinin ayni olmasi gerekir. rnegin: int[,] a; a = new int[3, 2] { {1,2,100},{3,4},{5,6}}; // ERROR
phesiz referansa ilk deger verme yoluyla da yapilabilir. )*+* )*+*L,-./A00,) A--A&1 Bir dizinin her elamani baka bir diziyi gsteren bir referans olabilir. Bu durumda dizi referanslarini tutan diziler sz konusu olur. Dizi dizileri birden fazla keli parantez ile belirtilir. Ilk keli parantez asil diziyi, diger keli parantezler onun dizinin elemanlarinin gsterdigi diziyi belirtir. rnegin : int[][] a; x -> xxxxx x -> xxxxx x -> xxxxx x -> xxxxx Dizi dizileri new operatryle tahsis ederken; ilk keli parantez[] ierisine dizinin uzunlugu yazilir. Diger Keli Parantezler Tr belirttigi iin bo yazilir. Burada biz yalnizca ana diziyi tahsis ettik. Ana dizinin gsterecegi elemanlari henz tahsis etmedik. int2323 a4 a 5 ne6 int273234 x (a) ---> x -> x -> x ->
Burada a nin int keli parantez keli parantez eklinde belirtilir. a keli parantezinin tr int keli parantezdir. Asil dizinin elemanlari iinde ayrica tahsisat yapmak gerekmektedir. a283 5 ne6 int2934 a2:3 5 ne6 int2734 a283 5 ne6 int2;34
x (a) ---> x -> xxxxx x -> xxx x -> xxx(x*)xx Dizi dizilerinin elemanlarinin gsterdigi dizinin elemanlarina erimek iin yan yana iki keli parantez kullanilir. a[2][3];
72 Mert KPRC(mrtkprc@gmail.com) Sayfa 73 / -206-
namespace CSD { class App { public static void Main() {
int[][] a;
a = new int[5][];
for (int i = 0; i < 5; i++) { a[i] = new int[3] { i*10,i*10+1,i*10+2};
} for (int i = 0; i < 5; i++) { for (int k = 0; k < 3; k++) { System.Console.Write("{0} ",a[i][k]); } System.Console.WriteLine(); }
} } }
Grldg gibi dizi dizileriyle, ok boyutlu diziler birbirine benzemektedir. rnegin; matrisel blgeyi biz ok boyutlu bir diziyle de bir dizi dizisiyle de ifade edebiliriz. ok boyutlu dizide elemana eriim a[i,k] biiminde yapilir hlbuki dizi dizilerinde elemana eriim a[i][k] biiminde yapilir. Bir matris alaninin dizi diziyle ve ok boyutlu dizilerle gerekletirilmesinin farkliliklari unlardir. 1-) Dizi dizileri toplamda bellekte daha fazla yer kapsamaktadir. 2-)Dizi dizilerinde matris uzunluklari farkli uzunluklarda olabilir halbuki ok boyutlu dizilerde ayni uzunlukta olmak zorundadir. rnegin: Bir okulda 5 sinifi bulunuyor olsun her sinifta da farkli sayida insanlar bulunuyor olsun. Bunu dizi dizisiyle temsil etmek daha etkindir. ok boyutlu bir dizi dizisi sz konusu olabilir. rnein ! int"#$ "$ a; %urada as&l di'i i(i )oyutlu )ir matristir. %u di'ilerin *er )ir elaman& int"$ t+r+ndendir. ,ani int t+rden )ir di'iyi g-sterme(tedir. .a*sisat /-yle yap&la)ilir. int[][] a = new [3,2][]; for(int i=0;i<3;++i) for(k=0;k<2;++k) a[i,k] = new int[4];
73 Mert KPRC(mrtkprc@gmail.com) Sayfa 74 / -206-
ok boyutlu dizi dizisi ok boyutlu olabilir. Yani rnegin matrisin bir elemanin gsterdigi dizide bir matris olabilir. rnegin: int[,][,] a; //.. Asil dizi tek boyutlu olabilir fakat dizinin elemanlarinin gsterdigi diziler ok boyutlu olabilir. rnegin: int[][,]; Yukaridaki rneklerle gerek uygulamalarda pek rastlanmamaktadir. Aslinda daha kariik durumlarda sz konusu olabilir. rnegin bir dizinin her elemani bir dizi dizisinin gsterir. a[i][k][m,n]; Dizi dizlerine kme paranteziyle yine new ilemi sirasinda ilk deger verebiliriz. Fakat tek kademeye ilk deger verilebilmektedir. rnegin: int[][] a;
a = new int [3][] { new int[2]{1,2},new int[3]{1,2,3},new int[4]{1,2,3,4}}; Fakat aagidaki gibi bir deger verme sz konusu olmaz.. a = new int [3][] = {{1,2},{1,2,3},{1,2,3,4}}; // error Anahtar Notlar: Javada ok boyutlu dizi kavrami yoktur. Yalnizca dizi dizisi kavrami vardir.
F$-,A<= )>N0?L,-* C#da foreach dngleri bir dizilimi dolamak iin kullanilan genel bir dng deyimidir. Anahtar Notlar: Aslinda foreach dngler aslinda IEnumerable ara yzn destekleyen herhangi bir sinif ya da yapiyla kullanilabilir. Dizilerde IEnumerable ara yzn de desteklemektedir. Bu IEnumerable destekleyen siniflara "DIZILIM de diyecegiz. 13.Hafta 1.Gn (27 Agustos 2011) Bayram Tatili 13.Hafta 1.Gn (28 Agustos 2011) Bayram Tatili 14.Hafta 1.Gn (03 Eyll 2011) Foreach deyiminin genel biimi yledir.
foreach(<tur> <deisken ismi> in <dizilim ismi>) <deyim> rnein: 74 Mert KPRC(mrtkprc@gmail.com) Sayfa 75 / -206- int[] a = {1,2,3,4,5}; foreach(int x in a) { //.. }
foreach dngs yle aliir: Her yinelemede dizilimin siradaki elemani dng ierisinde ki degikene yerletirilir. Dizlim elemanlari bittiginde dng de biter. Aagidaki gibi bir foreach deyiminin foreach (int x in a) {
//.. } islevsel esdeeri syledir : for (int i = 0; i < a.Length; i++) { x = (int) a[i]; }
foreach (string name in names) { System.Console.WriteLine(name); }
string sinifi da IEnumerable ara yzn destekledigi iin foreach deyimiyle kullanilabilinir. Bu durumda dngnn her yinelenmesinde yazinin karakterleri elde edilir. string s = "Ankara";
foreach (char c in s) { System.Console.WriteLine(c); } ok boyutlu bir dizi foreach dngsyle dolailabilinir. Bu durumda ok boyutlu her dizinin elemani elde edilebilir. int[,] a = new int[3,2]{{1,2},{3,4},{5,6}};
foreach (int x in a) System.Console.Write("{0} ",x); System.Console.WriteLine();
foreach dngsn de in anahtar szcgnn sagindaki ifade her yinelemede tekrar yapilmaz toplama da bir kez yapilir. Dolayisiyla aagidaki gibi bir dng tamamen normaldir.
foreach (int a in new int[] { 1, 2, 3, 4 }) { System.Console.Write("{0} ", a); }
*foreach dng degikenin read-only oldugu kabul edilir. 75 Mert KPRC(mrtkprc@gmail.com) Sayfa 76 / -206- foreach dngsnde diziliminin her elamaninin dng degikenine tr dntrme operatryle atandigi kabul edilir. Dolayisiyla dng degikenin tr dizinin tryle ayni olmasi gerekmez. foreach dngleri bir dizilimi dolamak iin pratik bir kullanima sahiptir. Fakat biz bu dngyle her istedigimizi yapamayiz. rnegin bu dngyle biz dizilimi tersten dolaamayiz yana yana elemanlari zerinden ilem yapamayiz. SM ALANLARI Isim alani bildirimi genel biimi yledir. Ayni isim alani ierisine ayni isimli birden fazla sinif bildirilemez. Fakat farkli isim alanlarinin ierisinde ayni isimli siniflar bildirilebilinir. Isim alanlari isim akimasini engellemek iin dnlmtr. C# ve .NET ortami bileen (component ) tabanli bir ortamdir. Yani biz bu ortamda bakalari tarafindan yazilmi geleri siklikla kullanmaktayiz. rnegin bir projemizde A ve B firmalari tarafindan yazilmi ktphaneleri bir arada kullanmakta isteyelim. Eger isim alanlari olmasaydi birbirinden habersiz bu iki firma tesadfen bazi siniflarina ayni isimleri vermi olabilirdi. Biz de bunlari kullanirken problem oluurdu. Hlbuki isim alanlari sz konusu oldugunda siniflarini farkli isim alanlarina yerletirecektir ve byle bir isim akimasi olumayacaktir. Bir isim alani ierisindeki sinif diaridan isimalani ismi belirtilerek (X.Sample, Y.Sample) gibi kullanilir. I ie isim alanlari bildirilebilinir. rnegin: namespace X { namespace Y {
}
} Hi bir isim alani ierisin de olmayan di blgede bir isim alani belirtir. Buraya global isim alani denilmektedir. Global isim alani ierisinde siniflar bildirilebilinir. Fakat bu durum tavsiye edilmemektedir. Kapsayan isim alaniyla kapsanan isim alanlari farkli isim alanlaridir. Bu isim alanlarinda ayni isimli siniflar bulunabilir. Ayni isim alani ierisin de ayni isim alanlari birden kez bildirilebilinir. Ayni isim alanin ierisinde ki ayni isim alanli isim alanlari birletirilmektedir. rnegin: namespace X { class Sample {
}
} namespace X { class Test {
} }
76 Mert KPRC(mrtkprc@gmail.com) Sayfa 77 / -206- Farkli isim alanlari iersindeki ayni isimli isim alanlari birletirilmez nk bunlar farkli isim alanlaridir. Hi bir isim alani tek hamle de bildirilebilir. rnegin: namespace X.Y { class Sample {
} }
%u )ildirimli e/lenei /-yledir! namespace X { namespace Y { class Sample {
} } } System isim alani, .NETin kendisi iin ayrilmitir. Buraya ekleme yapilabilir ama tavsiye edilmez. KTPHANE DOSYALARI Ierisinde derlenmi bir biimde siniflar ve metotlar bulunan dosyalara ktphane denilmektedir. Ktphane dosyalari statik ve dinamik olmak zere ikiye ayrilmaktadir. .NET dnyasin da yalnizca dinamik ktphaneler kullanilmaktadir. Windowsta statik ktphanelerin uzantisi : .lib dinamik ktphanelerin uzantisi ise: .dll biimdedir. Aslinda .exe ile .dll dosyalarinin formatlari tamamen aynidir. Bu formata PE(Portable Executable) format denilmektedir. .exe ile .dll dosya arasinda ki tek fark .exe dosyanin bir balangi noktasina (entry point) sahip olmasidir. Dolayisiyla .exe alitirilabilir fakat .dll alitirilamaz. Anahtar Notlar: Bir .dll ierisinde bir Main metotu olabilir fakat artik bu metot bir baslangi noktasi belirtmez yani siradan bir metottan hi bir farki yoktur. Anahtar Notlar: .NET dunyasinda ara kodlara ynetilen kodlar (managed codes) , doal kodlara ynetilmeyen kodlar(unmanaged codes) da denilmektedir. Bir .dll ve .exe dosyanin ierisinde doal(unmanaged) kodda bulunuyor olabilir ara kodda(managed) bulunuyor olabilir. Bu nedenle biz .NET dunyasin da ierisin de ara kod bulunan .dllleri kullanabiliriz. rnein: C de olusturulmus bir .dll kullanamayiz. Anahtar Notlar : .NET dunyasinda ara kod ieren .exe ve .dll dosyalarina assembly dosyalari da denilmektedir. Bir .exe yada .dll dosyasinin ara kod ierip iermedii bakar bakmaz anlasilamaz unku bu dosyanin bazi blgelerinde ki yerleri de incelemek lazim bunu anlayabilmek iin ildasm yada peerif! programlarindan faydalanabiliriz.
DLL DOSYASININ OLUTURULMASI Bir dll komut satirindan oluturmak iin tek yapilacak ey derleme ileminde /target: library seenegini kullanmak gerekir. /target yerine /t de yazilabilir. rnegin: csc "target:li#rar! sample.cs 77 Mert KPRC(mrtkprc@gmail.com) Sayfa 78 / -206- Aslinda bl target seenegi yanina 4 argman alabilmektedir. /target: exe, /target: winexe, /target: library, /target: module
* /target : exe Bu seenek default seenektir yani hi seenek kullanilmadiginda / target: exe seenegi kulanilmi gibi ilem yapilir. Bu seenekte console exe dosyassi olulturulur. Console programlar alitirilirken iletim sistemi tarafindan default olarak bir siyah console ekrani yaratilir. (Zaten Console pencersinden program alitiriliyorsa ayrica ailmaz) TAbi bir console programi GUI pencerelri de oluturabilinir. * /target :winexe Bu seenek normal exe dosyasi oluturur. Normal .exe programlari alitirildigin da iletim sistemi tarafindan ayrica Console penceresi yaratilamaz. Bu seenek GUI programlari oluturmak iin siklikla kullanilmaktadir. * /target :library Bu seenek dll dosyasi oluturmak iin kullanilir. * /target :module Bu seenek modl dosyasi oluturmak iin kullanilir. Modl dosyalar sonraki kurslarda ele alinmaktadir.
IDE KULLANARAK DLL OLUTURMAK OLDUKA KOLAYDIR Bunu bo bir proje yaratilir ierisine code dosyasi eklenir. Bundan sonra proje seeneklerine gelinir. Outtype Class Library olarak seilir. 14.Hafta 2.Gn (04 Eyll 2011) )LL@L,-*N K'LLANILMSI Bir .dll kullanabilmek iin derleme aamasinda o dll'leri referans etmek gerekir. Ayrica o dll'lerin program alitirirken ayni dizinde bulunmasi da gerekmektedir. Dllle referans etme ilemi csc komut satiri derleyicisinde /reference : <dll ismi> yada /r : <dll ismi>eklinde yapilir. rnegin: csc /reference: test.dll sample.cs Bir dll referans edildiginde derleyici o dllle bakarak onun ierisindeki tm siniflari siniflarin elemanlarini vs. grebilmektedir. Anahtar Notlar : .NET ortaminda derlenmis ve .exe .dll yapilmis bir kod ierisinde hangi isim alanlarinin olduu hangi siniflarin olduu bu siniflarin hangi metotlarinin olduu, hatta bu metotlarin geri dnus deerlerinin ve parametrik yapilarinin ne olduu PE formatinin meta data tablosu denen blumunde bulunmaktadir. Zaten reflocter gibi decompiler programlari bu bilgilerden faydalanarak ters dnusturmeyi yapmaktadir. C#da sinif bildirimlerinin baina public ve internal olmak zere iki eriim belirleyicisinde biri getirilebilinir. internal ilgi assembly dosyasina referans edilse bile o sinifin diaridan kullanilamayacagi anlamina gelmektedir. Hlbuki public referans edildigi takdir de o sinifin diardan kullanilabilecegi anlamina gelmektedir. Default durum internal oldugu iin biz dll iindeki sinifimiz public yapmazsak onu diaridan kullanamayiz. Yani internal bir sinif ayni assembly den kullanilabilinir fakat baka bir assemblyden referans edilse bile kullanilamaz. .est0.dll olu/turma( 78 Mert KPRC(mrtkprc@gmail.com) Sayfa 79 / -206- namespace CSD { public class Test { public int a; public Test(int x) {
a = x; } public void Disp() { System.Console.WriteLine(a);
} public static void Foo() { System.Console.WriteLine("Foo"); } }
}
Sample0.1s olu/turma( namespace CSD { class App { public static void Main() { Test t = new Test(20); t.Disp(); Test.Foo(); } } } 2omut Sat&r&ndan 3erleme csc /target:exe /reference:Test1.dll Sample1.cs *Bir dll baka bir dll `i kullaniyor olabilir. Yani rnegin: Biz bir dll yazarken baka bir dll ierisindeki siniflari kullaniyor olabiliriz. rnegin: csc /t:library /r:a.dll b.cs Burada b.dll dosyasi oluturulmak istenmitir. Oluturulan bu b.dll dosyasi a.dll dosyasi ierisindeki siniflari da kullanmaktadir. imdi biz yalnizca b.dll ierisindeki siniflari kullanan c.cs dosyasi oluturmak isteyelim csc /t:exe /r:b.dll c.cs Burada biz bu projeyi baka bir makinaya taiyacaksak hem a.dll `nin hem b.dllnin hem de c.exe `nin ayni dizine kopyalanmasi gerekmektedir. Anahtar Notlar : Visual Studio IDEsinde proje sablonu olarak Class Library seilirse bu durumda IDE projeyi dll projesi olarak ayarlamakta ve projenin ierisine ii bos bir sinif yerlestirmektedir. 79 Mert KPRC(mrtkprc@gmail.com) Sayfa 80 / -206- Bir Dll `e IDEden Referans etmek iin Solution Explorerda References kismina gelerek baglam mensnden Add Reference seilir Browse sekmesine gelerek ve ilgili dll seilir. Ayrica IDE bir dll referans edildiginde onu gizlice exe dosyanin bulundugu dizine de kopyalamaktadir. Anahtar Notlar : Bir Solution projeleri tutan bir kap gibidir. Bir birbirleriyle ilgili projeleri ayni solution ierisine yerlestirirsek onlari daha iyi ynetebiliriz. rnein tipik olarak bir solution ierisine bir dll projesi bir de exe projesi yerlestirebiliriz. Bu durumda nerilen organizasyon Solution iin bir dizin yaratilmasi her proje iin de ayri bir dizin yaratilmasidir. Bunu salamanin iki yolu vardir.
1-)File/New/Project seilir Project Types olarak Visual Studio Solutions Template olarak da Blank Solution seilir. Bu ii bos bir proje olusturur. Ondan sonra bu solution Solution Explorerda balam menusu kullanarak proje eklenir. 2-)Solution ile Onun ierisine yerlestirecek ayni anda yaratilabilinir. Bunun iin File/New/Project Seilir Create Directory For Solution arpilanir. Solution ismi ve Proje ismi ayri ayri verilir. ZEL VE PAYLAILAN DLL'LER .NET dnyasinda dll kullanimi zel(private) ve paylaml (shared) olmak zere ikiye ayrilmaktadir. zel Dllleri projeyi setup yaparken .exe 'nin bulundugu dizine kopyalamak gerekir. Bizim imdiye kadar uyguladigimiz yntem buydu. Bu yntemin bazi avantajlari ve dezavantajlari vardir. Eger ayni dll kullanan birden fazla proje varsa zel dll gereksiz biimde ayni dosyanin tekrar ilgili dizine kopyalanmasi gerekmektedir. Hlbuki paylailan dll ynteminde Dll Dosyasi toplamda bir kez zel bir yere yerletirilmektedir. Sistem onu zel dizinde aranmaktadir. Bu zel Dizine GAC( Global Assembly Cache ) denilmektedir. Fakat GAC dll yerletirmeden nce bazi ilemlerin yapilmasi gerekmektedir. GAC dll yerletirmek kursumuzun kapsami diindadir. .NET 'in SINIF KTPHANES ve DLL'LER .NET `in kendi siniflari da bir takim dlller ierisine yerletirilmitir. .NET ortami kurulurken bu Dlller GAC yerletirilir. Bizde bu siniflari kullanirken ayrica o dllleri tekrar tekrar exe dosyamizin bulundugu yere kopyalamak zorunda degiliz. Tabi yine bunu referans etmek zorundayiz. Bir dll GAC da bulunuyor olsa bile yine ona referans edilmeli fakat GACdaki bir dllin ayrica program aliirken yeniden proje dizinde bulunmasina gerek yoktur. .NET `teki en ok kullanilan siniflar(fakat tm siniflar degil) mscorlib.dll iindeki dll dosyasina yerletirilmitir ve csc derleyicisi otomatik olarak bu dlle referans etmektedir. Eger bir sinif mscorlib.dll `in ierisindeyse ona referans etmemize gerek yoktur. Fakat baka bir dll ierisindeyse ona referans etmemiz gerekir. .NET `in kendi dll in referans etmek iin IDEde Add Reference diyalog penceresinde ki .NET sekmesi kullanilir. Anahtar Notlar : Dllle isim alanlarinin hi bir ilgisi yoktu dlller fiziksel bir kap isim alanlari mantiksal bir kap grevini grmektedir. Bir dll in ierisinde birden fazla isim alani bulunabilir. O halde biz bir kutuphane iindeki sinifi kullanirken onun hangi dll ve hangi isim alani ierisinde olduunu bilmemiz gerekmektedir. Anahtar Notlar : string sinifi ile char turden bir dizi birbirlerine aristirmaktadir. string sinifi karsilastirmaya toplamaya olanak saladii iin ok da islevseldir. Fakat bir yaziyi char turden bir dizide saklamanin da bazi avantajlari olabilmektedir. rnein 80 Mert KPRC(mrtkprc@gmail.com) Sayfa 81 / -206- dizi elemanlari deistirilebilinir. Bir string ten char turunden bir dizi elde etmek iin string sinifinin ToCharArray Metotu kullanilir(statik olmayan metot) rnein:
// string i char dizisine evirme string s = "ankara"; char[] c; c = s.ToCharArray(); Benzer biimde char turden bir diziden de string sinifinin baslangi metotu yoluyla da string nesnesi elde edilebilinir. rnein: // char dizisinden bir seyi string yapma string k = new string(c); 15.Hafta 1.Gn (10 Eyll 2011) Dernek Tatili 15.Hafta 2.Gn (11 Eyll 2011) Dernek Tatili 16.Hafta 1.Gn (17 Eyll 2011) SM ARAMA LEM(NAME LOOKUP) Derleyici bir isimle karilatiginda bu isme ilikin bir bildirim arar. Her ismin iin bir bildirim bulunmak zorundadir. Isim eitli faaliyetler arasinda sirasiyla aranir. Bulundugunda arama kesilir. Isim bulunamazsa error oluur. Isim aramasi niteliksiz (unqualified) ve nitelikli(qualified) olmak zere iki biimde yapilir. Dogrudan yazilmi isimler niteliksiz olarak. Nokta operatrnn sagindaki isimler nitelikli olarak aranmaktadir. A.B gibi bir ifade de A ismi niteliksiz olarak B ismi nitelikli olarak aranir. *NTELKSZ SM ARAMA KURALLARI 1-)Isim bir metot ierisinde kullanilmisa metotun yerel bloklarinda ierden diariya dogru aranir. 2-)Isim kullanildigi durumun iinde bulundugu sinif bildiriminin her yerinde aranir. (rnegin bir isim hem metot ierisinden hem de sinif bildirimi ierisinde bildirilmi olabilir. Bu durumda metot ierisinde o ismi kullandigimizda metot ierisinde bildirilmi olan isme eriilir. Anahtar Notlar: Bildirilmekte olan isim aranmaz bunun disinda butun isimler aranir. rnein: Sample s; burada aranan Sampledir, s aranmaz. rnein: class Sample { } Burada ise Sample aranmaz unku bir bildirimdir. 3-)Isim kullanildigi sinifin iinde bulundugu isim alaninin her yerinde aranir. 4-)Isim kullanildigi sinifi kapsayan isim alanini kapsayan isim alanlarinda onlarin her yerinde iten dia dogru sirasiyla aranir. Isim nihayet global isim alaninda da aranir. *NTELKL SM ARAMA KURALLARI .(NOKTA) operatrnn saginda isimler nitelikli solundaki isimler niteliksiz olarak aranir. Nokta operatrnn sol tarafinda bir isimalani ismi, bir sinif ismi ya da referans belirten bir ifade olabilir. Eger sol taraftaki bir isim; bir isim alani ismi sag taraftaki isim o isim alani ierisindeki bir bildirim olmak zorundadir. Eger sol taraftaki isim bir sinif ismi ise 81 Mert KPRC(mrtkprc@gmail.com) Sayfa 82 / -206- sag taraftaki isim o sinifin bir elemani olmak zorundadir. Eger sol taraftaki isim bir referans ismi ise sag taraftaki isim yine o sinifin bir elemani olmak zorundadir. 1-)Nokta operatrnn solunda bir isimalani ismi varsa sagindaki isim yalnizca o isim alaninin her yerinde aranir. Kapsayan isim alanlarina bakilmaz. 2-) Nokta operatrnn solunda bir sinif ismi varsa sagindaki isim yalnizca o sinif bildiriminin her yerinde aranir. (Sinifin taban siniflarinda da arama yapilir) 3-)Nokta operatrnn solunda bir referans ismi varsa sagindaki isim o referansin ilikin oldugu sinif bildiriminin her yerinde aranir. Baka bir yere bakilmaz. (Sinifin taban siniflarinda da arama yapilir) Anahtar Notlar: Bir dll referans edildiinde derleyici meta data bilgilerinde faydalanarak o dll ierisindeki tum bildirimleri sanki biz kendimiz olusturmusuz gibi isim aramasina dahil etmektedir. rnein System.Console.WriteLine gibi bir ifade de System ismi niteliksiz aranirken global isim alaninda bulunur. unku bu isim alani mscorlib.dll ierisinde zaten bildirilmistir.
using )irektiAi using direktifi eger bir akima yok ise niteliklendirmeyi ortadan kaldirarak kolay bir biimde isimlerin kullanilmasini saglamaktadir. using direktifinin genel biimi yledir. using <isim alani ismi>; Buradaki isim alani ismi niteliksiz olabilir ya da nitelikli olabilir. rnegin: using direktifinde ki isimalani isimleri aramaya sokulur. using direktifleri isim alanlarinin baina yerletirilmek zorundadir. Yani using direktifinden nce bir sinif bildirimi bulunamaz.
namespace CSD {
using A; using B; }
(ERROR 454673437R) namespace CSD { class X {
//... } using A; // Error class Y { //.. } //.. }
using direktifi global isim alaninda yerletirebilir. Bu durumda Kaynak kodun tepesine yerletirilmelidir. using direktifin de iki isim alani sz konusudur : Direktifin yerletirildigi isim alani ve direktifte belirtilen isim alani. using direktifi yle etki gsterir: Bir isim niteliksiz isim arama sirasinda using direktifinin yerletirildigi isim alanina kadar ve o isim alaninda bulunamamisa using direktifiyle belirtilen isim alanina da bakilir. rnegin : .NETin siniflarinin ogu System alani ierisinde olduguna gre biz bu isim alanina using direktifi kullanarak artik bu isim alanini ismini kullanmak zorunda kalmayiz. 82 Mert KPRC(mrtkprc@gmail.com) Sayfa 83 / -206- using direktiflerinin yerleim sirasinin bir nemi yoktur. Bu nedenle biri isim direktifinde belirtilen birden fazla isim alaninda bulunuyorsa bu durum error oluturur. namespace CSD { using MyCompany; using YourCompany; class App {
public static void Main() { Sample s; // ERROR }
}
} namespace YourCompany { class Sample {
} } namespace MyCompany { class Sample {
} }
using direktifinin geililik zelligi de yoktur. Yani isim using direktifiyle belirtilen isim alaninda bulunamadiysa artik o isim alanindaki isimlerin bir nemi yoktur. namespace CSD { using MyCompany; class App {
public static void Main() { Sample s; // ERROR }
}
} namespace MyCompany { using YourCompany; }
namespace YourCompany { class Sample {
} } using direktifi nitelikli aramalarda etkili olmaz. rnegin: MyCompany.Sample gibi bir ifade de Sample ismi MyCompany ierisinde aranir orda using direktifleri dikkate alinmaz. 83 Mert KPRC(mrtkprc@gmail.com) Sayfa 84 / -206- ***(NEMLI) using direktifiyle belirtilen isim alaninda arama yapilirken orada isim alani isimleri grlmemektedir. using ALIAS BLDRM using alias bildirimi uzun bir ismi kisaltmak iin kullanilir. Bildirimin genel biimi yledir. using <isim> = <isim alani ismi yada sinif ismi> isim alani ismi yada sinif ismi nitelikli olabilir. Bu nitelikli isim iindeki geen isimler isim aramasina sokulur. rnegin: using Smp= MyCompany.Sample; burada smp demek ile MyCompany.Sample demek ayni eydir. using alias direktifleri de isim alanlarinin baina yerletirilmek zorundadir. Metot ismi ya da sinif elamanlari bu bildirim ile isimlendirilemezler. using alias bildirimi ile using direktifi arasina yerletirme sz konusu oldugun bir siralama sz konusu degildir fakat using alias bildiriminde ki niteliksiz isimler aranirken yerletirildigi isim alaninda bulunan using direktifleri ele alinmaz fakat daha di isim alanlarindakiler dikkate alinir. rnegin: using YourCompany; namespace CSD { using MyCompany; using Smp = Sample; } Burada Sample ismi iin MyCompany isim alanina bakilmaz eger bulunamamisa YourCompany isim alanina bakilir. : : Operatr (K NOKTA K NOKTA OPERATR) rnegin ACompany ve BCompany de iki farkli ktphane aldik diyelim Biz bu iki irketin dllne de referans etmeliyiz phesiz bu irketler kendi siniflarini kendi isim alanlari ierisinde yazmitir. Bunlara kolay kullanabilmek iin aagidaki gibi using direktiflerini kullanabiliriz. akimayan isimlerde bir problem ikmayacaktir akian isimlerde ise bizim niteliklendirme yapmamiz gerekmektedir. Peki, tesadfen bu iki firmada isim alanlarina ayni ismi vermise ne using direktifi ne de niteliklendirme gereksinimizi zmez. Ite bu durumda iki nokta iki nokta :: yetimektedir. referans ettigimiz dlller program iinde birbirlerinden ayrilabilir. Bunun iin dll `e referans ederken ayni zamanda ona bir isimde verebiliriz. Isim verme ilemi CSC derleyicisinde /reference seeneginde aagidaki gibi yapilmaktadir. Biz eskide referans etme ilemini sadece yle yapiyorduk /r:ACompany.dll imdi ise /r:ACompany=ACompany.dll bu ekledigimiz isme iki nokta iki okta operatrnn sol tarafinda kullanabilir. Bu operatrn sag tarafinda o dllin global isim alanindaki herhangi bir ismi bulunabilir. dll ` e takma ismi vermek IDEden gerekletirilebilir. Bunun iin Reference edilen dllin stne gelinir farenin sag tuuna basilir property mens ailir Aliases edit alanina giri yapilir. Belirtilen dll ismini program iinde kullanabilmek iin ayrica external alias denilen bir direktif uygulamak gerekir. Bu direktifin genel biimi yledir extern alias <isim> ; external alias direktifi yine isim alanlarin baina yerletirilmek zorundadir. Isim alanlarin bainda nce external alias direktifi sonra using direktifi using alias bildirimleri bulunmalidir. zel Bir Durum olarak iki nokta iki nokta operatrnn sol tarafindaki isim global isim anahtar szcg olarak girilebilir. Bu zel durum kendi uygulamamizin global isim alanina eritigimiz anlamina gelir rnegin :
namespace CSD { class App { public static void Main() 84 Mert KPRC(mrtkprc@gmail.com) Sayfa 85 / -206- {
global::System.Console.WriteLine("TEST"); } } namespace System {
} } yani global iki nokta iki nokta ile aramaya her zaman global isim alanindan itibaren yapilir. 16.Hafta 2.Gn (18 Eyll 2011) BRDEN FAZLA KAYNAK KODLA DOSYA LE DERLEME LEM Byk bir programi tek bir kaynak dosyada yazmak kt bir tekniktir. nk yle bir durumda kodun ynetilmesi gleir. Uygulamada bir proje kaynak dosyalari blnp yle derlenmektedir. Birden fazla dosya ile derleme yapilirken komut satirinda tm dosya isimleri belirtilir. rnein ! * csc a.cs b.cs c.cs => burada main hangi kaynak dosyada ise onun ismiyle exe olusur. * csc /t:exe /out:project.exe a.cs b.cs c.cs => burada ise exe dosyasi olusacak ve exenin ismi out: ile bildirilmistir. Benzer biimde bir dll dosyasi da syle olusturulabilinir. * csc /target:library a.cs b.cs c.cs => burada ise dll olusacak ve ilk yazilan kaynak dosyanin ismi ile olusacak Peki, hedef dosyalarin isimleri ne olacaktir. Eer exe derlemesi yapiliyorsa dosyanin ismi Main metotu hangi dosyada ise onun ismi olarak alinir. Fakat dll derlemesi ise komut satirinda ilk yazilan dll ismi olur. Ancak her iki durumda da istediimiz ismi biz "o$t:%dos!a.ismi& seenei ile belirtebiliriz. rnein : csc /t:exe /out:project.exe a.cs b.cs c.cs => burada ise exe dosyasi olusacak ve exenin ismi o$t: ile bildirilmistir. %irden 8a'la (ayna( dosya ile 9al&/ma da )ir dosyada )ildirdiimi' s&n&8& dier )ir dosyadan (ullana)iliri'. %unu ayn& assem)lyinin )ir par9as&d&r. Anahtar Notlar: Birden fazla kaynak dosya ile derleme yapilirken adeta bu dosyalar tek bir dosya da birlestirilip tek dosya ile derleme yapiliyormus gibi bir etki olusur. Ancak using direktifleri using alias bildirimi external alias direktifleri yalnizca o kaynak dosyada etki gstermektedir. IDE kullanarak birden fazla kaynak dosya ile derleme ilemi olduka kolaydir. Tek yapilacak ey Projeye birden fazla kaynak dosya eklemektir. Bu durumda exe dosyanin ismi proje ismiyle ayni olur. Fakat IDEDEN bu isim degitirilebilinir. SINIFLARDAK TEMEL ERM KURALLARI Sinifin tm elemanlarinin nne eriim belirleyici anahtar szckler getirilebilinir. Bunlar aagida listelenmitir. *public *protected *private 85 Mert KPRC(mrtkprc@gmail.com) Sayfa 86 / -206- *internal *protected internal default durum private biimindedir. Siniflardaki temel eriim kurali yledir 1-)Sinifin diindan (yani baka bir sinif ierisinden) bir referans ismi ya da sinif ismi yoluyla sinifin yalnizca public blmn eriilebilinir. 2-)Sinifin kendi ierisinden sinifimizin her blmne eriebiliriz. Anahtar Notlar: Sanki sinifimiz blumlerden olusuyormus gibi dusunebiliriz. rnein sinifin public blumu denildiinde tum public elemanlar anlasilmalidir. *Protected ve private blumler arasinda turetme olduunda fark sz konusu olur. *internal blum ayni assemblyden public baska bir assemblyden private etkisi yaratan blumdur. Protected internal ise ayni assemblyden public baska assemblyden protected etkisi yaratan blumdur. NESNE YNELML PROGRAMLAMA TEKNG NEDR ? Nesne ynelimli programlama tekniginin tek bir cmle ile tanimini yapmak zordur. Fakat siniflar kullanarak yazma teknigi denilebilinir. Nesne ynelimli programlama teknigi bir takim anahtar kavramlarin birleimidir. Btn bu anahtar kavramlar projeyi daha kolay algilamamiza hizmet etmektedir. KAPSLLEME (ENCAPSULATION) KAVRAMI Bir sinif iin iki baki aisi sz konusudur. Sinifi yazan kiinin baki aisi ve kullanan kiinin baki aisi. Sinifi yazan kii sinifin her blmn bilmek zorundadir. Fakat kullanan kiinin sinifin ayrintilarini bilmesine hi gerek yoktur. Biz de gnlk hayatta pek ok aygiti onlarin ayrintilarini bilmeden kullanmaktayiz. Kapslleme bir sinifin i ileyie ilgili ayrintili zelliklerinin private blmde gizlenmesi ve sadece ona public metotlarla eriilmesi anlamina gelmektedir. Bylece sinifi kullanan kiilerin kafasi karimaz. rnegin bir sinifin DoSomethingImportant isimli faydali bir metotu olsun. Bu metotda iini yaparken Foo(),Bar() ve Tar() metotlarini agiriyor olsun. Sinifi diaridan kullanacaklar iin Foo,Bar ve Tar hi bir anlam ifade etmez eger biz bu metotlari public blmlere yerletirirsek diaridakilerin kafasini karitirmi oluruz. Bu rnekte DoSomethingImportant public blme yerletirilmeli Foo,Bar ve Tar metotlari private blmde gizlenmelidir. class Sample { //.. public void DoSomethingImportant() { Foo(); //.. Bar(); //... Tar(); } private void Foo() { //.. } private void Bar() { //..
} private void Tar() { //.. } } 86 Mert KPRC(mrtkprc@gmail.com) Sayfa 87 / -206- O halde bir sinifin kullanicilar iin dokmantasyonunu yaparken diardan eriilmeyecek blmlerin aiklanmasina gerek yoktur. VER ELEMANLARININ GZLENMES(DATA HDNG) Genellikle bir sinifi yazanlar sinifin veri elemanlarini private blme yerletirerek onlari diaridan gizlerler. Bu nesne ynelimli programlama tekniginin diger bir anahtar kavramidir. Veri elemanlari i ileyie ilikindir. Sinif kullanan kiilerin siniflarin i ileyiini bilmeleri gerekmemektedir. Sinifin veri elemanlarini private blmlerine yerletirdigimizde onlara diaridan eriemeyiz eger diaridan erimek istiyorsak bu eriimi yapan public dzeyde kk get ve set metotlari yazmamiz gerekmektedir. rnegin: class Sample { public int val; public int GetVal() { return val; } public int SetVal(int v) { val = v; }
} Sample s = new Sample(); int x; s.SetVal(10); x = s.GetVal();
Bu tr get ve set metotlarina private elemanlarina eriimde kullanilan eriimci metotlar denir. Grldg gibi diaridan veri elemanlarina dogrudan degil get ve set metotlarini kullanarak dolayli olarak erimekteyiz. class Date {
private int day, month, year;
public int GetDay() { return day ; } public void SetDay(int d) { day = d; } public int GetMonth() { return month; } public void SetMonth(int m) { month = m; } public int GetYear() { return year; } public void SetYear(int y) 87 Mert KPRC(mrtkprc@gmail.com) Sayfa 88 / -206- { year = y; }
} Date date = new Date(); date.SetDay(10); date.SetMonth(12); date.SetYear(2007);
System.Console.WriteLine("{0}/{1}/ {2}",date.GetDay(),date.GetMonth(),date.GetYear()); Grldg gibi veri elemanlarini private blme koydugumuzda onlara diardan eriemeyiz. Ancak get ve set metotlari ile eriebiliriz. VER ELEMANLARIN PRVATE BLME YERLETRMENN FAYDALARI 1. Deneyimler gstermektedir ki sinifin veri elemanlarinin isimleri ve trleri ok sik degitirilmektedir. Eger biz veri elemanlarini public blme yerletirirsek bu elemanlari diaridakiler dogrudan kullanabilir bunlar zerinde degiiklik yapildiginda bunlari kullanan kodlari degitirmek gerekir. Normal olarak sinifi kullanan kodlar sinifin kendi kodlarindan daha fazladir. Dolayisiyla veri elemanlarinda degiiklikler yapildiginda onlari kullanan kodlarin bu degiikliklerden etkilenmemesi hedeflenir. Ite biz veri elemanlarina public get ve set metotlariyla eritigimizde artik o veri elemanlari degitirildiginde onlara erien kodlar bundan etkilenmez ve tabi biz get ve set metotlarinin iini yeni duruma uygun olarak yeniden yazmaliyiz. Bunlari yazarken metotlarinin parametrik yapilarini ve geri dn degerlerini degitirmememiz gerekmektedir. 2. Sinifin birbirileriyle iliki veri elemanlari bulunuyor olabilir. rnegin birisini degitirdigimizde digerlerinin de degitirilmesi gerekebilir. Yani veri elemanlari arasinda belli bir ilikiyi korumak gerekebilir ite eger biz veri elemanlarini public blme yerletirirsek tm bu ilikileri kullanicinin saglamasi gerekir. Hlbuki private blme yerletirip diardan gizlersek kullanan kii bunlari hi bilmek zorunda kalmaz bylece hem hata olumaz hem de sinif daha rahat kullanilir. 3. Bazen bir veri elemanin iindeki degeri alma ve ona yeni bir deger yerletirme sirasinda bir takim ek ilemler yapilabilmektedir. rnegin: SerialPort isimli bir sinifta Portun hizi bir veri elemaninda saklaniyor olabilir fakat bu veri elemanini degitirmekle portun hizi degimez. Bizim ayrica portu programlamamiz gerekir. Ite biz bu veri elemanini private blme yerletirip ona get ve set metotlariyla eriimi saglarsak bu ek ilemleri bu metot ierisinde yapabiliriz. 4. Bazi veri elemanlarina atanabilecek degerlerin belli sinirlari ve koullari vardir. rnegin date sinifinda day veri elemanina yz gibi bir degeri atayamayiz ite veri elemanlari public blme yerletirilirse hi bir sinama yapilamaz. Fakat bunlarin private blme yerletirilip atama set metotuyla yapilirsa bu metot ierisinde geerlilik kontrolleri yapilabilir. 17.Hafta 1.Gn (24 Eyll 2011) Tabi yukaridaki 4 maddenin de hi biri geerli olmayabilir bu durumda veri elemanlarini dogrudan public blme yerletirebiliriz. Veri elemanina dogrudan erimek mikro dzeyde daha hizlidir. Bu nedenle hizin gerektirdigi durumlarda yukaridaki 4 madde sz 88 Mert KPRC(mrtkprc@gmail.com) Sayfa 89 / -206- konusu degilse (hizin gerektirdigi durumlar ok nadirdir) veri elemanlari public blme yerletirilebilinir. SINIFIN PROPERTY ELEMANLARI Property elemanlarina erimekte kullanilan bir eit get ve set metotlaridir. Java ve C++ da property kavrami yoktur. Orada eriimler get ve set metotlariyla yapilir. Property aslinda get ve set metotlarini belirtir. Onlarin daha kolay yazilmasini ve kullanilmasini saglamaktadir. Property bildiriminin genel biimi yledir. <erisim belirleyicisi> <tur> <isim> { get { //... } setW { //... } }
* Bir property get ve set blmlerinden oluur. Bir property eleman deger alma amaciyla ya da atama amaciyla kullanilmaktadir. rnegin; int x; Sample s = new Sample(); s.Val = 10; // deer atama amaciyla x = s.Val+20; // deer alma amaciyla System.Console.WriteLine(s.Val); // Deer Alma Amaciyla kullanilmaktadir. Propertyin get ve set blmleri birer metot gibidir. Get Blm parametresi olmayan geri dn degeri property trnden olan bir metot gibi alimaktadir. Get Blmnde return deyimi kullanilmak zorundadir. Get blmnde tipik olarak private veri elemaniyla return edilir. rnegin: int x; Sample s = new Sample(); x = s.Val+20; *Burada propertyin get blm alitirilir burada elde edilen degere 20 toplanir ve xe atanir. Eger property olmasaydi ayni eyi biz yle yapabilirdik. int x; Sample s = new Sample(); x = s.GetVal()+20; *** Propertyin set blm geri dn degeri void olan parametresi property trnden olan bir metot gibidir. O propertye atama yapildiginda atanacak deger hesaplanir ve bu deger set blmne parametre olarak geirtilir. Bu degeri biz set blm ierisinde value anahtar szcg ile kullanabiliriz. using System; namespace CSD { class App { public static void Main() { int x; Sample s = new Sample(); s.Val = 10; x = s.Val + 20; Console.WriteLine(x); } 89 Mert KPRC(mrtkprc@gmail.com) Sayfa 90 / -206- } class Sample {
private int val; public int Val { get { return val; } set { val = value; } }
}
} ** value anahtar szcg get blmnde kullanilmaz yalnizca set blmnde kullanilabilinir. Get ve set blmleri herhangi bir sirada yazilabilinir. Bir propertynin yalnizca get blm olabilir yalnizca set blm olabilir ya da hem get hem de set blm olabilir. Yalnizca get metotu olan propertylere read-only propertyler denir. Yalnizca set metotu olan propertylere write only propertyler denir. Hem get/set blm olan propertylere Read/Write propertyler denir. Bir property bir private veri elemaniyla ilikili olmak zorunda degildir. rnegin propertynin get blmnde bir takim ilemler yapilip onun sonucu bize verilebilinir. Propertynin set blmnde ise deger bir takim ilemlerin sonucunda baka bir yere aktarilabiliyor olabilir. Propertyler veri elemani gibi kullanilan metotlardir.
using System; namespace CSD { class App { public static void Main() { Person p = new Person(); p.Name = "Hasan&Burak"; p.No = 345; Console.WriteLine("{0} {1}",p.Name,p.No); } } class Person { private string name; private int no;
public string Name { get { return name; } set { name = value; } } public int No { get { return no; } set { no = value; } } } } 90 Mert KPRC(mrtkprc@gmail.com) Sayfa 91 / -206-
Bir property eleman zel olarak ++ ya da - operatrleriyle ya da ilemli atama operatrleriyle kullanildiysa nce propertynin get blm alitirilir deger elde edilir ve sonra set blm alitirilir. Propertyler grselligin derecesini arttirabilmektedir. Bir sinifin yalnizca eitli property elemanlarina deger atamakla biz zaten iin belli blmn yapmi oluruz.
ENUM TRLER VE SABTLER. Bazen bir konuda az sayida seenek sz konusudur ve bu seenekleri belirtmek gerekir. rnegin Bir topu Move isimli metot drt ynden herhangi birisine hareket ettiriyor olsun yn de parametre olarak alsin. Metot un parametresi hangi trden olmalidir. int trden olabilir. :; < 0 =E>. < ? (.O;) R7@A. < B 3OCD<E
public void Move(int direction) { if (direction == 1) { } else if (direction == 2) { } //... }
Move(1); Move(3); Yukarida ki kodun okunabilirligi zayiftir. Koda bakan kii hangi sayinin hangi yne gittigini bilmek zorundadir. Diger bir seenek string ile belirtmek olabilir public void Move(string direction) { if (direction == "Up") { } else if (direction == "Right") { } //... } Move("Up"); Move("Left"); Yazilarla alimak sayilarla alimaktan daha yavatir. stelik bir harfi bile yanli yazsak kod alimak. rnegin: bir izim yapacakken renk belirtmek isteyebiliriz renklerde belirli bir sayida olabilir yada haftanin gnleri, yilin aylari hep kisitli sayida seeneklerden olumaktadir. Bu tr durumlarda seenekleri int tryle belirtmek hizlidir fakat okunabilir degildir yaziyla belirtmek okunabilirdir fakat hizli degildir. O halde yazi olarak temsil edilen sayilara gereksinim vardir. enum bildiriminin genel biimi yledir: enum <isim> { <enum sabit listesi> } enum sabit listesi virgllerle ayrilmi sabitlerden olumaktadir. Geleneksel olarak enum sabit isimlerinin ba harfi byk yazilir. Enum sabitlerinin eriim belirleyici anahtar szckleri yoktur. Zaten bunlar public kabul edilmektedir. Enumlarda bir tr 91 Mert KPRC(mrtkprc@gmail.com) Sayfa 92 / -206- belirtmektedir. Yani enum trnden degikenler belirtilmektedir. Enum trleri kategori olarak deger trlerine eittir. Adres degil degerin kendisi yerletirilir. Her enum tr farkli bir tr kabul edilir. Farkli enum trleri birbirlerine atanamazlar. Ayni trden iki enum birbirlerine atanabilir. Enum trleriyle tamsayi trleri arasinda dogrudan dntrme yoktur. enum sabitleri dogrudan kullanilmaz enum ismi ve nokta operatryle kullanilir. rnegin Direction.Down , Direcktion.Up gibi kullanilir. enum sabitleri ilgili enum trndendir. Bir enum degikenine ayni trden bir enum sabiti atanabilir. Enum sabitleri aslinda gizli birer sayi belirtmektedir. Ilk enum sabitinin sayisal degeri sifirdir(0).Sonraki her sabit ncekinden bir fazladir. enum Direction { Up, //0 Right, //1 Down, //2 Left //3
}
Enum trnden sabitlerde aslinda gizlice bir tamsayi tutmaktadir. Direction d; d = Direction.Down; //geerli d = 2; // error Bir enum degikeni Console sinifinin Write ya da WriteLine metotlariyla yazdirmak istesek enum degikeni ierisindeki sayisal deger degil onun yazisi yazdirilmaktadir. Bir enum sabitlerine eittir operatryle deger verilebilinir. Bu durumda sonraki sabit ncekinden bir fazla olur. Ayni degere sahip birden fazla enum sabit bulunabilir. Ayni trden iki enum karilatirma operatrleriyle karilatirma ilemine sokulabilinir. Bu durumda aslinda bu enumlarin belirttigi sayisal degerler karilatirilmaktadir. using System; namespace CSD { class App { public static void Main() {
Move(Direction.Right); Move(Direction.Down);
}
public static void Move(Direction a) { if (a==Direction.Down) { Console.WriteLine("Moves Down"); } else if (a == Direction.Left) { Console.WriteLine("Moves Left"); } else if (a == Direction.Right) { Console.WriteLine("Moves Right"); } else if(a==Direction.Up) { Console.WriteLine("Moves Up"); } } 92 Mert KPRC(mrtkprc@gmail.com) Sayfa 93 / -206-
} enum Direction { Up , Right, Down, Left }
} *enum degerleri switchde sokulabilir. Bu durumda case ifadeleri enum sabitlerinden olumaktadir. 17.Hafta 2.Gn (25 Eyll 2011) Her enum trnn ilikin oldugu bir tam sayi tr vardir. Enum trnn ilikin oldugu tam sayi tr enum isminden sonra iki nokta st steyle belirtilir. rnegin; eger ilikin olana tam sayi tr belirtilmezse default int kabul edilir. enum trnn ilikin oldugu tam sayi tr arkaplan da enum trnn taklit ettigi tam sayi trn belirtir. Bir enum trnden degiken belirtildiginde o degiken enum trnn ilikin oldugu tam sayi tr kadar yer kaplar. Tam sayi trlerinden enum trlerine, enum trlerinden de tam sayi trlerine tr dntrme operatryle(expilicit) dntrme vardir. rnegin biz bir tam sayi degerini tr dntrme operatryle bir enum degikenine atayabiliriz. enum Direction { Up, Right, Down, Left } Direction d; d = (Direction) 2; Direction d; d = (Direction) 200; enum degerine bu biimde atanan bir degerin bir enum sabitiyle temsil edilmi olmasi gerekmez. Bu durumda Write /WriteLine metotlariyla yazdirma yaptigimizda degikenin ierisindeki sayi ekrana yazilir. Tam sayi trlerinden enum trlerine dntrme yapilirken tamamen o tam sayi trnden enum trnn ilikin oldugu tam sayi trne dntrme kurallari yrrlktedir. (Aslinda tr dntrme operatryle gerek sayi trlerinden enum trlerine dntrme yapilir.) enum trlerinden tam sayi trlerine dogrudan dntrme yoktur fakat tr dntrme operatryle dntrme vardir. Tr dntrme ileminde sanki enum trn ilikin oldugu tam sayi trnden hedef tam sayi trne dntrme yapiliyormu gibi kurallar uygulanir. Bir enum trnden bir gerek sayi trne tr dntrme operatryle dntrme yapilabilmektedir. Bir enum trnden baka bir enum trne tr dntrme operatryle dntrme yapilabilir. Bu durumda enum trlerinin ilikin oldugu tam sayi trleri arasinda dntrme yapiliyormu gibi kurallar uygulanir. (Byk harf E) bir enum trn Byk harf I ise tam sayi trne ilikin oldugu belirtiyor olsun. Kk harf e byk harf E trnden bir deger kk harf i ise Byk harf I trnden ya da byk harf I trne dntrlen tr trnden bir deger olmak zere e+i ya da i+e ifadesi geerlidir. 93 Mert KPRC(mrtkprc@gmail.com) Sayfa 94 / -206- e + i yada i+e ileminin e degeri : (E)((I) e + i ) biimdedir. Yani bir enum tryle bir tam sayi tr toplandiginda ilgili enum trnden olur ve rnn sayisal degeri enum ierisindeki degerleri tam sayi degerinden elde edilen deger olur. Direction d = Direction.Right; int a = 1; Console.WriteLine(d+a); // SONU DOWN
Yukaridaki tanimlamalar eliginde e-i ilemi geerlidir i-e ilemi geersizdir.(Yani enum trnden tam sayi degeri ikaratabiliriz ama tam sayidan enum ikartamayiz). e-i ileminin e degeri = (E)((I) e - i ) . rnmz yine enumdur. Anahtar Notlar : ++e , e += n , e -= n deeri de geerlidir. unku e +=n ,n= e+n islemine esittir. Ayni trden iki enum degeri birbirinden ikartilabilinir. Elde edilen rn bu enum trnn ilikin oldugu tam sayi trndendir. Baka bir deyile kk e1, e2 Byk Harf E trnden olmak zere e1-e2 geerlidir ve sonu (I)e1-(I)e2 biimindedir. Yani iki enumu ikartirsak farki buluruz. Ayni trden iki enum toplama ilemine sokulamaz. arpma i blme gibi ilemlere sokulamaz. Fakat istisna bir durum olarak her enum trnden degikene sifir sabiti dogrudan atanabilir. (BU SADECE SIFIRA ZGDR) rnein: Direction d = 0; // geerli fakat Direction d = 1; // error
.NET SINIF KTPHANESNDE ENUM KULLANIMINA ETL RNEKLER .NET `in sinif ktphanesinde yalnizca siniflar yoktur. enumlarda vardir ileride grecegimiz baka trler de vardir. System. IO isim alani ierisinde Directory sinifinin GetFiles isimli metotlari bir klasr ierisindeki dosyalarin listesini elde etmek iin kullanilmaktadir. Bu metotun bir ka overload edilmi biimi vardir. Aagidaki GetFiles Metotu bizden klasrn yol ifadesini alir. Onun ierisindeki dosya isimlerini (yol ifadeleriyle birlikte) verir. public static string[] GetFiles(string path) {
94 Mert KPRC(mrtkprc@gmail.com) Sayfa 95 / -206- Aagidaki GetFiles Metotu yukaridakini kapsamaktadir fakat ayrica alt klasrleri de dikkate alabilmektedir.
public static string[] GetFiles(string path, string searchPattern, SearchOptionSearchOption) {
} Metotun nc parametresi searchOption trnden bir enumdur. Bu enum trnn TopDirectoryOnly ve AllDirectories isimli iki elemani vardir. TopDirectoryOnly yalnizca ilgili dizindeki dosyalari bulur. AllDirectories ise tm dizin agacinda ilem yapar.
foreach (string file in files) Console.WriteLine(file); Directory Sinifin GetDirectories metotlari ayni GetFiles metotlari gibi aliir fakat bu metotlar yalnizca dizin bulmaktadir. string[] dire = Directory. GetDirectories(@"e:\CSharp- Haziran","S*.*",SearchOption.AllDirectories);
foreach (string d in dire) Console.WriteLine(d); Anahtar Notlar : Bir enum turune iliskin enum sabitlerinin sayisal deerlerinin ne olduunu genellikle programcinin bilmesine gerek yoktur. Bu nedenle MSDN dokumanlarinda enum turunun sabitlerinin sayisal deerleri ou kez belirtilmez. Fakat bazi durumlarda bu sabitlerin sayisal deerlerini bilmek gerekli olabilir. Bu durumda MSDN yardim sistemi bu deerleri bize sylemektedir.
System.Windows.Forms.dll ierisinde bulunan System.Windows.Forms isimalani ierisindeki MessageBox sinifinin Show isimli statik metotlari Mesaj penceresi ikartmak iin kullanilmaktadir. Tipik bir Show metotu aagidaki gibidir. public static DialogResult Show(string text,string caption,MessageBoxButtonsbuttons,Messa geBoxIcon icon) {
}
Metotun birinci parametresi mesaj kutusunun ierisindeki grlecek metni belirtir. Metotun ikinci parametresi pencere baliginda grlecek yaziyi gsterir. nc parametre ikartilacak tu takimini belirtmektedir. Bu Parametre MessageBoxButtons isimli bir enum trdr. MessageBoxIcon ise bu parametre hangi iconun grntlecegini belirtir. Show metotlarinin geri dn degerleri DialogResult isimli bir enum trndendir. Geri dn degeri hangi tula ikildigini belirtir. DialogResult dr = MessageBox.Show("Save Changes", "Warning", MessageBoxButtons.YesNoCancel);
switch (dr) { case DialogResult.Yes: Console.WriteLine("Save and Exit"); 95 Mert KPRC(mrtkprc@gmail.com) Sayfa 96 / -206- break; case DialogResult.No: Console.WriteLine("Don't save and exit"); break; case DialogResult.Cancel: Console.WriteLine("Operation Cancelled"); break;
}
SINIFLARIN STATK PROPERTY ELEMANLARI Veri elemanlarin gizlenmesi ilemi statik veri elemanlari iinde uygulanmaktadir. Yani sinifin statik veri elemanlari da sinifin private blmne yerletirilmeli ve onlara public static get ve set metotlari ya da propertyleriyle eriilmelidir. rnegin class Sample { private static int val; public static int Val { get { return val; } set { val = value; }
}
} Sinifin statik property elemanlari; sinif ismiyle kullanilir. rnegin: Sample.Val = 10; 18.Hafta 1.Gn (01 Ekim 2011) DERS YOK 18.Hafta 2.Gn (02 Ekim 2011) &ABILA-.S(-'<('-,S1 Bir Yapi struct anahtar szcg ile aagidaki gibi bildirilir. struct <isim> { } Yapi bildirimi tamamen sinif bildirimi gibidir. Ancak yapilarin protected ve protected internal blmleri olamaz. Yapilarla siniflar arasindaki en nemli farklilik; siniflar referans trne ilikin oldugu halde yapilar deger trne eittir. Yapi degikenleri iin new ilemiyle yer ayirmaya gerek yoktur. Zaten yapi degikenleri kendisi bileik bir nesnedir. rnegin: struct Test { public int a; public int b;
} Test t; Yapi degikenleri yerel ise steakde yaratilir programin akiindan iktiginda yok edilir. 96 Mert KPRC(mrtkprc@gmail.com) Sayfa 97 / -206- namespace CSD { class App { public static void Main() { Test t;
} } Yapilarda metotlari, propertylere vs. sahip olabilirler. Yani onlarin kullanimi Siniflar gibidir. Bir yapinin btn elemanlarina deger atamadan yapiyi btnsel olarak kullanamayiz. Fakat deger atadigimiz elemani kullanabiliriz. Ayni trden iki yapi degikeni birbirine atanabilir. Bu durumda yapinin karilikli elemanlari birbirine atanmaktadir. rnegin: Test x ; Test y; x.a = 10; x.b = 20; y = x; // geerli
namespace CSD { class App { public static void Main() { Test x, y; x.a = 10; x.b = 20; y = x; x.Disp(); y.Disp();
} } struct Test { public int a; public int b;
public void Disp() { Console.WriteLine(a); Console.WriteLine(b); } }
} 97 Mert KPRC(mrtkprc@gmail.com) Sayfa 98 / -206- Bir sinif nesnesi new operatryle heap `da yaratilir. Bunlarin yok edilmesi p toplayici tarafindan yapilmaktadir. Ancak yapi degikenleri steakde yaratilir ve aki bloktan ikarken yok edilir. Steakde nesnelerin yaratilmasi ve yok edilmesi ok hizli yapilabilmektedir. Yapilarda metotlara parametre yoluyla aktarilabilinir. Tabi bu durumda yapinin karilikli elemanlari aktarilacaktir. Yapilarda da veri elemanlarini private blme yerletirilip onlara public propertylerle erimek iyi bir tekniktir. Fakat biz yapinin veri elemanlarini private blme yerletirdigimizde artik onlara propertylerle deger atayamayiz nk bir yapinin tm elemanlarina deger atamadan yapiyi btnsel olarak kullanamayiz. Yapi nesneleri de new operatryle tahsis edilebilmektedir. Ancak new operatryle bir yapi trnden tahsisat yaptigimizda tahsisat steakde yapilmaktadir. Steakde geici bir yapi nesnesi yaratilir. Onun iin balangi metotu agrilir. new ileminden de steakde yaratilmi geici yapi degikeni elde edilir. Biz bu geici yapi degikenini ayni trden bir yapi degikenine atayabiliriz bu durumda yapinin karilikli elemanlari birbirlerine atanacaktir en sonunda da yaratilan geici yapi degikeni yok edilir. Grldg gibi new operatryle bir yapi degikenini tahsis edilmesiyle sinif nesnesinin tahsis edilmesi farkli anlamlar ifade etmektedir. Yapilarinda balangi metotlari olabilir. Bizde bylece tm elemanlarina deger atanmi bir yapi degikeni elde edebiliriz. Animsanacagi gibi bir sinif nesnesi new operatryle tahsis edildiginde nce heap de tahsisat yapilir daha sonra sinifin tm veri elemanlari sifirlanir. Daha sonra balangi metotu agrilmaktadir. Ancak yapilarda new operatryle steakde geici degiken yaratildiginda o geici degikenin ii derleyici tarafindan sifirlanmamaktadir. Dogrudan balangi metotu agrilmaktadir. Bu nedenle C#da yapilar iin balangi metotu yazilirken balangi metotu ierisinde yapilarin tm elemanlarina ilk deger verilmesi zorunlu tutulmutur. *** Ayrica yapilar iin default balangi metotu programci tarafindan yazilamamaktadir. Yapilar iin default balangi metotu her zaman (programci yazsa yazmasa da) derleyici tarafindan yazilmaktadir. YAPILARA NEDEN GEREKSNM DUYULMAKTADIR? Bazi uygulamalarda az sayida elemana sahip olan bileik nesneler sika kullanilmaktadir. rnegin bir izim yapilirken yalnizca x ve y elemanlarina sahip point nesneleri binlerce kez kullanilabilmektedir. Eger yapilar olmasaydi bu kk nesnelere de siniflarla ifade edilirdi bunlarin yaratilmalari heapde yapildigi iin ve yok edilmeleri p toplayicilari tarafindan yapildigi iin bir miktar performans kaybi sz konu olabilirdi. Hlbuki point gibi bir nesne yapi ile ifade edilirse bunlar steakde ok hizli yaratilip yok edilmektedir. Peki, her ey yapi biiminde bildirsek ne olur. Yapi nesnelerin bloktan ikildiginda yok edilmesi pek ok durumda iimize gelmez. Yapilarin metotlara parametre yoluyla aktarilmasiyla eger yapi byk ise aktarim yava olur. Halbuki sinif nesnelerini metotlara parametre yoluyla aktardigimiz da sinif ne kadar byk olursa olsun. Biz yalnizca bir adres aktarmi oluruz. O halde eger ok siki yaratilip yok edilen nesneleri kullaniyorsak ve onlarin az sayida veri elemani varsa onlari yapi olarak bildirmek daha uygundur. C #'IN TEMEL TRLE VE YAPILAR Aslinda C#in temel trleri de bir yapi belirtmektedir. rnegin aslinda int tr System.Int32 trnn kisa ifade edilme biimidir. Yani; int a ; bildirimi ile 98 Mert KPRC(mrtkprc@gmail.com) Sayfa 99 / -206- System.Int32 a; Bildirimi tamamen esdeerdir. double b; b = 10.2; Temel trler birer yapi oldugunda gre ve yapilar iin default balangi metotlari derleyici tarafinda yazildigina gre aagidaki ilem geerlidir: double a = new double();
.N,( K?(?B=AN,S*N), $K K'LLANILAN %A+I &ABILA- .Net ktphanesinde yalnizca siniflar degil yapilarda vardir. DateTime YAPISI DateTime Yapisi System alani ierisindedir mscorlib.dll ierisinde bulunmaktadir. Bu yapinin amaci bir tarih ve zaman bilgisini bir arada tutmaktadir. Yapi son derece zengin elemanlara sahiptir. Bir DateTime nesnesi yapinin eitli balangi metotlari kullanilarak yapilabilinir. public DateTime ( int year, int month, int day, int hour, int minute, int second
) Aagidaki balangi metotu nesnenin yalnizca tarih blmn set eder zaman blm sifirlanmaktadir. public DateTime ( int year, int month, int day,
)
Diger balangi metotlari MSDN dokmanlarindan incelenebilinir. Yapinin Year, Month, Day, Hour, Minute, Second ve MilliSecond Read-Only property elemanlari. Tarih ve zaman bileenlerini bize vermektedir. DateTime dt = new DateTime(1990, 12, 21, 14, 23, 12); Console.WriteLine("{0}/{1}/{2} {3}:{4}:{5}", dt.Day, dt.Month, dt.Year, dt.Hour, dt.Minute, dt.Second);
Yapini DayofWeek isimli property elemani DayofWeek trnden bir property elemanidir. DayofWeek isimli enum haftanin gnlerinden olumaktadir. Anahtar Notlar: Sinifin bir elemaninin ismiyle onun turunun ismi ayni olabilir. Bu durum aslinda karisiklia yol amaz. rnein :DayOfWeek dow = dt.DayOfWeek; burada dorudan yazilmis DayofWeek turu belirtir.dt.DayofWeek ifadesi de sinifin property elemanini belirtir. DateTime Yapisinin bir grup Addxxx biiminde bunlar mevcut tarih ve zamana ekleme yaparak Bize yeni tarih ve zaman bilgisini vermektedir. Bu metotlarin parametresi double trdendir. Geri Dn degeri DateTime trndendir. Parametre negatifte olabilir. 99 Mert KPRC(mrtkprc@gmail.com) Sayfa 100 / -206- DateTime yapisinin ToString() isimli metotu tarih ve zaman bilgisini bize yazisal biimde verir. Bu bilgiyi pratik olarak ekrana yazdirmak istiyorsak bu metotu kullanabiliriz. DateTime yapisini statik now isimli property elemani bilgisayarin saatine bakarak oradan tarih ve zamani alir. Bize DateTime olarak verir. DateTime dt = DateTime.Now; Console.WriteLine(dt.ToString()); Today isimli property ise benzer biimdedir ancak bize yalnizca tarih bilisini verir. (Zaman bilgisi sifirdir). <ANLI <ANLI SAA(
DateTime dt; while (!Console.KeyAvailable) { dt = DateTime.Now; Console.Write("{0:D2}:{1:D2}:{2:D2}\r",dt.Hour,dt.Minute,dt.Second); }
DateTime yapisinin karilatirma operatr yapisi oldugu iin biz iki DateTime nesnesini karilatirma operatryle karilatirabiliriz. DateTime Yapisinin UtcNow isimli property elemani bize tarih ve zamani UTC olarak verir. public static void Main() {
} Console.KeyAvailable = > bool turden geri dnus deeri olan Klavyeden herhangi bir tusa basildii zaman true olan propertydir. 19.Hafta 1.Gn (08 Ekim 2011) TMESPAN YAPISI Time span yapisi zaman araligi tutmak iin kullanilmaktadir. Bir TimeSpan nesnesi, TimeSpan yapisinin eitli balangi metotlariyla yaratilir. TimeSpan yapisinin Days, Hours, Minute, Seconds, Miliseconds propertyleri read-onlydir. Zaman Araliginin ilgili bileenlerini bize vermektedir. TimeSpan yapisinin TotalDays, TotalHours, TotalMinutes, TotalSeconds ve TotalMilliSeconds property elemanlari read onlydir Bu propertyler bize ilgili zaman araligini gn, saat, dakika, saniye, milisaniye cinsinden vermektedir.
TimeSpan ts = new TimeSpan(2, 3,30, 45);
Console.WriteLine("{0} gun {1}:{2}: {3}",ts.Days,ts.Hours,ts.Minutes,ts.Seconds); Console.WriteLine("Toplam Gun:{0}",ts.TotalDays); Console.WriteLine("Toplam Saniye:{0}",ts.TotalSeconds); TimeSpan yapisinin FromDays, FromHours, FromMinutes, FromSeconds ve FromMilliSeconds statik metotlari ilgili zaman bileeni alir TimeSpan yapisini dntrr 100 Mert KPRC(mrtkprc@gmail.com) Sayfa 101 / -206- ve bize TimeSpan verir. TimeSpan yapisinda bir ToString() metodu vardir. Bu ToString metotu parametre almaz ve bir stringe geri dner, geri dndrdg yazi o zaman araligini belirten yazidir. TimeSpan yapisinin yine karilatirma operatr yapisi vardir ayrica iki TimeSpan toplanabilir ve ikartilabilinir. Sonu yine bize TimeSpan olarak verilmektedir. Ayrica iki DateTime nesnesi ikartilabilinir ve sonu TimeSpan olur. Anahtar Notlar: DateTime ve TimeSpan yapisi uzerinde zetle su operatr metotlari uygulanabilinir. - Iki DateTime ve Iki TimeSpan nesnesi karsilastirma operatrlerin hepsiyle isleme sokulabilinir. - Iki DateTime nesnesi toplanamaz fakat iki TimeSpan nesnesi toplanabilinir. - Iki Date Time ikartilabilinir ve sonu TimeSpan olur. Iki TimeSpan nesnesi ikartilabilinir sonu yine TimeSpan olur. Anahtar Notlar: .NETde siniflarin ve yapilarin ok buyuk ounluunun statik olmayan bir ToString() metotudu vardir. Bu ToString() metotu Parametre almaz fakat geri dnus deeri olarak nesne iindeki bilgileri temsil eden bir yaziyi bize verir. Bu yazi bizim istediimiz formatta olmayabilir biz bu konuda bir belirleme yapamayiz bu metotlar zellikle hizli bir biimde test amaciyla Sinif ve Yapi ierisindeki nesnelerin yazdirilmasi iin kullanilmaktadir. PONT YAPISI Point yapisi ekran koordinat sisteminde bir pixeli(Picture Element) temsil etmek iin kullanilmitir. Bir point Nesnesi sinifin uygun balangi metotuyla yaratilabilinir. Sinifin X ve Y property elemanlari Read/ Write Elamanlaridir ve noktanin x/y bileenlerini verir. Bu yapi System.Drawing ktphanesinde bulunmaktadir. System.Drawing isim alanindadir. Point yapisinin ToString()metotu yapi iindeki noktayi bize yazi olarak verir. using System; using System.Drawing; namespace CSD { class App { public static void Main() { Point p = new Point(10, 20); Console.WriteLine("({0}, {1})",p.X,p.Y); Console.WriteLine(p.ToString()); } } }
Point yapisinin Offset metotu noktayi deltax(dx) deltay(dy) kadar telemektedir. SZE YAPISI Genilik ykseklik bilgisini tutmaktadir. Nesne yapinin uygun yapinin balangi metotuyla yaratilir. Yine yapinin ToString metotu bize genilik ykseklik bilgilerini vermektedir. Bu Yapida System.Drawing isim alani ierisindedir. System.Drawing.dll ierisinde bulunmaktadir. Yapinin Read/Write Width ve Height property elemanlari genilik ve ykseklik degerlerini bize vermektedir. using System; using System.IO; using System.Windows.Forms; using System.Drawing; namespace CSD { class App 101 Mert KPRC(mrtkprc@gmail.com) Sayfa 102 / -206- { public static void Main() { Size sz = new Size(100, 200); Console.WriteLine("Width= {0}, Height= {1}",sz.Width,sz.Height); Console.WriteLine(sz.ToString()); } } }
RECTANGLE YAPISI Rectangel yapisi bir diktrgenin koordinatlarini tutmak iin kullanilmaktadir. Rectangel nesnesi sol st keden genilik ykseklik parametresi verilerek yaratilabilinir. Yapinin yine bir ToString metotu vardir. Bu yapida System.Drawing isim alani ierisinde bulunmaktadir. Yapinin x,y propertyleri Read/Write Propertylerdir. Diktrgenin sol st kesi temsil eder. Ayrica yapinin ReadOnly LeftTop, TopRight, Bottom propertyleri de vardir. Width ve Height propertyleri de Read/Write Propertylerdir. Yapinin OffSet isimleri metotlari diktrgeni telemektedir. Rectangel yapisini Contains metotlari bir noktanin diktrgenin ierisinde olup olmadigi bilgisini bize vermektedir. Rectangel Yapisinin Inflate metotlari diktrgeni amak ya da bzmekte kullanilmaktadir. P TOPLAYICI MEKANZMA Animsanacagi gibi bir yerel degiken programin akii degikeninin bildirildigi noktaya geldiginde yaratilir. Aki bloktan iktigi otomatik yok edilir. Ancak new ile yapilan tahsiltlar aki bloktan iksa bile yaamayi devam etmektedir. nk bu tahsiltlar Heapde yapilmaktadir. Peki, new operatryle tahsil edilmi alanlar nasil boaltilmaktadir. rnegin C++ boaltimi programci kendi yapmaktadir. Oysaki C# ve JAVA da bu boaltimi Carbage Collector yapmaktadir. p toplayici CLRnin bir alt sistemidir. CLR her yaratilan nesnenin belli bir anda ka referans tarafindan gsterildigini izlemektedir. Buna nesnenin referans sayaci denilmektedir. Nesne yaratildiginda referans sayaci 1dir.Nihayet onu gsteren referanslar kalmayinca referans sayaci 0 der. Nesnenin referans sayaci sifira dtgnde, bu durum nesnenin p toplayici iin seilebilir(eligible) duruma gelmitir. rnegin:
using System; using System.IO; using System.Windows.Forms; using System.Drawing; namespace CSD { class App { public static void Main() { { Sample s = new Sample(); // RS = 1 {
Sample k; k = s; //RS :2
Foo(k);
} //RS:1 } } // RS=0; 102 Mert KPRC(mrtkprc@gmail.com) Sayfa 103 / -206- } class Sample { public static void Foo(Sample s) { //...RS =3; } } }
Bir nesnenin referans sayaci sifira dtgnde p toplayici hemen onu silmek zorunda degildir. Sistemin genel performansi dikkate alinarak silme ilemi uygun bir zamanda yapilmaktadir. p toplama mekanizmasi programlamayi ok kolaylatirmaktadir. SINIFLAR ARASINDAK LKLER Bir proje nesne ynelimli olarak betimlemek proje ierisindeki tm gerek nesne ve kavramlar siniflarla temsil edilmektedir. Sonra siniflar arasinda ki ilikiler gzde geirilir ve sonrada kodlama yapilmaktadir. Bir projede iki sinif arasinda hibir iliki olmayabilir ogu kez aagida aiklanan 4 ilikiden biri vardir. Anahtar Notlar: Nesne Ynelimli Modelleme iin eitli metodolojiler kullanilmaktadir. Bunlardan en yaygin olan UML(Unified Modeline Language) yntemidir. UML ynteminde proje eitli baki ailariyla eitli diyagramlar izilir her diyagram projeyi bir ynden betimlemektedir. Bu diyagramlarin nasil izilecegine dair bir standartlar vardir. UML diyagramlarindan en nemlilerinden biri siniflari diyagramlari diye bilenen diyagramdir. Bu diyagramda projede hangi siniflarin olacagi planlama yapilir ve bu siniflar arasindaki ilikinin ne olacagi betimlenmektedir. 19.Hafta 2.Gn (09 Ekim 2011) SINIFLAR ARASINDA 4 TR ILIKI VARDIR. 1-)erme likisi (Composition) Bu ilikide bir sinif trnden bir nesne diger sinif trnden bir nesneyi iermektedir. Ierme ilikisinde ierilen nesne tek bir nesne tarafindan ierilebilinir. Ieren ve ierilen nesnenin mrleri yaklaik aynidir. Araba ile motor sinifi arasinda insanla karaciger sinifi arasinda ierme ilikisi vardir. Fakat doktor ile hastane sinifi arasinda, oda ile duvar sinifi arasindaki iliki ierme ilikisi degildir. UML sinif diyagramlarinda yle gsterilir. Ieren sinif tarafinda ii dolu bir baklavacikla gsterilir. Ierme ilikisi C#da yle oluturulur: Ieren sinifin ierilen sinif trnden bir referans veri elemani vardir. Ieren sinifin balangi metotu ierisinde new operatryle ierilen nesne yaratilmaktadir. Ierme ilikisine Ingilizce "has a ilikisi de denilmektedir. class A {
}
class B { private A a; public B() { a = new A();
}
} 2-)Birleme likisi(Aggregation) Bu ilikide bir sinifi trnden nesne baka bir sinif trnden nesne tarafindan kullaniliyordur. Kullanma btnseldir yzeysel degildir. Kullanilan nesne tek bir nesne 103 Mert KPRC(mrtkprc@gmail.com) Sayfa 104 / -206- tarafindan kullanilmak zorunda degildir. Kullanan nesne ile kullanilan nesnenin mrleri ayni olmak zorunda degildir. rnegin hastane ile doktor, bilgisayarla fare, oda ile duvar insan ile gzlk arasindaki ilikiler buna benzemektedir. .UML sinif diyagramlarinda kullanilan sinif tarinda ii bo bir baklavacikla gsterilir. Birleme ilikisi c# `da yle oluturulur. Kullanan sinifin kullanilan sinif trnden bir referans veri elemani vardir. Bu elemana balangi metotu yoluyla ya da property yolu ile deger atanmaktadir. Birleme ilikisine Ingilizce "holds a denilmektedir. rnegin: class A {
//... }
class B { private A a; public B() { //.. } public B(A val) { a = val; } public A AVal { get { return a; } set { a = value; } } } 3-)TRETME LKS(NHERTANCE) Tretme bir sinifin bir sinifa onu bozmadan ekleme yapma anlamina gelmektedir. Tretme ileminde asil sinifa(base class) ,eklemelerin yapilacagi sinifa da tremi sinif(derived class) denilmektedir. Tremi sinif tam olarak taban sinif gibide kullanilabilinir fakat ek elemanlara sahiptir. UML sinif diyagramlarinda tretme ilikisi, tremi siniftan taban sinifa bir okla belirtilmektedir. Tretme ilikisine Ingilizce "is a ilikisi de denilmektedir. Elimizde bir a sinifi bulunuyor olsun eger yazmak istedigimiz B sinifi bir eit A ise fakat fazlaliklari da varsa, biz B sinifini sifirdan yazmamaliyiz A sinifinda treterek yazmaliyiz. Tremi siniftan yeniden tretme yapilabilir.rnegin A <----- B<------C Burada B sinifi Adan tretilmitir. C sinifi da B sinifindan tretilmitir. Yani C sinifi hem A hem de B gibi davranabilmektedir. Bir sinif birden fazla sinifin taban sinifi olabilir. rnegin: A<---(B ve C) Burada A da ki elemanlar hem B hem de C tarafindan kullanilmaktadir. Fakat B ve C arasinda bir iliki yoktur. Burada ara sinif her ara iin sz konusu olabilecek ortak elemanlari tutmaktadir. rnegin plaka numarasi, yolcu kapasitesi, motor hacmi vb gibi.Bir tretme emasinda yukari iktika genelleme aagida zelleme balar. Bir ilikinin tretme ilikisi olup olamadigin anlamak iin "B bir eit A midir sorusu sorulmalidir. rnegin: otomobil bir aratir. Fakat doktor bir eit hastane degildir. Tretmenin en nemli amalarinda biri tekrarin engellenmesidir. Eger bazi siniflarin ortak elemanlari varsa bu ortak elemanlar bir taban sinifta toplanabilir ve o siniftan tretme yapilabilinir. rnegin bir i yerinde alianlarini grevlerine gre siniflarla temsil etmek isteyelim. Tm alianlarin ortak bilgilerini Employee isimli bir taban sinifta toplayabiliriz. Sonra diger siniflari burada tretebiliriz. 104 Mert KPRC(mrtkprc@gmail.com) Sayfa 105 / -206- rnegin: Windows iletim sisteminde ekranda bagimsiz olarak kontrol edilen diktrgensel blgelere Window denir. Bir programin ana penceresi edit alani, dgmeler vs. hep bir penceredir. Pencerelerin zemin rengi, konumu gibi, bykleri gibi pek ok zellikleri ortaktir. Ite .NET sinif ktphanesinde pencereler siniflarla temsil edilmitir. Siniflarinda ortak zellikleri eitli taban siniflarda toplanmitir.
Bir pencerenin tm kontrol zellikleri Control sinifi ile belirlenmitir. Button, Checkbox ve Radio Buttonlarinda ortak zellikleri vardir. Bunlar Button base ile kontrol edilmitir. Listbox ve Combobox `in zellikleri de ListControl sinifi ile belirlenmitir. Bir sinifin birden fazla taban sinifi olmasi durumu dogada az rastlanan bir durumdur ve buna nesne ynelimli programlama tekniginde oklu tretme multiple-inheritance denilmektedir. C burada hem A dan hem de B den tretilmitir. Java ve C#da oklu tretme yoktur. 4-)agrm likisi (Assocation) agriim ilikisinde bir sinif bir sinifi kullanmaktadir. Kullanma biimi detayli degil yzeyseldir. rnegin: Sinifin bir tek metotu ya da bir ka metotu o sinifi kullaniyordur. Birleme ilikisinde oldugu gibi o nesnenin referansini alarak btnsel biimde kullanim yoktur. agriim ilikisi UML sinif diyagramlarinda kullanan sinifindan kullanilan sinifa ekilen okla gsterilmektedir. rnegin taksi ile yolcu arasinda hastane ile ila irketleri arasinda agriim ilikisi vardir fakat taksi ile ofr arasinda birleme ilikini benzer bir iliki vardir. Taksi ile tait sinifi arasinda tremi sinifi ilikisi taksi ile motor sinif arasinda ierme ilikisi denir. Anahtar Notlar : Nesne ynelimli tasarimlarda sika geen bazi temalar bulunmaktadir. Bu temalar bir ka kisi tarafindan tasarim kaliplari(design patterns) biiminde sistematik hale getirilmistir. Tasarim kaliplari bazi problemli durumlarda nasil bir sinif tasarimiyla onlarin ustesinden gelineceini konu almaktadir.
this REFERANSI Aslinda sinif kavrami, statik olmayan metot kavramlari uydurma kavramlaridir. Bilgisayarin dogal alimasi gz nne alindiginda sinif diye bir ey yoktur. Fakat C# da statik metotlar ya da diger programlama dillerinde prosedrler ve fonksiyonlar dogal kavramlardir. Yani bilgisayarin alimasinda ki temel prensipte bulunmaktadir. C#da ki bir program derlendiginde aslinda tm statik olmayanlarin statik gibi derlendigi grlmektedir. Aslinda derleyici sinifin statik olmayan metotlarini statik metot gibi derler. nk statik olmayan metot kavrami gerekte yoktur. Statik olmayan bir metot ek bir parametre geirilerek statik metot durumuna dntrlebilinir. rnegin class Sample { private int a; private int b; public void Set(int x, int y) { a = x; b = y;
}
} Sample s = new Sample(); s.Set(10, 20);
105 Mert KPRC(mrtkprc@gmail.com) Sayfa 106 / -206- Biz bu metotu u halde statik hale getirebiliriz. class Sample {
private int a; private int b;
public static void Foo(Sample s, int x, int y) { s.a = x; s.b = y; } } Sample s = new Sample(); Sample.Foo(s, 10, 20); Grldg gibi bir metotu statik bir hale dntrrken metotun agrilmasinda kullanilan referansi ayrica statik metota geiririz. Ite derleyicide aslinda gizlice statik olmayan metotlari statik metotlari dntrp derlemektedir. Yani aslinda sifir parametreli statik olmayan bir metotun bir parametresi, bir parametreli statik olmayan bir metotun aslidan iki parametresi vardir. Statik olmayan metotlara geirilen bu gizli parametre statik olmayan gizli metotlarin ierisinde aika this anahtar szcg ile kullanilabilinir. Yani this anahtar szcg statik olmayan metotun agrilmasinda kullanilan referansi temsil etmektedir.Aslinda derleyici sinifin statik olamayan metotlarini dogrudan degil geirilen bu this referansi ile erimektedir. rnegin statik olmayan a isimli bir veri elemanina a ifadesiyle erimekle this.a ifadesiyle erimek arasinda hi bir farklilik yoktur. this anahtar szcg hangi sinif ierisinde kullaniliyorsa o sinif trnden bir referans belirtir. Statik metotlar zaten referansla agrilmadigina gre biz onlarin ierisinde this anahtar szcgn kullanamayiz. Bazen programcilarin this anahtar szcgn kullanmasi gerekebilmektedir. rnegin sinifin veri elemaniyla ayni isimli metot ierisinde bir parametre degikeni yada bir yerel degiken varsa biz bu ismi metot ierisinde kullandigimizda yerel degiken yada parametre degikenine erimi oluruz. Bylesi bir akima durumunda sinifin elemanlarina erimek iin kullanilabilinir. class Date { private int day, month, year; public Date(int day,int month,int year) { this.day = day; this.month = month; this.year = year;
} public void Disp() { Console.WriteLine("{0}/{1}/{2}",day,month,year); } } Date d = new Date(10, 12, 2009); d.Disp(); Bazi programcilar sinifin veri elemanlarina akima olmasa bile this anahtar szcg ile erimektedir. Bunun nedeni okunabilirligi arttirmaktir. this.a gibi bir ifadeyi gren kiiler anin bir yerel degiken olmadigini hemen anlarlar sinifin veri elemani oldugunu anlarlar ve daha fazla bilgi sahibi olurlar. 20.Hafta 1.Gn (15 Ekim 2011) 106 Mert KPRC(mrtkprc@gmail.com) Sayfa 107 / -206- Sinifin statik olmayan bir metotunun, sinifin statik olmayan baka bir metotunu aslinda bu durumda derleyici aslinda derleyici burada this referansiyla agirmaktadir. Yani Foo gibi bir agirmayla, this.Foo(); gibi bir agirma edegerdir. Yine bazi programcilar sinifin statik olmayan metotlarini gerekmedigi halde this referansiyla agirmaktadir. Bundan ama yine okunabilirligi arttirmaktadir. "this.Foo()" gibi bir metotu gren programci sinifin statik olmadigini hemen anlar. *Bazi programcilar sinifin veri elemanlarini m_xxx ya da d_xxx gibi bir n ekle balayarak isimlendirmektedir. Bylece bu n ekli isimleri gren birisi bu elemanlarin sinifin veri elemanlarini hemen anlar. Biz kursumuzda veri elemanlarini m_xxx eklinde isimlendirecegiz.(m_ -> member in kisaltmasidir) TRETME LEMLER C# `da tretme ileminin genel sentaksi u ekildedir. class <turemis sinif ismi> : <taban sinif ismi> { //... } Tretme ilemi sonucunda tremi sinif hem taban sinif gibi hem de tremi sinif gibi kullanilabilmektedir. namespace CSD { class App { public static void Main() { B b = new B(); b.Foo(); b.Bar(); b.Tar();
} } class A { public void Foo() { Console.WriteLine("Foo"); } public void Bar() { Console.WriteLine("Bar"); } } class B : A { public void Tar() { Console.WriteLine("Tar"); } } }
Tremi sinif trnden bir nesne yaratildiginda bu nesne hem taban sinifin veri elemanlarini ierir hem de tremi sinifin kendi veri elemanlarini iermektedir. Tremi 107 Mert KPRC(mrtkprc@gmail.com) Sayfa 108 / -206- sinif nesnesinde taban sinif ve tremi sinif veri elemanlarini ardiik bir blok gibidir ve dk adreste taban sinif veri elemanlari bulunur. class A { private int m_x; private int m_y;
} class B : A { private int m_z; private int m_k; private int m_x;
} Grldg gibi tremi sinif nesnesi ierisinde hem taban sinif veri eleman blogu hem de tremi sinifin kendi veri eleman blogu ardiik bir biimde bulunmaktadir. Tremi sinif nesnesi bunun hepsini oluturmaktadir. class App { public static void Main() { B b = new B();
} } class A { protected int m_x; protected int m_y;
} class B : A { protected int m_z; protected int m_k;
public void Foo() {
}
} class C : B { public void Foo() { m_x = 10; m_y = 20; 108 Mert KPRC(mrtkprc@gmail.com) Sayfa 109 / -206- m_z = 30; m_k = 40;
} } TRETME LEMNDE TEMEL ERM KURALLARI Tretmenin genel anlami "taban sinifinin elemanlarinin ayni zamanda tremi sinif elemanlariymi gibi ilem grmesidir. 1. Tremi sinif trnden bir referans yoluyla diaridan tremi sinifin ve onun taban siniflarinin yalnizca public blmlerine eriilebilinir. 2. Taban sinif elemanlari tremi sinif elemanlariymi gibi ilem grmektedir. Tremi sinif metotlari ierisinde dogrudan sanki tremi sinifin kendi elemanlariymi gibi hem tremi sinifin hem de taban sinifin elemanlari kullanilabilinir. Fakat taban sinifin yalnizca public ve protected blmlerin eriilebilinir. 3. Taban sinifin private blm tamamen korunmutur. Diaridan ve tremi sinif tarafindan eriilemez. PROTECTED BLMN ANLAMI Sinifin protected blm sinifin kendisi tarafindan ve tremi sinif tarafindan eriilebilen bir blmdr. Protected blm public ile private blm arasinda bir eriim zelligine sahiptir. Protected blme diaridan eriilemez ama tremi siniftan eriilebilinir. Biz bir sinif yazarken o siniftan tretme yapilabilecegini gz nne alarak Bazi elemanlari protected blme yerletirebiliriz. Bylece o elemanlari tremi sinif yazanlar dogrudan kullanilabilinir. Anahtar Notlar : Bir sinifin taban siniflari denildiinde onun yukariysa doru tum taban siniflari anlasilir. Bir sinifin dorudan taban sinifi denildiinde onun bir yukaridaki sinifi anlasilir. Bir sinifin dolayli siniflari denildiinde ise dorudan sinif haricindeki tum taban siniflari anlasilmaktadir. A<-B<-C<-D Burada D nin dorudan sinif C idir. D nin tum taban siniflar A,B,C ,D nin dolayli siniflari A,Bdir. Suphesiz C#da (Java da ayni) bir sinifin sadece bir taban sinifi bulunabilinir. TREM VE TABAN SINIFLARDA AYNI SML ELEMANLAR C#da taban sinif ve tremi sinifta ayni isimli elemanlar bulunabilinir. Bu durumda tremi siniftaki elemanin taban siniftaki elemani gizlemesi sz konusu olabilir. nk hem nitelikli hem niteliksiz isim arama kurallarina gre bir isim nce tremi sinifta, bulunamazsa sirasiyla onun taban siniflarinda aranir. rnegin: namespace CSD { class App { public static void Main() { B b = new B(); b.m_x = 10; // B'NIN m_x elemanu
} } class A 109 Mert KPRC(mrtkprc@gmail.com) Sayfa 110 / -206- { public int m_x; } class B : A { public int m_x;
public void Foo() { m_x = 10; } }
}
C#da bylesi bir durumda derleyici uyari vermektedir. Byle bir gizleme durumunda taban sinifa erimenin bir durumu yoktur. phesiz taban siniftaki ayni isimli elemana taban sinifin private blmde ise zaten ona tremi siniftan ve diaridan erime olmadigi iin bir gizleme de sz konusu degildir. Ancak taban siniftaki eleman public veya protected blmde ise bu durumda potansiyel bir gizleme durumu vardir ve uyari verilmektedir. Byle bir isim gizlemesi bilinli olarakta yapilabilmektedir. Bu durumda uyarinin engellenmesi iin bu ilemi yanlilikla yapmadigimiza ynelik derleyici ikna etmek iin new anahtar szcg kullaniriz. new anahtar szcg burada operatr grevinde degildir. new anahtar szcg eriim belirleyici anahtar szckle ayni sentaks ierisindedir. Yer degitirmeli olarak kullanilabilinir. class A { public int m_x; } class B : A { public new int m_x;
} Taban sinif ve tremi sinifta ayni isimli metotlarin bulunmasinda durumunda bir gizlemenin sz konusu olabilmesi iin metotlarin parametrik yapilarinin da ayni olmasi gerekmektedir. C#da taban siniftaki ayni isimli metotlarda overload resolution ilemi iin aday metot kmesine alinmaktadir. Yani overload resolution ilemi hem taban siniflardaki hem de tremi siniftaki metotlar dikkate alinarak gerekletirilir. Ayrica C# `da taban siniftaki eriilmeyen metotlar zaten aday metot listesine hi sokulmamaktir. Yani overload resolution ilemi yalnizca eriilen metotlar arasinda yapilir. TREM SINIFLARDA BALANGI METOTLARININ AGRILMASI Tremi sinif trnden bir new operatryle bir nesne yaratildiginda tremi sinif trnn balangi metotu agrilir. Biz bu balangita taban sinifin private veri elemanlarina eriemeyiz. Peki, tremi sinifin nesnesin taban sinifindaki veri elemanlarina nasil deger atanacaktir. Ite tremi sinifin balangi metotu taban sinifinda constructorunda agirmaktadir. Bylece her sinifin balangi metotu sadece kendi veri elemanla deger atamakla ykmldr. Taban sinif balangi metotunun agrilmasi ilemi tremi sinif balangi metotunun ana blogunun hemen bainda derleyici tarafindan yerletirilmi olan gizli bir agirma koduyla olur. Bylece ilevsel olarak taban sinifin balangi metotu tremi sinifin balangi metotundan daha nce 110 Mert KPRC(mrtkprc@gmail.com) Sayfa 111 / -206- agrilmaktadir. Her sinifin balangi metotu yalnizca kendi dogrudan taban sinifin balangi metotunu agirmaktadir. Fakat her zaman ilevsel olarak balangi metotlari yukaridan aagiya agrilmi olmaktadir. rnegin C c =new C(); A<-B<-C Burada Cnin balangi metotu B nin kini B nin ki de A nin kini alitirmaktadir. Bylece sirada A,B,C biiminde olmaktadir. 20.Hafta 2.Gn (16 Ekim 2011) Anahtar Notlar : Sinifin baslangi metotlari normal bir metot gibi arilamaz. Ancak new islemi sirasinda dolayli olarak arilmaktadir. PEK, TREM SINIFIN CONSTRUCTORU TABAN SINIFIN HANG CONSTRUCTORINI AGIRACAKTIR? Ite taban sinifin hangi balangi metotunun agrilacagi tremi sinif balangi metotunun parametre parantezinden sonra yerletirilen : base(....) sentaksi ile belirtilir. rnein class B : A {
public B() : base(10,10) {
}
} "base(....) " sentaksi hi belirtilmeyebilir. Bu durumda taban sinifin default balangi metotu agrilmaktadir. base sentaksi balangi metotunun ana blogun ierisinde ana blogun iinde yazilmi gibi ilem grmektedir. Yani rnegin biz ; base sentaksinin parametre parantezinin iinde balangi metotunun parametre degikenlerini kullanabiliriz. namespace CSD { class App { public static void Main() { B b1 = new B(100, 200); b1.DispB(); B b2 = new B(); b2.DispB();
} } class A { private int m_a;
public A() { m_a = 10; } 111 Mert KPRC(mrtkprc@gmail.com) Sayfa 112 / -206- public A(int a) { m_a = a; } public void DispA() { Console.WriteLine(m_a); } }
class B : A { private int m_b; public B() { m_b = 20; } public B(int a,int b) : base(a) { m_b = b; } public void DispB() { DispA(); Console.WriteLine(m_b); } }
} Anahtar Notlar : Bazen bir sinifin ok fazla get edilecek elemani olabilir . Bu elemanlari tek tek disaridan baslangi metotu yoluyla almak bu durumlarda iyi bir teknik olmayabilir. Bu tur durumlarda en nemli bir ka deeri baslangi metotu yoluyla almak dierlerini propertyler yoluyla set edilme yoluna gidilebilinir ya da hi bir deeri baslangi metotuyla set etmeyip her seyi propertylerle set edilme yoluna da gidilebilinir. CtDis....1 S,N(AKSI Balangi metotlarinda parametre parantezinden sonra ya :base(....) sentaksi yada :this(....) sentaksi kullanilir. Fakat her ikisi birlikte kullanilamaz. this sentaksi sinifin bir balangi metotunun baka bir balangi metotunu agiracagi anlamina gelmektedir. Sinifin bir balangi metotu bir digerini o da bir digerini agirabilir. Eninde sonunda taban sinifin balangi metotu agrilacaktir. Bylece yine ilk nce taban sinifin balangi metotu agrilmaktadir. rnegin: class A {
}
class B : A { private int m_b; public B() {
} 112 Mert KPRC(mrtkprc@gmail.com) Sayfa 113 / -206- public B(int a) : this() {
} public B(int a,int b) : this(a) {
}
} Eger balangi metotun :this() yada :base() kullanilmamisa :base(..) belirlemesi yapilmi oldugu varsayilir. TREM SINIFTAN TABAN SINIFA REFERANS DNTRMELER TREMI TABANA ATANABILIR. C#da farkli siniflar trnde iki referanslar birbirine atanamazlar. Fakat tremi sinif referansi taban sinifa dogrudan atanabilir. class A {
}
class B : A {
} B b = new B(); A a; a = b; Tremi sinifin referansi taban sinifin referansina atandiktan sonra artik bu taban sinif referansi bagimsiz bir taban sinif nesnesini degil tremi sinifin taban sinif nesnesini gsteriyor olur.
Adat % nesnesi Bdat
Biz imdi biz bu taban sinifiyla ilem yapsak bundan bagimsiz bir taban sinif nesnesi degil tremi sinifin taban sinif nesnesi etkilenmektedir. Bu ilemin tersi yani taban sinifin referansinin tremi sinif referansina atanmasi geersizdir. nk byle bir atama sz konusu olsaydi bu durumda tremi sinif referansi ile hi olmayan elemana erimek gibi gvensiz bir durum ortaya ikardi. namespace CSD { class App { public static void Main() { B b = new B(); b.m_x = 10; b.m_y = 20; b.m_z = 30; b.m_k = 40; 113 Mert KPRC(mrtkprc@gmail.com) Sayfa 114 / -206-
A a; a = b; Console.WriteLine(a.m_x); Console.WriteLine(a.m_y);
} } class A { public int m_x; public int m_y;
}
class B : A { public int m_z; public int m_k;
}
}
Bir dizi tretme sz konusu oldugunda herhangi bir tremi sinif trnden referans herhangi bir taban sinif referansa atanabilir. rnegin: A<-B<-C<-D D d = new D(); A a; B b; C c; c = d; b = c; a = b;
21.Hafta 1.Gn (22 Ekim 2011) TREM SINIF REFERANSININ TABAN SINIFA ATANMASININ ANLAMI Bir tretme emasinda yukariya ikildika genelleme aagiya inildike zelleme grlr. Tremi siniftan taban sinifa referans dntrmesi sayesinde biz genel ilemler yapabilen metotlar yazabiliriz. rnegin : public static DispInfo(Employee e) {
} Worker w = new Worker(); Dispnfo(w); Executive e = new Executive(); Dispnfo(e); SalesPerson sp = new SalesPerson (); Dispnfo(sp); Burada DispInfo metotu alianin Employee Blm iinde ilem yapmaktadir. Biz DispInfo metotuna herhangi bir aliana geirebiliriz. Bu durumda alianin Employee bilgileri zerinde ilem yapar. 114 Mert KPRC(mrtkprc@gmail.com) Sayfa 115 / -206- rnein! (0)FOD.RO= (0-4)>ORG (0-%) %:..OD %4SE (0-F)=HS. FOD.RO= (0-%-0)%:.OD(0-%-B)F*e1()ox (0-%-?)R43HO %:..OD (0-F-0)=ist%ox(0-F-B)Fom)o)ox public void AnimateControl(Control c) { } Burada AnimateControl genel bir metottur btn controller zerinde ilem yapabilmektedir. Biz bu metota Button, Checkbox, ComboBox gibi her trden nesne geirebiliriz. Baka bir metot ListControl aliyorsa biz ona ListBox ve ComboBox nesnelerini geirebiliriz. S&S(,M. $%/,<( SINIFI C#da biz bir sinifi hi bir siniftan tretmi olmasak bile C# derleyicisi onun System isim alani ierisindeki Object sinifindan tretilmi oldugunu varsayar. rnegin: class Sample {
}
Burada Sample Sinifi System. Object sinifindan tretilmitir. Bunu aikada belirtebiliriz. class A:System. Object {
} Bu durumda bir sinif eninde sonunda Object Sinifindan tretilmi olmak zorundadir. Ya da yle syleyebiliriz. System. Object tm siniflarin taban sinifidir. System. Object sinifi ok kullanildigi iin kk harf anahtar szcg ile de temsil edilmitir. Yani System. Object yazmakla object yazmak ayni anlamdadir. Anahtar Notlar : Her Sinif Object sinifindan turetildiine gre her sinifin bir object kismi vardir. Fakat biz izimlerimizde biz bu object kismini hi gstermeyeceiz rnein: object<-A<-B B b = new B(); Anahtar Notlar : Turemis sinif ismiyle yalniz turemis sinifin deil taban sinifin statik metotlari da arilabilinir. Mademki object sinifi tm siniflarin taban sinifi durumundadir. O halde tm siniflari ilikin biz object sinifini atayabiliriz. Yani bir metotun parametresi object ise her trl nesne referansini geirebiliriz. YAPILARIN TRETME DURUMU C#da yapilar tretmeye kapalidir. Yani biz bir yapidan tretme yapamayiz. Yapiyi da bir siniftan tretemeyiz. Ancak C#da tm yapilarin System. ValueType isimli bir siniftan tretilmi olduklari varsayilir. Bu sinif da System. Object sinifindan tretilmitir. ENUM TRLERNN TRETME DURUMU Enum trlerinden tretme yapilamaz Bir Enum tr de herhangi bir trden tretilemez. Ancak Tm enum trlerinin System. Enum isimli siniftan tretildigi varsayilmaktadir. System. Enum tr de System. ValuType trnden tretilmitir. 115 Mert KPRC(mrtkprc@gmail.com) Sayfa 116 / -206- System. Object<-System. ValueType<-System. Enum<-Herhangi Bir Enum. DZLERN TRETME DURUMU Dizilerde tretmeye kapalidir. Biz bir diziden tretme yapamayiz bir diziyi de baka bir trden tretemeyiz. Btn diziler System. Array sinifindan tretilmi oldugu varsayilmaktadir. System. Object<-System. Array<-Herhangi bir dizi... REFERANSLARIN STATK VE DNAMK TRLER Referansin statik tr bildirimde belirtilen trdr. Bir daha da degimez. Zaten tr denildiginde default olarak statik tr anlailmaktadir. Dinamik tr referansin gsterdigi yer ile ilgilidir. Bir referans bir nesneyi gsteriyorsa gsterdigi nesnenin btnnn trne yani en geni halinin trne onun dinamik tr denilmektedir. rnegin: A x; B y = new B(); x = y; Burada xin statik tr A; dinamik tr Bdir. ynin de statik de dinamik tr de Bdir. Normal olarak referansin statik tr ile dinamik tr aynidir. Bunlarin farklilamasi iin tremi siniftan taban sinifa bir atama yapilmi olmasi gerekmektedir. >rneEinC A<-B<-C A x; B y; C z = new C(); b = z; a = y; Burada zin dinamikte statik turude Cdir. ynin statik turu B dinamik turu Cdir xin ise statik turu A dinamik turu ise Cdir rnegin: Object o ; Sample s = new Sample(); o = s; Burada snin dinamik ve statik trleri Sampledir. Burada onin statik tr Object, dinamik tr ise Sampledir. C z = new C(); B y = new B(); A x = new A(); //x `in dinamik tr A x = y; // xin dinamik tr B x=z; // xin dinamik tr C Grldg gibi referansin statik tr hi degimez. Dinamik tr degiebilir. public static void DoSomething(object o) { } DoSomething(new object()); DoSomething(new A()); DoSomething(new B()); Grldg gibi DoSomething metotu her agrildiginda o Referansinin tr farkli olmaktadir.
AAGIYA DOGRU REFERANS DNTRMELER(DOWNCASTNG) 116 Mert KPRC(mrtkprc@gmail.com) Sayfa 117 / -206- Tremi sinif referansi taban sinif referansina dogrudan (implicit) dntrlebilmektedir. Bu dogal durum Yukariya dogru dntrme (UpCasting) belirtir. Fakat bazen taban sinif referansinin da tremi sinif trne dntrlmesi gerekebilmektedir. Bu dntrmeye aagiya yapilan dntrme DownCasting denilmektedir. Aagiya dntrmeler dogrudan degil tr dntrme operatryle expilicit olarak yapilabilir. Aagiya dogru dntrme Hakli yda Haksiz olabilir. Eger dntrlmek istenen referansin oldugu yerde dntrlmek istenen trn btn bilgileri bulunuyorsa dntrme haklidir. Bulunmuyorsa haksizdir. Eger dntrlmek istenen trn referansi dinamik tr dntrlmek istenen tr ieriyorsa Dntrme Hakli iermiyorsa Haksizdir. rnegin B sinifi A Sinifindan tretilmi olsun A<-B =AKSI+ )>N?(?-M, 4 x < neI 4(); % y ; y < (%)x; =AKLI )>N?(?-M, 4 x < neI %(); % y; y< (%)x; Aagiya dogru dntrmeler derleme aamasinda her zaman kabul edilmektedir. Fakat programin alima zamani sirasinda aki dntrmenin yapildigi noktaya geldiginde dntrmenin yapildigi noktaya geldiginde ayrica bir haklilik kontrollde uygulanir. Eger dntrme hakli ise bir sorun olumaz. Haksiz ise Exception oluur. 'A()* +,N-.T-/0E namespace CSD { class App { public static void Main() {
A a = new B(); B b; b = (B) a;
}
} class A { private int m_a; } class B : A { private int m_b;
} }
117 Mert KPRC(mrtkprc@gmail.com) Sayfa 118 / -206- 'A(S*1 +,N-.T-/0E namespace CSD { class App { public static void Main() {
A a = new A(); B b; b = (B) a;
}
} class A { private int m_a; } class B : A { private int m_b;
} }
COLLECTION SINIF KAVRAMI C#da new operatryle yaratilmi bir dizi bytlemez ve kltlemez. phesiz istenilen bykte yeni bir dizi yaratilmaktadir. Amaci birden fazla nesne tutmak olan ve bunlar zerinde eitli ilemleri yapmak olan zel siniflara Collection sinif denilmektedir. Tm Collection siniflar System. Collection sinif ierisindedir. Pek ok Collection sinif olmasina ragmen phesiz en ok kullanilan sinif ArrayList sinifidir. ArrayList sinifi dinamik olarak bytlen bir dizi temsil etmektedir. ArrayList ierisinde object trnden bir dizi vardir. Sinifinda Add()isimli bir metotu bulunmaktadir. Add metotunun parametresi object trndendir. ArrayList Collection `in Capacity ve Count isimli iki property elemani vardir. Capacity tahsis edilmi Collection kapasitesini gsterir, Count ise dolu olan eleman kismini belirtmektedir. Her Add yapildiginda Count bir artar Count sonunda Capacity ulairsa bir kez daha Add yapildiginda, Add metotu kendi ierisinde iki kat byk yeni bir yer tahsis eder. Eski diziden yeni diziye elemanlari kopyalar. ArrayList artik bu yeni diziyi tutar. Eski dizide p toplayici tarafindan toplanmaya mahkm birakilir. 21.Hafta 2.Gn (23 Ekim 2011) ArrayList sinifinin Add metotunun parametrik yapisi yledir. public virtual int Add(object value) { }
Add metotu; kendi ierisinde ki diziye ekledigi yerin indeksi ile geri dner; ArrayList ierisindeki belli bir indekste bulunan eleman sinifin int parametreli object trnden indexleyisiciyle elde edilebilir. 118 Mert KPRC(mrtkprc@gmail.com) Sayfa 119 / -206- using System; using System.IO; using System.Windows.Forms; using System.Drawing; using System.Collections; namespace CSD { class App { public static void Main() { ArrayList al = new ArrayList(); for (int i = 0; i < 100; i++) { al.Add(new Number(i)); } for (int i = 0; i < al.Count; i++) { Number n =(Number) al[i]; Console.Write("{0} ",n.Val); } Console.WriteLine(); } } class Number { private int m_val; public Number(int val) { m_val = val; } public int Val { get { return m_val; } } }
}
Anahtar Notlar : Aralarinda turetme iliskisi olmayan iki sinif arasinda tur dnusturme operatruyle dnusturme yapilmak istendiinde derleme zamaninda error olusur. Bu islem alisma zamanina birakilmaz. unku byle bir dnusturmenin hakli olabilme olasilii yoktur. A B C C c = new C() b = (B) c; // compile time error ArrayList sinifinin Count propertysi readonlydir. Capacity propertysi read/writedir. Capacity count degerinden aagiya ekilemez. Fakat eski degerden kk olacak ekilde yukari ekilemez yda byk olacak biime count degerinden yukari ekilebilir. ArrayList Insert metotu belli bir indexe digerlerini kaydirarak yerletirir. phesiz Insert ilemi sonucunda count degeri bir artmaktadir. 119 Mert KPRC(mrtkprc@gmail.com) Sayfa 120 / -206- SINIF ALIMASI Bir ArrayList nesnesi olutururunuz sonra klavyeden quit yazana kadar girilen yazilari string olarak ArrayList ierisinde yerletiriniz. Ilem bittiginde girilen yazilari aralarina "| koyarak tek bir satir halinde bastiriniz. quit yazilinca programdan ikilacak. string s = ""; ArrayList al = new ArrayList();
for (int i = 0; ; ) { Console.Write("Lutfen Yazi Girer misiniz :"); s = Console.ReadLine(); if (s.ToLower() == "quit") break; al.Add(s); ++i; } for (int k = 0; k < al.Count; k++) { Console.Write("{0} | ", (string) al[k]); } Console.ReadLine(); ArrayList sinifinin RemoveAt(int index) isimli metotu belli bir indexteki elemani siler. Bu durumda count bir azalir. Elemanlar sikitirilir. Sinifin Clear() metotu parametresizdir btn elemanlari siler. Bu durumda Capacity degeri degimez. Fakat count degeri sifir olur. ArrayList sinifi IEnumerable arayzn destekledigi iin foreach deyimi ile kullanilabilinir. YAZILARIN SAYILARA, SAYILARINDA YAZILARA DNTRLMES Temel trlere ilikin yapilarin hepsinde statik olmayan bir ToString metot vardir .Bu metot parametre almaz ve bize bir string verir. O stringin ierisinde sayinin yazi kariligi vardir. int i = 123; string s; s = i.ToString(); int i = 123; Console. WriteLine("i = " + i.ToString());
Ayni zamanda bu temel trlere ilikin yapilarin statik bir Parse metotlari vardir. Bu Parse metotlari tam ters bir ilem yaparlar. Yani yazilari sayilara dntrrler. KUTULAMA DNTRMES(BOXING CONVERSON) Animsanacagi gibi btn yapilar System. ValueType sinifindan tretilmitir. Bu durumda bizim herhangi bir trden bir yapi degikenini dogrudan ValueType trnden bir referansa object trnden bir referansa atiyor olabilmemiz lazim. Ancak referanslar stackteki degikenlerin adreslerini tutamazlar. Ancak heapdeki nesnelerin adreslerini tutabilirler. Peki, bu durumda ne olacak. Ite ne zaman bir yapi degikeni ValueType yda object referansina atanacak olsa. CLR onun nce heapde bir kopyasini oluturur referansa steakdeki degikenin adresini degil heapdeki kopyanin adresini yerletirir. Bu ileme Kutulama dntrmesi(Boxing Conversion) denilmektedir. int i = 123; object o; o = i; Artik asil degiken ile onun heapde ikartilmi kopyasi farkli iki nesnedir. Birinin degimesi digerini etkilemez. Steakdeki degiken programin akii bloktan iktiginda yok edilir. Heap deki degiken ise p toplayici tarafindan yok edilmektedir. 120 Mert KPRC(mrtkprc@gmail.com) Sayfa 121 / -206- KUTUYU AMA DNTRMES(UNBOXING CONVERSION) Kutulama dntrmesi yoluyla heape tainmi olan nesne aagiya dogru dntrme ile yine orijinal yapi trne dntrlmektedir. Bu durumda CLR heapdeki yapinin steakte geici bir kopyasini oluturmaktadir. Biz tr dntrmesi sonucunda oluan kopyayi ayni trden bir yapi degikenine atayabiliriz. Sonra bu geici degiken yok edilir. Bu ileme kutuyu ama dntrmesi( unboxing conversion) denilmektedir. int i = 123; object o; o = i; int x; x = (int) o; Console.WriteLine(x); >-N,K ArrayList al = new ArrayList(); for (int i = 0; i < 10; i++) { al.Add(i); } for (int i = 0; i < al.Count; i++) { int val = (int)al[i]; Console.WriteLine(val); }
Anahtar Notlar : Kutulama dnusturmesi yoluyla heape ekilmis olan temel yapilara iliskin bir deisken baska bir tur olarak asaiya doru dnusturulemez. Biz object referansina bir int atamis olalim sonra bu object referansini Kutuyu ama dnusturmesi ile biz long turune dnusturemeyiz Exception olusur. Burada long turunun int turune atanmasi bir gereke olusturmaz. int a = 123; object o = a;
long b; b = (long) o; //Haksiz dnusturme exception olusur. Console.WriteLine(b);
OK BMLLK (POLYMORPHSM) ok biimlilik (polymorphism) bir dilin nesne ynelimli olmasi iin mutlak gerekli zelliklerden biridir. Eger dilde sinif varsa, tretme varsa, fakat ok biimlilik yoksa bu dile nesne ynelimli degil nesne tabanl (object based) denilmektedir. ok biimlilik biyolojiden aktarilmi bir terimdir. Biyolojide ok biimlilik canlilarin eitli doku ve organlarin evrim sreci ierisinde onlarin yaam koullarina bagli olarak temel ilevleri ayni kalmak zere farklilik gstermesine denilmektedir. rnegin: kulak pek ok canlida vardir. Fakat her canlinin kulagi digerlerinden az ok farklidir. Nesne ynelimli programlama tekniginde ok biimlilik farkli bakilara gre farkli biimde tanimlanabilmektedir. 1-) Biyolojik Tanim: ok biimlik taban sinifin belli bir metotunun tremi siniflar tarafindan onlara zg bir biimde gerekletirilir. 2-)Yazilim Mhendisligi: ok biimlilik trden bagimsiz kod paralari oluturabilmek iin kullanilan bir tekniktir. 3-)Aagi Seviyeli Tanim: ok biimlilik ncede yazilmi metotlarin sonradan yazilan metotlari agirabilmesidir. C#de ok biimlilik sanal metotlarla gerekletirilmektedir. 121 Mert KPRC(mrtkprc@gmail.com) Sayfa 122 / -206- SANAL METOTLAR Bir metotu sanal yapabilmek iin metot bildiriminde virtual anahtar szcg kullanilmaktadir. virtual anahtar szcg eriim belirleyici anahtar szckleri ayni kategori de oldugu iin onlarla yer degitirmeli yazilabilir. public virtual yda virtual public olabilir. virtual metotlar statik olamazlar yani statik anahtar szcg ile virtual anahtar szckleri beraber kullanilamaz. Taban siniftaki bir sanal metot tremi sinifta ayni eriim belirleyicisi ile ayni geri dn degeri tr ile ayni isimle ve ayni parametrik yapi ile bildirilirse fakat virtual yerine override anahtar szcg kullanilirsa bu duruma taban siniftaki sanal metotun tremi sinifta override edilmesi. rnegin : class A { public virtual void Foo(int a) { //.. } } class B : A {
public override void Foo( int a) {
} } Sanal metot override edilirken unlara dikkat edilmelidir. - Ayni eriim belirleyicisi kullanilmalidir. - Geri Dn degerlerinin trleri ayni olmalidir. - Metotlar ayni isimde olmalidir. - Parametrenin trleri ayni olmalidir.(Fakat parametrenin degikenlerinin isimlerini bir nemi yoktur.) 22.Hafta 1.Gn (29 Ekim 2011) Override edilmi bir metot tremi siniflarda override edilmeye devam edilebilinir. rnegin: class A { public virtual void Foo() { //.. 122 Mert KPRC(mrtkprc@gmail.com) Sayfa 123 / -206- } } class B : A { public override void Foo() {
} } class C : B { public override void Foo() {
} } Virtual, override ve abstract metotlarin hepsine sanal metot denilmektedir. Virtual anahtar szcg sanalligi balatmak iin override devam ettirmek iin kullanilmaktadir. Bir sanala metotun tremi sinifta override edilmesi zorunlu bir ilem degildir. Override ilemi iin metotun hemen dogrudan taban sinifta sanal olarak bulunmasi gerekmez. Yukarya dogru herhangi bir snfta sanal olmas yeterlidir. rnegin: class A { public virtual void Foo() { } } class B : A { 123 Mert KPRC(mrtkprc@gmail.com) Sayfa 124 / -206- } class C : B { public override void Foo() { } } Taban siniftaki sanal metot tremi sinifta override anahtar szcg kullanilmadan ayni biimde bildirilebilir ya da yeniden virtual olarak bildirilebilinir. Bu durumda override etme anlaminda gelmemektedir dolayisiyla uyari kesmek iin new belirleyicisinin kullanilmasi gerekmektedir. class A { public virtual void Foo() { //.. } } class B : A { public new void Foo()//dikkat override etme deil {
} } Ancak bu biimde yeniden bildirilmi metot override etme zincirini kirmaktadir. nk metot override edilirken yukariya dogru ikildiginda ayni isimli ve ayni parametrik yapiya sahip ilk metotun sanal olmasi gerekmektedir. class A { public virtual void Foo() 124 Mert KPRC(mrtkprc@gmail.com) Sayfa 125 / -206- { //.. } } class B : A { public new void Foo() {
} } class C : B { public override void Foo() // error {
} } Overload terimi ile override terimi bazen birbiriyle karitirilmaktadir. Overload farkli parametrik yapilara ilikin yapilarin ayni isimli metot anlamina gelir. Override taban sinifin yeniden yazilmasi anlamina gelmektedir. Overload edilmi metotlarin yalnizca bir ya da bir ka tanesi sanal olabilir. Override etme ileminde yalnizca bu sanal olanlar override edilebilinir. OK BML MEKANZMA ***Bir referansla bir metot agrilmi olsun derleyici metotu referansin statik trne ilikin sinifin faaliyet alanina gre arar. Metot Overload resolution ileminde bulunamazsa error oluur. Bulunursa bulunan metotun sanal olup olmadigina bakilir. Bulunan metot sanal degilse bulunan metotun kendisi agrilir. Sanal ise referansn dinamik trne ilikin snfn override edilmi sanal metotu agrlr. Grldg gibi ok biimli mekanizma sayesinde adeta sanki taban sinif tremi sinifin metotlarini agirabiliyor gibi bir durum olumaktadir. 125 Mert KPRC(mrtkprc@gmail.com) Sayfa 126 / -206- (,NE0)2 32/ ,/NE() using System; namespace CSD { class App { public static void Main() { C c = new C(); B b = new B(); A a; a = c;
a.Foo(); // C.Foo arilir. a = b; a.Foo(); // B.Foo arilir. b = c; b.Foo(); // C.Foo arilir. a = b; a.Foo(); // C.Foo arilir. (unku ust satirdaki atamada b'ye c atandi) } } class A { public virtual void Foo() { Console.WriteLine("A.Foo"); } 126 Mert KPRC(mrtkprc@gmail.com) Sayfa 127 / -206- }
class B : A { public override void Foo() { Console.WriteLine("B.Foo"); } } class C : B { public override void Foo() { Console.WriteLine("C.Foo"); } }
} ***Referansin dinamik trne ilikin sinifta sanal metot override edilmediyse onun bu sanal metotun override edildigi ilk taban sinifinin metotu agrilir. using System; namespace CSD { class App { public static void Main() { C c = new C(); 127 Mert KPRC(mrtkprc@gmail.com) Sayfa 128 / -206- A a; a = c; a.Foo(); // B.Foo arilir. } } class A { public virtual void Foo() { Console.WriteLine("A.Foo"); } }
class B : A { public override void Foo() { Console.WriteLine("B.Foo"); } } class C : B {
} }
RNEK : 128 Mert KPRC(mrtkprc@gmail.com) Sayfa 129 / -206- using System; namespace CSD { class App { public static void Main() { C c = new C(); B b = new B(); A a = new A();
Test(a); Test(b); Test(c);
} public static void Test(A a) { a.Foo(); } } class A { public virtual void Foo() { Console.WriteLine("A.Foo"); } 129 Mert KPRC(mrtkprc@gmail.com) Sayfa 130 / -206- }
class B : A { public override void Foo() { Console.WriteLine("B.Foo"); } } class C : B { public override void Foo() { Console.WriteLine("C.Foo"); }
} } Object sinifinda bildirilmi olan ToString isimli bir sanal metot vardir. Bu metot yle bildirilmitir. public virtual string ToString() { } Biz bu metotu herhangi bir sinifta override edebiliriz. using System; namespace CSD { 130 Mert KPRC(mrtkprc@gmail.com) Sayfa 131 / -206- class App { public static void Main() { object o; Sample s = new Sample();
} class Sample { public override string ToString() { return "This a test"; } }
} Object sinifinin ToString metotu referansin dinamik trne ilikin sinifin ismini reflection mekanizmasini kullanarak elde eder. Bu isme ilikin yapiya geri dner. String sinifinin ToString metotu string ierisinde tutulan yaziyi vermektedir. 131 Mert KPRC(mrtkprc@gmail.com) Sayfa 132 / -206- Animsanacagi gibi .NET teki sinif ve yapilarin neredeyse hepsinde bir ToString metotu vardir. Aslinda bu ToString metotlari Object sinifindan gelen sanal metotun override edilmesiyle olumutur. Temel trlere ilikin yapilarin override edilmi ToString metotlari o yapilarin tuttugu sayilarin yazi kariliklarini bize vermektedir. rnegin : int a = 123; object o = a; Console.WriteLine(o.ToString()); Yapilar tretmeye kapalidir fakat phesiz yapilarda object sinifindan gelen sanal metotlar override edilebilir. object trnden bir dizi yada ArrayList heterojen trleri tutabilir. Bylece biz object trnden bir dizi ya da ArrayList ierisine farkli trden nesneleri atayabiliriz ekleyebiliriz. Sonra bunlarin ToString metotlarini agirabiliriz. Bylece her trn kendi ToString agrilacaktir. using System; using System.Collections; namespace CSD { class App { public static void Main() { int a = 123; long b = 345; double c = 12.45; string d = "Ankara"; Sample e = new Sample(); ArrayList al = new ArrayList();
al.Add(a); al.Add(b); 132 Mert KPRC(mrtkprc@gmail.com) Sayfa 133 / -206- al.Add(c); al.Add(d); al.Add(e); for (int i = 0; i < al.Count; i++) { Console.WriteLine(al[i].ToString()); }
}
} class Sample { public override string ToString() { return "This a test"; } }
} Console sinifinin pek ok degiik parametreli Write ve WriteLine metotlari vardir. Bunlardan biri de object parametreli olandir. Bu object parametreli Write ve WriteLine metotu parametresine ToString metotu uygulayarak elde edilen yaziyi ekrana yazdirmaktadir. Yani Console Sinifinin object parametreli Write ve WriteLine metotlari yle yazilmitir. class Console { public static void Write(object o) 133 Mert KPRC(mrtkprc@gmail.com) Sayfa 134 / -206- { Console.Write(o.ToString()); } public static void WriteLine(object o) { Console.WriteLine(o.ToString()); } } Anahtar Notlar : Peki Console sinifinin yalnizca Object parametreli write ve WriteLine metotu olsaydi bu yetmezdi. Teknik olarak byle tek bir metot yeterli olurdu. Fakat bu durumda her bilgi bir yaziya dnusturulur ekrana basilirdi. Bununda ok nemli olmayan bir zaman kaybina yol aabilecei sylenebilirdi. Bu nedenle tasarimcilar temel turler iin ayrica bulundurmuslar. Anahtar Notlar : Javada ok biimlilik default bir durumdur. Javada virtual yada override anahtar szcukleri yoktur. Dolayisiyla butun statik olmayan metotlar default olarak sanal biimdedir. Taban siniftaki metot turemis sinifta ayni biimde bildirilirse bu override anlamina gelir. class A { public void Foo() { } } class B extends A { public void Foo() { } } A a = new B(); a.Foo();// B.Foo arilir. Tm metotlarin default olarak sanal olmasi bir performans kaybina yol aabilmektedir. Bu neden C# tasarimcilari sanalligi C++ da oldugu gibi koula baglamilardir. 134 Mert KPRC(mrtkprc@gmail.com) Sayfa 135 / -206- Taban sinifin sanal olmayan bir metotu yine bir taban sinifin sanal olmayan bir metotunu agiriyor olsun. Bizde tremi sinif referansiyla taban sinifin sanal olmayan metotunu agiralim diyoruz. Bu sanal olmayan metot tremi sinif referansiyla agrildigina gre ona geirilen this referansi dinamik tr tremi sinif trnden olur. Bizde bu sanal olmayan metot ierisinde sanal metotu agirdigimizda tremi sinifinkini agirmi oluruz. using System; namespace CSD { class App { public static void Main() { B b = new B(); b.Foo();//B.Bar yazar..
}
}
class A { public void Foo() { Bar(); } public virtual void Bar() {
135 Mert KPRC(mrtkprc@gmail.com) Sayfa 136 / -206- }
} class B : A { public override void Bar() { Console.WriteLine("B.Bar"); }
}
} C# standartlarina gre bir string referansiyla herhangi bir referans + operatryle ileme sokulabilir. Bu durumda derleyici string olmayan operand zerinde ToString sanal metotunu uygular ve elde edilen yaziyi birletirmektedir. rnegin: s string trnden a da herhangi bir trden olsun bu durumda s + a ifadesi de a+ s ifadesi geerlidir ve bunlar sirasiyla s + a.ToString(), a.ToString()+s ekline e degerdir. int a = 123; Console.WriteLine("Number = " + a); // Number = 123 Console.WriteLine(a + "is a number"); // 123 is a number Console.WriteLine(a+1.ToString()); // 1231 Console.WriteLine((a+1).ToString()); // 124 object o = 123; Console.WriteLine("Number=" + o); 22.Hafta 2.Gn (30 Ekim 2011) OK BMLLGN FAYDALARI ok biimlilik(polymorphism) trden bagimsiz kod paralarinin oluturulmasi iin kullanilan bir tekniktir. Nesne ynelimli programlama tekniginde mevcut bir kod zerinde degiiklik yapmak istenmez ve kt bir teknik olarak grlr. Degiiklik yerine 136 Mert KPRC(mrtkprc@gmail.com) Sayfa 137 / -206- ekleme yapmak tercih edilmektedir. Ite ok biimlilik bu amaca hizmet etmek iin kullanilan bir tekniktir. rnegin: Bir oyun programi yazacak olalim, bu oyun programinda da eitli toplar bulunuyor olsun bu toplar oyun ierisinde degitirilebiliyor olsun. Ileride de oyuna yeni toplar eklenebilecek olsun. Topun gitmesi ok biimli bir eylemdir. Yani her top gider fakat kendine zg bir biimde gider. Ite biz programi belli bir top zerine degil genel olarak top kavrami zerine kurabiliriz. Bunun iin taban bir top sinifi aliriz bu top sinifinin git isminde bir sanal metodu olur Biz imdi oyundaki topu degitirecek olsak yalnizca new Normal top yerine new ZiplayanTop(); satirini degitiririz. Programin geri kalan kismi belli bir topa bagli degildir. $K %**ML*L*F, *L*K*N ,*(L* >-N,KL,- rnek 1: Parser rnegi: Bir Parser sinifi yazmak isteyelim, Parser programlarinda bir kaynakta bulunan yazi karakter okunur ve ileme sokulmaktadir. Parser sinifinin DoParse isimli metotu bu ii yapiyor olsun diyelim. Peki Parser sinifi karakterlere hangi kaynaktan almaktadir? Kaynaklar degiebilir. Sinif karakterleri bir dosyadan, bir stringten ya da bir soketten alabilir. Ite degien gelerin belirlenip bunlari ok biimli olarak eriilmesi ok biimliligin en nemli kullanim alanlarindan biridir. Kaynak Source isimli bir sinif ile temsil edilebilir. Bu sinifin GetChar isimli bir virtual metotu olabilir. Bu Source Sinifindan FileSource, StringSource, SocketSource gibi siniflar tretilebilir. Bu GetChar metotu bu arada override edilmi olabilir.
Artik Parser sinifi belli bir kaynaga gre degil kaynak kavramina dayali olarak genel bir biimde yazilabilir. class Parser { private Source m_source; public Parser(Source source) { m_source = source; } public void DoParse() { char ch;
ch = m_source.GetChar(); //... ch = m_source.GetChar(); //... ch = m_source.GetChar(); } } imdi biz Parser sinifini Dosyadaki bilgileri Parser edecek ekilde Parse Edelim diyoruz. FileSource fs = new FileSource("x.txt"); Parser parser = new Parser(fs); parser.DoParse(); 137 Mert KPRC(mrtkprc@gmail.com) Sayfa 138 / -206- imdi de sinifin bir stringten alinan bilgilerini Parse edelim diyoruz. StringSource ss = new StringSource("this is a text"); Parser parser = new Parser(ss); parser.DoParse(); Anahtar Notlar : ok biimlilik benzer nesnelere sanki ayni nesneymis gibi muamele yapmaktir. Biz programi yazarken farkli toplari sanki ayni topmus gibi farkli kaynaklari sanki ayni kaynakmis gibi ele aliriz. Zaten insanin algilama biimi de byledir. Di dnya ok karmaiktir. Birbirine ok benzeyen eyler bile farklidir. Insanin bilgi ilem kapasitesi tm bu ayrintilari algilayabilmek iin yeterli degildir. Bylece insan farkli eyleri birbirine benzetip di dnyayi sadeletirir. ok biimlilik bize bunlari saglamaktadir. rnek 2 : Tetris rnegi : Bir tetris oyununda bir takim ekiller dmektedir. Bu ekiller birbirlerinden farkli olsa da hepsi iin bazi eylemle sz konusudur. rnegin btn ekiller der dndrlr sola ve saga hareket ettirilir. Bu eylemler ok biimlidir. Yani bu eylemler tm ekiller sz konusudur fakat her ekilde o ekle zg bir biimde farklilik gstermektedir. Byle bir tetris programinda oyunun kendisi bir sinifla temsil edilebilir. ekiller ayri bir sinifla temsil edilebilir. Tm ekiller bir shape sinifindan tretilmi siniflarla temsil edilebilir.
Her eklin hareketleri iin farkli kodlar gerekir. Yani her ekil der fakat onu drmek iin farkli kodlar gerekebilir. O halde biz programimizi ekil kavrami zerinde her den ekilde aliacak ekilde yazabiliriz. *** VSde Tarali Alan Seip Ctrl + H yapinca Bul ve Deistir islemi uygulanabilmektedir. Tetris sinifinin Run metotunda rastgele bir ekil alinir. Sonra bu ekil tu kontrolleri yapilarak sola saga telenir. Shape shape = GetRandomShape(); shape.MoveLeft(); shape.Rotate(); shape.MoveRight(); rnek 3: Satran rnegi: Bir satran oyununda satran talari degiik biimlerde hareket edebilmektedir. Bir tain gidebilecegi yerler o tain hangi talar olduguna bagli olarak degimektedir. Bir hamlenin geerli olup olmadigini anlamak iin farenin birakildigi yerdeki kareyi teslim edip tain geerli hamleleri ierisinden o karenin olup olmadigina bakilabilmektedir. Ite tm talar ayri siniflarla temsil edilebilir. Tm talarin ortak zellikleri (rengi, konumu vs.) bir taban figr sinifinda toplanabilir. Figr sinifin sanal bir GetValidMoves metotu olabilir ve bu metot tm ta siniflarinda override edilmi olabilir. public virtual ArrayList GetValidMoves() { } 23.Hafta 1.Gn (05 Kasm 2011) 138 Mert KPRC(mrtkprc@gmail.com) Sayfa 139 / -206- KURBAN BAYRAMI TATL 23.Hafta 2.Gn (06 Kasm 2011) KURBAN BAYRAMI TATL 24.Hafta 1.Gn (12 Kasm 2011) rnek 4: PowerPoint rnegi: Powerpoint benzeri bir program yazacak olalim diyoruz bu programda diktrgen gibi elips gibi izgi gibi eitli ekiller izilecek olsun. Bu ekiller birbirinden farkli olsa da sanki ayni ekilmi gibi davranabiliriz. Bylece programin birok blmn trden bagimsiz olarak ekil kavrami zerinde yazabiliriz. Bunun iin taban bir Shape sinifi alinir. Bu Shape sinifinda RectangleShape, LineShape, ElipsShape gibi siniflar tretilir. Shape sinifini sanal metotlari bu siniflarda override edilir. Yaratilan btn ekiller bir Collection sinifta saklanir. Her ekil kendi koordinatlarini tutmaktadir. Shape RectangleShape LineShape EllipseShape public virtual bool IsInside (int x, int y); public virtual void Select(); ArrayList al = new ArrayList(); r = new Rectangle(); al.Add(r); //.. e = new EllipseShape(); al.Add(e); Biz fare ile bir noktaya tikladigimizda Sistem bize tiklanan yerin koordinatlarini vermektedir. Ilgili ekli sememiz iin tek tek o noktanin herhangi bir eklin ierisine dp dmedigine bakmaliyiz. Ite IsInside Metotu ok biimli bir metottur. Yani her ekil sinifinda bu metot vardir fakat kendine gre biraz farkli bir ilem yapmaktadir. Bylece biz aagidaki gibi noktanin her ekil iin nereye dtgn anlayabiliriz. $$$ %u derste basit bir &o'er&oint uy(ulamas) yap)ld)*) i+in bu ders notlar) ,)sa olmu-tur. 24.Hafta 2.Gn (13 Kasm 2011) rnek 5 : Bir iyerinde alianlar farkli siniflarla temsil ediliyor olsun diyoruz. Bu iyerinde herkesin maai vardir fakat herkesin maai degiik bir formlle hesaplanmaktadir. Herkesin maai farkli bir biimde hesaplanmaktadir. Btn alianlari bir ArrayList iinde toplami olalim diyoruz. ArrayList staff = new ArrayList(); imdi herkesin maaini aagidaki gibi bir algoritmayla toplayabiliriz. double total = 0; foreach(Employee e in staff) total += e.CalcSalary(); ABSTRACT METOTLAR VE SINIFLAR Bazi ok biimli uygulamalarda taban sinifin sanal metotlari aslinda hi agrilmamaktadir. Taban sinif trden bagimsizligi temsil etmek iin kullanilmakta ve aslinda bu sanal metotlar agrildiginda bu tremi siniflarin override edilmi metotlari 139 Mert KPRC(mrtkprc@gmail.com) Sayfa 140 / -206- agrilmaktadir. PowerPoint, tetris rnekleri tipik olarak byledir. Bu rneklerde taban Shape sinifinin metotlari agrilmamaktadir. Bu tr uygulamalarda taban sinifin sanal metotlarinin bir gvdeye sahip olmasi beklenmez. Ite sanal metotu bildirirken virtual yerine abstract anahtar szcgn kullanirsak metot yine sanal olur fakat gvdesi bulunmaz. NEML NOT: En az bir abstract bir elemana sahip olan snfa abstract snf denmektedir. Bu durumda snf bildiriminin bana da abstract anahtar szcg yerletirilmektedir. abstract class Shape { public abstract void Move(); public abstract void Draw(); } Abstract metotlar gvde iermez bildirim ;(Noktali virgl) ile kapatilmaktadir. Abstract snf trnden referanslar bildirilebilir fakat new operatryle nesneler yaratlamaz. Abstract siniflar abstract olmayan elemanlara rnegin metotlara ve veri elemanlarina sahip olabilirler. Normal bir sinifa biz bir tek abstract metot ekledigimizde sinif abstract olur. ABSTRACT SINIFLAR NEW LE NESNE YARATILAMAZ... namespace CSD { class App { public static void Main() {
} } abstract class A { public abstract void Foo(); public abstract void Bar(); } abstract class B : A { public override void Foo() { //.. } } class C : B { public override void Bar() {
} } } 140 Mert KPRC(mrtkprc@gmail.com) Sayfa 141 / -206- Taban abstract A sinifinda Foo ve Bar isimli iki abstract metot bulunuyor olsun. Biz tremi B sinifinda Foo metotunda override etmi olalim, B `den tretilmi C sinifinda da geri kalan Bar metotunu override etmi olalim. Bu durumda B abstract olur fakat C abstract olmaz. Yani bir tremi sinifi abstract olmaktan kurtarmak iin yalnizca yukariya dogru override edilmemi metotlari override etmek yeterlidir. Bir sanal metotu virtual m abstract m yapmalyz? *** Virtual bir sanal metot bir gvde iermek zorundadir. Dolayisiyla tremi sinifta bu metot override edilmek zorunda degildir. Edilmemise taban siniftaki agrilir. Fakat abstract metotlar kesinlikle tremi sinifta override edilmek zorundadir. O halde biz taban sinifta default bir ilem yapan bir metot istiyorsak ve taban sinif trnden de nesnelerin yaratilmasini istiyorsak metotu abstract degil virtual yapmak durumundayiz. Ayrica bir sinif hi abstract elemana sahip olmadigi halde abstract anahtar szcg kullanarak yine de abstract yapilabilir. Yine biz bu sinif trnden nesne yaratamayiz. Virtual ile abstract belirleyici beraber kullanilamaz fakat abstract ile override eriim belirleyicisi beraber kullanilabilinir. Soru: Biz bir sinif trnden nesne yaratilmasini istemiyorsak ne yapabiliriz ? Cevap: Sinif abstract eleman iermedigi halde sinifin baina abstract yazilmasi new ile nesne yaratilmasini engellemektedir. namespace CSD { class App { public static void Main() {
A a = new C(); a.Foo();
} } class A { public virtual void Foo();
} abstract class B : A { public abstract override void Foo();
} class C : B { public override void Foo() {
} }
} SANAL PROPERTY ELEMANLAR 141 Mert KPRC(mrtkprc@gmail.com) Sayfa 142 / -206- Property elemanlar aslinda gizli metotlardir. Bu nedenle bunlar da override edilebilir. rnegin: namespace CSD { class App { public static void Main() { A a = new B(); a.Val = 10;
} } class A { public virtual int Val { get { //... } set { //... } }
} class B : A { public override int Val { get {
} set {
} } }
} Property elemanlar da abstract olabilir. Tremi sinifta override edilebilir. Bu durum da propertynin get ve set blm noktali virgl(;) ile kapatilir. abstract class C { public abstract int Val { get; set; } 142 Mert KPRC(mrtkprc@gmail.com) Sayfa 143 / -206- } class D : C { public override int Val { get { //... } set { //... } } } C# standartlarina gre taban siniftaki sanal property hem get hem de set blm ieriyorsa tremi sinifta bu property override edilirken hem get ya da hem de set blmyle ya da yalnizca set blm ile override edilebilir. Fakat taban siniftaki sanal property yalnizca get ya da yalnizca set blmne sahipse override ederken hangisi varsa ona gre ilem yapilir. Benzer biimde taban siniftaki abstract propertyin hem get hem de set blm varsa tremi sinifi abstract olmaktan kurtarmak iin her iki blm de override etmek zorundayiz. SEALED SINIFLAR Bir sinif sealed anahtar szcg ile bildirilirse o siniftan artik tretme yapilamaz. Bu anahtar szck okunabilirligi arttirmak iin dnlmtr ve ayni zamanda sanal metotlarin agrilmasi sirasinda derleyicinin optimizasyon yapabilmesini de saglamaktadir. sealed class Sample { }
.NET sinif ktphanesinde de pek ok sealed sinif vardir. rnek Console sinifi.... 25.Hafta 1.Gn (19 Kasm 2011) SEALED OVERRDE METOTLAR VE PROPERTYLER Sealed anahtar szcg metotlar da ve propertyler de ancak override anahtar szcg ile beraber kullanilabilinir. rnegin: class A { public virtual void Foo() { } } class B : A { public sealed override void Foo() {
} } 143 Mert KPRC(mrtkprc@gmail.com) Sayfa 144 / -206- Bu durumda ilgili sanal metot artik daha fazla tremi siniflarda override edilemez. Sealed override metotlar ve propertyler okunabilirligi arttirabilir ve bazi durumlar da derleyicinin optimizasyon yapabilmesini saglar. STATIC SINIFLAR Static anahtar szcg sinif bildiriminin baina getirebilinir. rnegin: static class C { //... } Statik sinif kavrami C#a Framework 2.0(VS 2005) ile sokulmutur. Static sinifin btn elemanlari statik olmak zorundadir. rnegin Console sinifi, Math Sinifi statik siniflardir. Statik sinif trnden referanslar bildirilemez new operatryle nesneler yaratilamaz. Static siniftan tretme yapilamaz. Benzer biimde static sinifta herhangi bir siniftan tretilemez. Yani static bir snf ne tremi snf ne de tretilen snf olabilir. PARTIAL SINIFLAR Partial sinif kavrami da C#a Framework 2.0 ile sokulmutur. Bir sinif birden fazla para halinde bildirilebilir. Bu durumda sinifin tm paralarinin nne partial anahtar szcg getirilmek zorundadir. rnegin: partial class Sample {
} partial class Sample {
} Partial bir sinifin paralari farkli kaynak dosyalar da olabilir. Btn paralarda partial bildirilmek zorundadir. Sinifi tek para oldugu halde sinif partial olarak bildirilebilinir. Yalnizca ayni isim alanindaki partial siniflar birletirilmektedir. Partial bir sinif baka bir siniftan tretilmi olabilir bu durumda taban sinif tek bir partial bildiriminde belirtilebilinir ya da birden partial bildiriminde bildirilebilinir. Bu iki biim arasinda bir fark yoktur. Partial siniflar zellikle IDEli alimada IDEnin sinifa ekledigi kodlarla programcinin ekledigi kodu birbirinden ayirmak iin dile eklenmitir. NULL REFERANS KAVRAMI Null anahtar szcg her trden bir referansa atanabilmektedir.
Sample a; a = null;
Bu durumda biz referansa deger atami oluruz fakat atadigimiz deger hi bir nesnenin adresi olmayan bo bir adrestir. Ierisine deger atanmami bir referansi zaten biz kullanamayiz. Fakat iersine null deger atanmi bir referansi kullanirsak hata derleme aamasinda ortaya ikmaz. Hata programin alima zamani sirasinda referansin kullanildigi noktada ortaya ikar. Null referans bazi durumlarda gerekmektedir. rnegin; 144 Mert KPRC(mrtkprc@gmail.com) Sayfa 145 / -206- bir referansa deger atama zorunlulugu referansa null degeri verilerek saglanabilir. Tabi ierisinde null degeri bulunan referans kullanilmamalidir. public static void Main() { Random r = new Random(); string s; switch (r.Next(4)) { case 0: s = "Sifir"; break; case 1: s = "Bir"; break; case 2: s = "Iki"; break; case 3: s = ""; break; } Console.WriteLine(s); // compile time error!! } BU hatadan kurtulmak iin s ` e null degeri atanmasi gerekir. null referans bazen bir nesnenin p toplayici tarafindan seilebilir durumuna getirmek iin kullanabilir. rnegin: Sample s = new Sample();
//... s = null; Null referans bazen baarisizligi anlatmak iin de kullanilabilinir. rnegin dosyadan bir satir okumakta kullanilan bir GetLine metotunun bulundugunu dnelim bu metot bize okunan satiri versin. Peki ya dosyada satirlar bitmise GetLine bu durumda nasil bir string verecektir.? Cevap = Ii bo bir string vermesi uygun olmayabilir. nk dosyada bo satirlar da olabilir. Ite bu tr durumlarda null referans kullanilmaktadir. StreamReader sr = new StreamReader(); string s; s = sr.GetLine(); if (s == null) { } Bir referans == yada != iaretiyle null referansiyla karilatirabilinir. DELEGELER(DELEGATE) Delegeler metotlari tutan ve istenildigi zaman agiran zel siniflardir. .NETin GUI programlama modelinde delegeler olduka sik kullanilmaktadir. Bir delege bildiriminin genel biimi yledir. delegate <geri dnus deerinin turu> <delege ismi> ([Parametre bildirimi]) delegate int Proc(int a,int b);
Delege bildirimi bir metot bildirimine benzese de aslinda bir sinif bildirimi gibidir. 145 Mert KPRC(mrtkprc@gmail.com) Sayfa 146 / -206- Bir metotun tutulmasi iin onun yalnizca balangi adresinin tutulmasi yeterlidir. nk teknik olarak balangi adresi bilinen bir metot agirilabilinir. Metotlarin kodlari bellekte zaten ardiil olarak tutulmaktadir. Anahtar Notlar : Bir referansin gsterdii yerdeki nesnenin uzunluu o referansin turune balidir. Fakat bir referansin kendi uzunluu referansin turu ne olursa olsun hep aynidir. 32 bit isletim sistemlerinde 4 byte, 64 bit isletim sistemlerinde 8 bytedir. C#da bir metotun ismi hi parantezler kullanilmadan yazilmisa o metotun adresi anlamina gelmektedir. rnegin: class Sample { public static int Foo() { } } Sample.Foo(); // Burada Sample isimli sinifin Foo isimli metotu arilir. Sample.Foo // Burada ise Sample.Foo metotunun baslangi adresi belirtilmistir. Yani metot alistirilmamistir. Bir delege her trl metotu tutamaz yalnizca geri dn degeri ve parametresi belli trden olan metotlari tutar. rnegin: delegate int Proc(int a); delegate void Test(); Burada Proc geri dn degeri int parametresi int olan, Test ise Geri Dn degeri void Parametresi olmayan metotlari tutabilir. Delegeler statik olan ya da statik olmayan metotlari tutabilir. Delegeler kategori olarak referans trleridir. Delege nesneleri new operatryle yaratilir. C# derleyicisi bir delege bildirimi grdgnde onun iin tek parametreli balangi metotu yazmaktadir. Bu balangi metotu tutulacak metotun adresini alir. Bylece bir delege nesnesi tutulacak metot belirtilerek yaratilmaktadir. rnegin: delegate int Proc(int a); Proc d; d = new Proc(Sample.Foo); Bir delege referansi metot agirma operatryle kullanilabilinir. Bu durumda delegenin tuttugu metot agirilir. rn olarak da tutulan metotun geri dn degeri verilir.
namespace CSD { class App { public static void Main() { Proc d; int result;
d = new Proc(Sample.Foo);
result = d(10);
146 Mert KPRC(mrtkprc@gmail.com) Sayfa 147 / -206- Console.WriteLine(result);
} } class Sample { public static int Foo(int a) { return a * a; }
} delegate int Proc(int a); } Bir metotun parametre degikeni bir delege olabilir. Bylece bu metot ayni trden bir delege referansi ile agrilmaktadir. phesiz ayni trden iki delege referansi bir birine atanabilmektedir.
namespace CSD { class App { public static void Main() { Proc d = new Proc(Sample.Foo); DoSomething(d);
} public static void DoSomething(Proc d) { d(); } } class Sample { public static void Foo() { Console.WriteLine("Foo"); }
} delegate void Proc(); } Bir Delege statik olmayan bir metotu da tutabilir. Bu durumda metotun adresi delegeye referansla birlikte verilmelidir. rnegin r.Foo gibi bir ifade hem r referansini hem de Foo metotunun adresini belirtir. Artik delege metotu agrildiginda metot belirttigimiz referansta agrilacaktir. rnegin: Proc d; Sample s = new Sample(); d = new Proc(s.Foo); d(); // s.Foo ()ile ayni anlamda 147 Mert KPRC(mrtkprc@gmail.com) Sayfa 148 / -206- namespace CSD { class App { public static void Main() { Sample s = new Sample(100); Proc d = new Proc(s.Foo); d(); } } class Sample { private int m_a;
public Sample(int a) { m_a = a; }
public void Foo() { Console.WriteLine(m_a); }
} delegate void Proc(); } Metot ismi niteliksiz olarak verilirse nce isim aramasi yapilir eger metot bulunursa metotun statik olup olmadigina bakilir metot statik ise onun sinif ismi ile statik degilse this referansiyla kullanildigi varsayilir. DELEGELERE NEDEN GEREKSNM DUYULMAKTADIR? Bazen bir takim siniflar ve metotlar bizden bir olay gerekletiginde agiracaklari metotlari isterler. rnegin bir butonun zerine tiklanip tiklanmadigini programcinin kendisi izlemez. Onu buton kendisi yani button sinifi izler. Dgmenin zerine tiklandiginda biz bir eyler yapmak isteyebiliriz. Ite bu tr durumlarda dgme bizden bir delege referansi ister. Biz de bir delege nesnesi yaratip ierisine metot yerletiririz. O delege nesnesinin referansini butona veririz. Butonda tiklanama gerekletiginde bu delegenin metotunu agirir. O zaman bizim metotumuz agrilmi oluruz. Ne zaman bir olay gerekletiginde bizim bir fonksiyonumuzun agrilmasini istiyorsak olayi izleyip agiracak sinifa ya da metota biz bir delege nesnesi veririz. 25.Hafta 2.Gn (20 Kasm 2011) rnegin: System.Threading isim alani ierisinde Timer isimli bir sinif bizden bir delege nesnesi alir. Belli bir periyotla o delegenin metotlarini agirir. Timer Sinifinin bir balangi metotu yledir. public Timer 148 Mert KPRC(mrtkprc@gmail.com) Sayfa 149 / -206- ( TimerCallBack callback, Object state, int dueTime, int period ) Metotun birinci parametresi TimerCallBack isimli bir delege trndendir. Bu delegenin parametrik yapisi yledir : delegate void TimerCallBack (object state); Metotun ikinci parametresi delege metotuna geirilecek nesneyi belirtir. nc parametre periyodik agirmanin ne zaman balatilacagini belirtir. (.e /aman ba-layaca*)na misal 01 saniye sonra diyebiliri/.) Nihayet son parametre milisaniye cinsinden periyodu belirtmektedir.(2ani ne ,adar bir sreyle te,rarlanaca*)) namespace CSD { class App { public static void Main() { Timer timer = new Timer(new TimerCallback(Foo), null, 0, 1000); Console.ReadLine();
} public static void Foo(object o) { DateTime dt; dt = DateTime.Now; Console.Write("{0:D2}:{1:D2}: {2:D2}\r",dt.Hour,dt.Minute,dt.Second); } } } *** \r => cursoru bulunan satirin baina getiriyor ve yaziyi silip batan tekrar yazar. *** Main metotunda Console.ReadLine(); metotu yazilmasiydi Timerimiz gzkmeyecekti.
Bir delege normal olarak bir metot tutar. Fakat onu birden fazla metot tutar hale getirebiliriz. Ayni trden iki delege referansi arti operatryle toplama ilemine sokulabilmektedir. Bu durumda yeni bir delege nesnesi yaratilir bu yeni delege nesnesinin metot listesi operand olan metot listelerinin birleiminden oluur. rnein: Proc d1 = new Proc(Foo); Proc d2 = new Proc(Bar); Proc d3; d3 = d1 + d2; d3(); // nce Foo sonra bar alisir. *Ierisinde birden fazla metot bulunan bir delege agrildigi zaman geri dn degeri olarak son metotun geri dn degeri elde edilmektedir. *Toplama ileminde operandlardan bir tanesi null ise toplamin sonucunda yeni bir 149 Mert KPRC(mrtkprc@gmail.com) Sayfa 150 / -206- delege nesnesi yaratlmaz null olmayan referans elde edilir. *Her iki operand da null ise toplama ileminden null referans elde edilir. Proc d = null; d += new Proc (Foo); d += new Proc (Bar); d += new Proc (Tar); *Ayni trden iki delege referansi ikarma ilemine sokulabilir bu durumda yeni bir delege nesnesi yaratilir. Yeni yaratilan delege nesnesi; soldaki metot listesinin sagdaki metot listesinden ikartilmasindan elde edilen metot listesi olur. *Eger soldaki delege nesnesinin metot listesinde sagdaki delege nesnesinin hi bir metotlari yoksa yeni bir delege nesnesi yaratlmaz. Soldaki referansin aynisi elde edilir. *** ikarma ileminde sira nemlidir. ikartmanin yapilabilmesi iin metotlarin ayni sirada bulunuyor olmasi gerekir.(OK NEML) rnegin: d1 = Foo, Bar, Tar d2 = Foo,Tar d3 = d1-d2; d3 == d1;(A456lama : ok nemli dediimiz maddede belirttiimiz gibi siranin nemli olmasindan dolayi sol ve sa metotlarda benzer olmadii iin sol metot listesine esit olur d3 nesnesi. ikarma yaparken Foo ve Tar metotlari ortak Bar kalir diye d787n7lmemelidir siranin nemli olduu unutulmamalidir. ) *ikartma ileminde soldaki operand null ise null elde edilir. *Sagdaki null ise soldaki elde edilir. *Her ikisi null ise null elde edilir.
Eger ikartma ileminde eger sagdaki operandin metot listesi soldaki operandin metot listesinde birden fazla varsa metot listesinde sonda olan ikartilir. d1 = Foo,Bar,Foo d2 = Foo d3 = d1-d2; d3 = Foo,Bar Eger ikartma ileminde her iki operandin metot listeleri ayni ise ikartma ileminden null referansi elde edilmektedir. Framework 2.0 ile birlikte metot adreslerinden delegelere otomatik dntrme eklenmitir. Bylece biz bir metot adresini dogrudan bir delege referansina atayabiliriz bu ilem sonucunda aslinda derleyici bir delege nesnesini yaratir iersine bu metodu yerletirir dolayisiyla yine delege nesnesinin adresini referansa atar. Yani rnein : Proc d = new Proc(Sample.Foo); esittir Proc d = Sample.Foo; Benzer biimde bir delege referansiyla dogrudan bir metot adresi toplama ve ikarma ilemine sokulabilir. Bu durumda da aslinda bir delege nesnesi yaratilmakta metot onun iersine yerletirilmekte ve o delege referansi ileme sokulmaktadir. rnein: 150 Mert KPRC(mrtkprc@gmail.com) Sayfa 151 / -206- Proc d1 = new Proc (Foo); d2 = d1 + Bar; // d2 = d1 + new Proc(Bar); rnein: Proc d = null; d += Foo; d += Bar; d +=Tar; d = d + new Proc(Foo); d = d + new Proc(Bar); d = d + new Proc(Tar); SINIFLARIN VE YAPILARIN EVENT ELEMANLARI Event elemanlar siniflardan ya da yapilarda bulunur ve bir eit propertylere benzemektedir. Event anahtar szcg bildirimde ancak delege veri elemanlarinda kullanilmaktadir. Event bir tr degildir delegeyi nitelemektedir. Bir event elemanin genel biimi yledir. [erisim belirleyicisi] event <delege tur ismi> <event eleman ismi> { add { } remove { } } Nasil propertylerin get ve set blmleri varsa event elemanlarinda add ve remove blmleri vardir. Event elemanlarda add ve remove blmlerinin ikisi de bulunmak zorundadr. rnegin : Bir event eleman snfn dnda yalnzca += ve -= elemanlaryla kullanlr. Sample s = new Sample(); s.Test += new Proc(Foo); s.Test -= new Proc(Foo); Event elemana diaridan atama yapamayiz. Onu baka operatrlerle kullanamayiz. Event elemanlar += operatryle kullanildiginda onun add blm, -= operatryle kullanildigin da remove blm aliir. Genellikle programci sinifin private blmnde bir delege eleman bulundurur sonra bu event elemanin add blmnde buna ekleme yapar remove blmnde de bundan ikarma yapar. Event eleman adeta kullanimi diariya kisitlanmi bir delege zelligi gstermektedir. Diaridaki kiiler bu delegeye yalnizca ekleme ikarma yapabilirler delege metotlarini agiramazlar. Bylece sinif daha gvenli hale getirilmektedir. Bu nedenler pratikte .NET ierisindeki siniflarda genellikle biz hep event eleman grmekteyiz. Bu event eleman aslinda private bir delegeyle iliki kurmaktadir. phesiz delege metotlarini yalnizca ona eriebilen sinifin kendisi agirmaktadir. Eger delege metotlarinin diaridan agirilmasi isteniyorsa sinifa public bir metot konulabilir. Bu metot event metotlarini cagirabilmektedir. 151 Mert KPRC(mrtkprc@gmail.com) Sayfa 152 / -206- namespace CSD { class App { public static void Main() { Sample s = new Sample(); s.Test += new Proc(Foo); s.Fire();
} public static void Foo() { Console.WriteLine("Foo..."); } } class Sample { private Proc m_test; public event Proc Test { add { m_test += value; } remove { m_test -= value; } } public void Fire() { m_test(); } } delegate void Proc(); } BZ BR SINIFIN EVENT ELAMANIYLA KARILATIGIMIZDA NE DNMELYZ ? Biz bu event elemana metot ekleyebiliriz. Fakat ekledigimiz metotlari biz agiramayiz ancak belli bir olay oldugunda o sinif agirmaktadir. rnegin : Button sinifin Click isimli EventHandler delege trnden bir elemani vardir. Biz bu event elemana += ile delege ekleyebiliriz. Button sinifi fare hareketlerini kendisi izler ve delege metotlarini o agirir. ERMCSZ EVENT ELEMANLAR Event elemanlarin kolay yazilabilmesi ve kullanilabilmesi iin eriimcisiz event elemani kavrami uydurulmutur. Eger event bildiriminde blok ailmaz ve bildirimi ; ile kapatilirsa buna eriimcisiz event elemani denir. rnein : public event Proc Test; 152 Mert KPRC(mrtkprc@gmail.com) Sayfa 153 / -206- Aslinda eriimcisiz event elemani da eriimlidir. Bu durumda derleyici kendisi private bir delege elemani alir event iin add ve remove blmlerini yazar. Bu blmlerde ekleme ve ikarma yapmaktadir. Yani buradaki kod yukaridakiyle edegerdir. Bu pratik bir yazimdir. Eriimcisiz event elemani yine diaridan yalnizca += ve -= operatrleriyle kullanilmaktadir. Sinifin ierisinden o private delege gibi kullanilmaktadir. SKELET GU PROGRAMI Ekrana bir pencere ikartan temel bir programa iskelet GUI programi diyebiliriz. Iskelet GUI program: System.dll, System.Windows.Forms.dll ktphanelerini kullanir ayrica System.Drawing.dll dosyasini da eklememiz de fayda vardir. Iskelet Programda u isim alanlarinda using direktiflerinin uygulanmasi gerekir. using System; using System.Windows.Forms; using System.Drawing; Programin ana penceresini Form isimli bir sinif temsil etmektedir. Fakat bu pencereyi dogrudan kullanmak yerine bir takim eklemeler yapacagimiz iin treterek kullanmak tavsiye edilir. class MyForm : Form { } new operatryle Form sinifi ya da bundan tremi bir sinif trnden bir nesne yaratildiginda programin ana penceresi de yaratilmi olmaktadir. Daha sonra mesaj dngsne girmek gerekir. Bu ilem Application.Run() metotuyla yapilmaktadir. Bu Run metotu form nesnesini parametre olarak almaktadir. Bu durumda iskelet GUI programi yle olur. using System; using System.Windows.Forms; using System.Drawing;
namespace CSD { class App { public static void Main() { Application.Run(new MyForm()); } } class MyForm : Form {
} } Tabi uygulamada ayrica bir siyah ekran ikmasi istenmiyorsa uygulama ayarlama ekranindan Windo's Application a getirilmelidir. 26.Hafta 1.Gn (26 Kasm 2011) 153 Mert KPRC(mrtkprc@gmail.com) Sayfa 154 / -206- Tm Pencerelerin ortak zellikleri tepedeki kontrol sinifinda toplanmi olup bu kontrol sinifindan eitli siniflar tretilmitir. Control a3)Form b) ButtonBase c )ListControl b-1Button b-2 checkbox b-3 RadioButton c-1 ListBox c-2 ComboBox
Control sinifindaki elemanlar tm pencere sinifinda vardir. Windowsta bir pencere diger pencerenin iersindeyse ve onun sinirlari diina ikamiyorsa o tr pencerelere alt pencereler denmektedir. Alt pencere ile st pencere arasinda ierme ilikisi vardir. Bir pencereyi baka bir pencerenin alt penceresi yapmak iin kontrol sinifinin Parent propertysine o pencerenin referansini atamak gerekir. CONTROL SINIFININ BAZI NEML PROPERTY ELEMANLARI Control sinifinin string trnden Read/Write Text isimli property elemani pencere balik elemani belirtir. Control sinifinin Left/Right , Top/Bottom Location isimli property elemanlari pencereyi konumlandirmak iin kullanilmaktadir. Left/Top => Read/Write ve Right/Bottom => Read only propertyler ve int trdendir. Location propertyside Point trndendir. Alt pencereler iin orjin st pencerenin alima alaninin sol st kesi, Ana pencereler iin orjin Desktopin sol st kesidir. Control sinifinin Size Propertysi Read/Write bir propertydir ve pencerenin geniligi ile yksekligini set etmek iin kullanilmaktadir. Benzer biimde Width ve Height Property elemanlari da Read/Write elemanlardir ve int trndendir. Bunlar genilik ve ykseklik belirlemede kullanilmaktadir. Control sinifin Click isimli Event elemani EventHandler isimli bir delege trndendir. Bir Controln zerine fare ile tiklanip ve el ekilince event elemani tetiklenir. EventHandler isimli delegenin parametrik yapisi yledir: public delegate void EventHandler(Object sender,EventArgs e) Grldg gibi bu event elemana metot yerletirebilmek iin geri dn degeri void parametleri object ve EventArgs trnden olmasi gerekmektedir. EXCEPTON LEMLER Exception terimi; donanimda ve yazilimda aniden ortaya ikan beklenmedik hatalari belirtmektedir. Bazi ilemleri yapmaya alitigimizda problemlerle karilama olasiligimiz vardir. rnegin: bir dosyayi amak istedigimizde ya da seri porttan bilgi okumak istedigimizde ya da bir yaziyi Parse etmek istedigimizde baari garanti degildir. Biz bu tr durumlarda ilem baarilmi gibi yola devam etmemeliyiz. Eger byle yaparsak program baka bir aamada uygunsuz bir biimde kecektir. Ite oluabilecek hatalari tespit etmek, mmknse onlari telafi etmek mmkn degilse hi olmazsa uygun bir hata mesajiyla uyarmak tercih edilmelidir. Exception mekanizmasi genellikle prosedrel dillerde yoktur. Nesne ynelimli dillerde kodu basitletirmek iin bulundurulmaktadir. 154 Mert KPRC(mrtkprc@gmail.com) Sayfa 155 / -206- Exception ilemlerindeki ama oluabilecek hatalari etkin bir biimde programin belli noktalarinda ele almaktadir. Exception mekanizmasi iin try, catch, throw ve finally anahtar szckleri kullanilmaktadir. Try anahtar szcgnden sonra bir blok ailir buna try blogu denilmektedir. Try blogunu bir yada birden fazla catch blogu yada finally blogu izlemek zorundadir. Try blogu yle oluturulur. Try iinde bir tane blok olsa dahi blok amak zorundayz.
try { //... } Catch anahtar szcgnden sonra parantezler ierisinde bir parametre bildirimi yapilir. Buna catch parametresi denir. Catch parametresi bir tane olmak zorundadir. Parametrenin sadece tr yazilabilir yada parametreni degikenin ismi de belirtilebilir. catch(<tur> [deisken ismi]) {
} Catch parametresi herhangi bir trden olamaz System.Exception sinifi trnden yada bu siniftan tretilmi tr trnden olmak zorundadir. Birden fazla catch blogu olabilir fakat bunlarin parametre trleri farkli olmak zorundadir. try {
} catch (MyException e) {
} catch (YourException e) {
} ***Try ile Catch blogu arasinda ve catch bloklari arasinda herhangi bir atom bulunamaz. ***Ayrica try blogu tek baina da bulunamaz. namespace CSD { class App { public static void Main() { try {
} } Exception mekanizmasini tetikleyen throw anahtar szcgdr. Throw deyiminin genel biimi yledir. throw [referanas]; throw ileminde de herhangi bir sinif kullanilamaz. System.Exception sinifi yada bu siniftan tretilmi bir sinif referansi kullanilmak zorundadir. rnegin: MyException me = new MyException(); throw me; Yada bu ilem daha pratik yle yapilabilir. throw new MyException(); throw ilemi olutugunda programin akii bir goto ilemi gibi son girilen try blogunun uygun catch bloguna aktarilmaktadir. Hangi catch bloguna aktarilacagi throw anahtar szcgnn yanindaki argmana baglidir. Hangi trden referanslara throw etmi isek aki o parametreli catch bloguna aktarilmaktadir. catch bloklari adeta switch deyiminin case blmleri gibidir. Yalnizca tek bir catch blogu alitirilir. Digerleri atlanir ve aki catch bloklarinin sonundan devam etmektedir. Aki try bloguna girdigi zaman hi Exception olumaz ise aki normal olarak try blogundan ikar catch bloklari atlanir ve aki catch bloklarindan sonra atlanir. using System; using System.IO; using System.Drawing; using System.Threading; namespace CSD { class App { public static void Main() {
} public static void Foo(int a) { Console.WriteLine("Foo begins.."); if (a < 0) throw new MyException(); Console.WriteLine("Foo ends");
} }
class MyException : Exception {
} class YourException : Exception {
} }
Eger throw ettigimiz tre ilikin bir catch blogu yoksa bu durum normal kabul edilmez ve CLR Exceptionun oluturdugu Threadi sonlandirir. Bu durum bizim programimizin kmesine sebep olur. Benzer biimde bir Exception olutugunda biz bir try blogu ierisinde bile degilsek yine ilgili thread sonlandirilarak program ker. Ktphane ierisinde yalnizca Exception sinifi yoktur Exception sinifindan tretilmi pek ok sinif da vardir. Yine ktphane ierisindeki siniflarin metotlari eitli anormal durumlarda kendi ilerinde throw ilemleri yapmilardir. Eger biz bir metotu agirirken o metotun ierisinde throw uygulanmisa bizim onu ele almamiz gerekir.Aksi halde programimiz ker . phesiz bizim agrilan bir metotta oluabilecek Exceptionlari ele alabilmemiz iin onlarin hangi siniflarla throw ettigini bilmemiz gerekir. Bylece o siniflar iin catch blmleri oluturmamiz gerekir. MSDN yardim sisteminde her metotun hangi problemler sonucunda hangi trler throw yaptigi tek tek listelenmitir. Programcinin bunlara bakip uygun catch bloklarini oluturmasi gerekir. class App { public static void Main() {
try { 157 Mert KPRC(mrtkprc@gmail.com) Sayfa 158 / -206- int val;
val = int.Parse(Console.ReadLine()); Console.WriteLine(val);
} catch (ArgumentNullException e) { Console.WriteLine("Girilen deer null"); } catch (FormatException e) { Console.WriteLine("Sayinin formati bozuk."); } catch (OverflowException e) { Console.WriteLine("Sayi ok buyuk yada ok kuuk"); }
}
} 26.Hafta 2.Gn (27 Kasm 2011) Programin akii st ste birden fazla kez try bloguna girebilir. Bu durumda bir throw ilemi olutugunda son girilenden diariya dogru sirasiyla try bloklarinin catch bloklari taranir ve aki oraya aktarilir. Eger hi byle bir catch blogu bulunamazsa Thread sonlandirilir. Dolayisiyla program da ker. Throw deyimi throw; biiminde noktali virgl(;) ile sonlandirilabilinir. Ancak bu yalnizca faaliyet alani bakimindan catch bloklari ierisinde yapilabilmektedir. Byle bir durumda adeta Exception hi yakalanmami gibi bir nceki try bloklarina yollanir. Bu ilemin hedefi bir Exception yerel olarak ileyip sanki hi ilenmemi gibi onun yukarida yeniden ilenmesini saglamaktir. throw; ilemi adeta orjinal Exceptiona orjinal argmaniyla yeniden firlatmaktadir. using System; namespace CSD { class App { public static void Main() { bool flag = false;
do { try { int val; Console.Write("Bir sayi giriniz:"); val = int.Parse(Console.ReadLine()); Console.WriteLine(val); flag = true; 158 Mert KPRC(mrtkprc@gmail.com) Sayfa 159 / -206-
} catch(ArgumentNullException e) { Console.WriteLine("Arguman null olarak geilmis.");
} catch(OverflowException e) { Console.WriteLine("Sayi ok buyuk ya da ok kuuk."); } catch(FormatException e) { Console.WriteLine("Sayinin Formati Bozuk"); } }while(! flag); }
} } Tremi sinif trnden bir throw ilemi taban sinif trnden bir catch blogu ile yakalanabilir. Bylece aslinda biz her trl Exceptioni, Exception parametreli bir catch blogu ile yakalayabiliriz. using System; namespace CSD { class App { public static void Main() { bool flag = false;
do { try { int val; Console.Write("Bir sayi giriniz:"); val = int.Parse(Console.ReadLine()); Console.WriteLine(val); flag = true;
} catch(Exception e) { Console.WriteLine("Geersiz bir giris yaptiniz..");
} }while(! flag); }
159 Mert KPRC(mrtkprc@gmail.com) Sayfa 160 / -206- } } Taban sinif ile tremi sinif catch bloklari bir arada bulunabilir. Bu durumda tremi sinif catch blogunun daha yukarida bulundurulmasi zorunludur. nk catch bloklari yukarida aagiya taranmaktadir bu nedenle tersi bir durumun bir anlami olmaz. using System; namespace CSD { class App { public static void Main() { bool flag = false;
do { try { int val; Console.Write("Bir sayi giriniz:"); val = int.Parse(Console.ReadLine()); Console.WriteLine(val); flag = true;
}
catch (FormatException e) // Eer bu catch blou Exception bloundan asaida olsa Compile Time Error! { Console.WriteLine("Sayinin Formati Bozuk..");
} catch(Exception e) { Console.WriteLine("Geersiz bir giris yaptiniz..");
}
}while(! flag); }
} } Catch bloklarini bir finally blogu izleyebilir. Try blogu tek baina bulunamaz. Fakat try- finally bloklari bulunabilir yada try-catch- finally bloklari bulunabilir. *** Finally blogu her zaman sonda bulunmak zorundadir. Finally her zaman alitirilir. Aki try blogunu girdikten sonra Exception oluursa nce catch blogu sonra finally blogu alitirilmaktadir. Exception olumaz ise yine finally blogu alitirilir. 160 Mert KPRC(mrtkprc@gmail.com) Sayfa 161 / -206- Peki catch bloklarnn sonuna finally yerletirmekle , yerletirmemek arasndaki fark nedir ? 1-)Aki try blogunu girdikten sonra goto gibi break gibi, continue gibi return gibi deyimler kullanildiginda da bunlar akiin try blogundan ikmasini yol aacagi iin finally blogu alitirilmaktadir. I try blogunda throw olutugunda Exceptionin i try blogu tarafindan yakalandigini dnelim ite i try blogu iinde finally blogu alitirilir. rnegin: try { //<kaynak tahsis et> } finally { //<kaynai bosalt> } Burada aki di try blogunun catch blogu tarafindan yakalansa bile kaynak boaltilacak. Bir Exception olutugunda tahsisi edilen kaynaklarin kesinlikle boaltilmasi isteniyorsa bu ilem finally yapilmalidir. using System; using System.IO; namespace CSD { class App { public static void Main() { FileStream fs; try { fs = new FileStream(@"C:\", FileMode.Open);
} finally { fs.Close();
} } } }
Bir catch blogu zel olarak parametresiz olabilir. Parametresiz catch bloklari diger catch bloklarinin sonunda fakat finally blogundan nce konulandirilmak zorundadir. rnegin: try { //.. } catch (Exception e) { } catch 161 Mert KPRC(mrtkprc@gmail.com) Sayfa 162 / -206- { } finally { } Parametresiz catch blogu tm Exceptionlari yakalayabilir. Exception parametreli catch blogu ile parametresiz catch blogu arasinda ki fark nedir ? Ite Exception sinif ile throw etme zorunlugu btn dillerde yoktur. rnegin : C++ `da biz int,long gibi trlerle throw edilebilir. C++ da yazdigimiz bir kodu C# `dan agirirken biz oradaki Exceptionlari, Exception parametreli catch blogu ile degil parametresiz catch blogu ile yakalayabiliriz. Anahtar Notlar : C#da programlamayi zorlastirdii gerekesiyle Exception Specification dile sokulmamistir. Halbuki Javada bu zellik zorunlu olarak kullanilmak zorundadir. Javada bir metot iin ir Exception olusabiliyorsa ve bu Exception metotun ierisinde ele alinmamissa, bu Exception metotun disarina firlatilma olasilii varsa metot bildiriminde bu durumun asaidaki gibi bildirilmesi gerekmektedir. public static void Foo() throws MyException { } Bylelikle Java programciyi adeta Exceptionlari ele almaya zorlamaktadir. EXCEPTON SINIFLARININ ANLAMI Bir Exception olutugunda throw ilemini yapan kii Exception yakalayan kiilere bir takim bilgileri iletmek isteyebilir. Bu bilgilere bir nesnenin ierisine kodlanarak iletilmesi yoluna gidebilir. Ite bu nedenle throw eden kii bir nesneyle throw etmekte Exception yakalayan kii de bunu oradan almaktadir. using System; namespace CSD { class App { public static void Main() { Console.WriteLine("Main basladi"); try { Foo(); } catch (ArgumentNullException e) { Console.WriteLine("Arguman null olarak geilmis"); } catch (OverflowException e) { Console.WriteLine("Sayi ok buyuk ya da ok kuuk"); } catch (FormatException e) { Console.WriteLine("Sayinin formati bozuk"); } Console.WriteLine("Main bitti"); } 162 Mert KPRC(mrtkprc@gmail.com) Sayfa 163 / -206- public static void Foo() { Console.WriteLine("Foo basladi"); try { int val; val = int.Parse(Console.ReadLine()); Console.WriteLine(val); //... } finally { Console.WriteLine("finally"); } Console.WriteLine("Foo bitti"); } } } SYSTEM.EXCEPTON SINIFI Taban Exception sinifin en nemli elemanlarindan biri string trden virtual, Message isimli read-only property elemanidir. Bu sanal property elemani .NETin diger Exception siniflarinda override edilmitir. Bylece programci oluan bir Exception, Exception sinif ile yakalayip Mesaji ok biimli olarak yazdirabilir. Exception sinifin yine ReadOnly , StackTrace isimli property elemani Exception oluturdugu durumdaki metot agri durumunu bize vermektedir. Bu StackTrace yazisinda hangi metot hangi metotu agirmisa Exception aamasina gelinmi bilgisi vardir. (4a*)rma s)ras) a-a*)dan yu,ar)ya do*ru ya/d)r)lma,tad)r. 2ani o,ur,en a-a*)dan yu,ar)ya do*ru o,umal)y)/.) .NET SINIF SSTEMNDE OK KARILAILAN BAZI EXCEPTON SINIFLAR .Net sinif sisteminde pek ok Exception sinifi vardir. Bu Exception siniflari bir sinif hiyerarisi oluturmaktadir. Exception sinif hiyerarisinin en nemli dallarindan biri System.Exception isimli siniftir. System.Exception sinif trnden tretilmi nemli siniflar unlardir: * IndexOutOfRangeException C#da bir dizinin sinirlari diina eriilmek istendiginde IndexOutOfRangeException olumaktadir. e.GetType().Name; => Exceptionun turunu al ve ismini geri ver. *FormatException .NET sinif ktphanesinde bir biimde bir yazinin ayritirildigi durumlarda eger yazi eger yazi belirlenen bir formata uymuyorsa siklikla bu Exception firlatilmaktadir. *InvalidCastException => Taban sinif2tan tremi sinifa aagiya dogru dntrme yapilirken dntrme haksiz ise bu Exception olumaktadir. 27.Hafta 1.Gn (03 Aralk 2011) *NullReferenceException => Iinde null degeri bulunan bir referans kullanilirsa bu exception olumaktadir. 163 Mert KPRC(mrtkprc@gmail.com) Sayfa 164 / -206- *IOException => C#da btn dosya ilemlerinde baarisizlik durumunda bu exception firlatilmaktadir. DEGKENLERE LK DEGER VERLMES VE EXCEPTON Derleyici her zaman metotlarin ierisinde exception oluabilecegini dikkate almaktadir. Bu durumda bazi ilk deger verme hatalari oluabilmektedir. rnegin : using System;
namespace CSD { class App { public static void Main() { int a;
} public static int Foo() { return 10; } } } Burada derleyicinin Foo metotunun ierisinde exception oluursa anin deger almayabilecegini grebilmektedir. Bu nedenle bu durum error oluturmaktadir fakat using System;
namespace CSD { class App { public static void Main() { int a; a = Foo(); Console.WriteLine(a);
} public static int Foo() { return 10; } } } Yukaridaki kodda eger exception oluursa zaten aki aagidaki satira gemeyecektir. ARAYZLER(INTERFACE) 164 Mert KPRC(mrtkprc@gmail.com) Sayfa 165 / -206- Arayzler C#da ok tretmenin olmamasinin verdigi bazi dezavantajlari gidermek amaciyla dile sokulmutur. Arayzler adeta btn elemanlari abstract olan ve hi veri elemanina sahip olmayan bir abstract siniflara benzetilebilinir. interface <isim> {
}
rnegin: interface IX { void Foo(); int Bar(int a, int b); } Arayz elemanlari default public durumdadir. Ayrica oraya eriim belirleyici anahtar szcklerde yazilmaz. Arayz elemanlarina virtual , abstract gibi anahtar szckler de getirilemez. Arayz elemanlari gvdeye sahip olamaz. Bildirim ; (noktali virgl ) ile kapatilmak zorundadir. Arayzler veri elemani ieremez. Arayz isimleri geleneksel olarak I (BYK I ) harfiyle balatilir. Bu onlarin tespit edilmesini kolaylatirmaktadir. Bir snf ya da yapnn taban listesinde arayz varsa bu durum iin o snf ya da yapnn o arayz desteklemesi(implemente) etmesi denmektedir. Bu bir tretme ilemi degildir. Daha farkli bir ilemdir. Bu nedenle tretme terimi yerine implementasyon (destekleme) olarak ifade edilmektedir. Bir sinif yada yapi bir arayz destekliyorsa o arayzn tm elemanlari o sinif ya da yapinin ierisinde bildirilmek zorundadir. Bir tanesinde bile bildirilmezse error oluur. Bildirim sirasinda metotlar ayni imza ve geri dn degeriyle bulundurulmak zorundadir. interface IX { void Foo(); int Bar(int a, int b); } class Sample : IX { public void Foo() {
} public int Bar(int a, int b) {
} } Bir arayzn desteklenmesi(implemente edilmesi) interface IX { void Foo(); int Bar(int a, int b);
} class Sample : IX { public void Foo() 165 Mert KPRC(mrtkprc@gmail.com) Sayfa 166 / -206- {
} public int Bar(int a, int b) { return 0; } }
Bir sinif tek bir siniftan tretilebilinir fakat birden fazla arayz destekleyebilir. Bu durumda sinifin taban listesinde nce taban sinif isminin sonra arayz isminin belirtilmesi zorunludur. Yani listede taban sinif ismi nde olmak zorundadir fakat arayz isimleri herhangi bir sirada olabilir. Yine taban sinif belirtilmemise object sinifi oldugu anlailmaktadir. Bir sinif yada bir yapi birden fazla arayz destekliyorsa tm arayz elemanlarini bulundurmak zorundadir. rnegin: using System;
namespace CSD { class App { public static void Main() {
} } interface IX { void Foo();
} interface IY { int Bar(int a, int b);
} class A {
} class Sample :A, IX, IY { public void Foo() {
} public int Bar(int a, int b) { return 0; } } } 166 Mert KPRC(mrtkprc@gmail.com) Sayfa 167 / -206- Javada arayuz desteklemesi implements anahtar szcuu ile yapilmaktadir. class B extends A implements IX { } C#da yapilar tretmeye kapalidir fakat arayz desteklemesine aiktir. Bir yapi bir siniftan tretilemez fakat bir yada birden fazla arayz destekleyebilir. Arayz trnden referans bildirilebilir fakat new operatryle nesne yaratilamaz.
IX a; // geerli a = new IX(); // ERRROORRRRRR! Bir arayz referansina, o arayz destekleyen bir sinif trnden referans ya da bir yapi degikeni dogrudan atanabilir. Yani adeta tremi sinif taban sinifmi gibi bir dntrme sz konusudur. Arayzler ok biimli etkiye sahiptir. Arayz metot bildiriminde virtual ya da abstract anahtar szcg kullanilmaz bunlarin destekleyen sinif yada yapida da override anahtar szcg kullanilmaz fakat ok biimli etki oluur. Bir arayz referansiyla bir arayz metotu agrildiginda arayzn dinamik trne ilikin arayzn ilgili metotu agrilmaktadir. using System;
namespace CSD { class App { public static void Main() { IX ix; Sample s = new Sample(); ix = s; ix.Foo(); } } interface IX { void Foo(); } class Sample : IX { public void Foo() { Console.WriteLine("Sample.Foo"); }
} } Yapilar arayzler sayesinde ok biimli kullanima ailmaktadir. using System;
namespace CSD { class App 167 Mert KPRC(mrtkprc@gmail.com) Sayfa 168 / -206- { public static void Main() { Sample s = new Sample(); Test t = new Test(); DoSomething(s); DoSomething(t);
} public static void DoSomething(IX ix) { ix.Foo();
} } interface IX { void Foo();
} class Sample : IX { public void Foo() { Console.WriteLine("Sample.Foo"); }
} struct Test : IX { public void Foo() { Console.WriteLine("Test.Foo"); }
} } ARAYZLERE NEDEN GEREKSNM DUYULMAKTADIR. 1-)Arayzler bir eit oklu tretme etkisi yarattiginda dolayi oklu tretmenin bazi avantajlarini dile sokmak iin dnlmtr. Bir sinif yada yapi birden fazla arayz destekleyebilir bylece biz o sinif yada yapiyi farkli amalarla ok biimli olarak kullanabiliriz. 2-)Arayzler yapilari da ok biimli kullanima amaktadir. 3-)Arayzler adeta bir szleme grevini de grmektedir. Yani biz bir sinif yada yapinin bir arayz destekledigini grdgmzde kesinlikle o sinif yada yapinin o arayz metotlarini ierdigini anlariz. ARAYZLERLE LGL DGER NEML ZELLKLER Taban sinif bir arayz destekliyorsa tremi sinifin da o arayz destekler. Bylece biz tremi sinif trnden referansi da taban sinifin destekledigi arayz referansina atayabiliriz. Daha sonra o arayz referansiyla arayz metotunu agirdigimizda taban sinifa ilikin arayz metotu agirilir. using System;
namespace CSD 168 Mert KPRC(mrtkprc@gmail.com) Sayfa 169 / -206- { class App { public static void Main() { IX ix = new B(); ix.Foo(); } } interface IX { void Foo(); } class A : IX { public void Foo() { Console.WriteLine("A.Foo"); } } class B : A {
} } Arayzlerde tretilebilir (burada destekleme degil tretme terimi kullanilmaktadir.) Tremi arayzn , taban arayzn elemanlarini iermi farz edilir. Yani bir sinif yada yapi tremi arayz destekliyorsa yalnizca tremi arayzn degil taban arayzn elemanlarini da bulundurmak zorundayiz. Sinif yada yapinin taban listesinde hem tremi arayzn hem de taban arayzn belirtilmesi error oluturmaz. Fakat bu durumunda hi bir zel anlami yoktur. rnegin: using System;
namespace CSD { class App { public static void Main() {
} } interface IX { void Foo(); } interface IY : IX { void Bar(int a); } class A : IY,IX // Dikkat IX olmasa da olur. unku IY, IX den turetismistir. { public void Foo() { 169 Mert KPRC(mrtkprc@gmail.com) Sayfa 170 / -206- Console.WriteLine("A.Foo"); } public void Bar(int a) {
} } } Burada taban listede yalnizca tremi arayz belirtilebilinir. Okunabilirligi arttirmak iin bazen tercih sebebidir. phesiz tremi arayz destekleyen bir sinif referansi yada yapi degikeni hem taban arayze hem de tremi arayze atanabilmektedir. Ayni zamanda tremi arayz referansi taban arayz referansina da atanabilir. C#da ayni zamanda tm arayzlerin de object sinifindan tretilmi oldugunu varsayilmaktadir. Dolayisiyla biz bir arayz referansini dogrudan object referansina atayabiliriz. Taban sinifin destekledigi arayz tremi sinifin taban listesinde belirtilerek yeniden desteklenebilir. Buna arayz tremi sinifta yeniden desteklenmesi(interface re- implementation) denilir. rnegin : using System;
namespace CSD { class App { public static void Main() {
} } interface IX { void Foo(); } class A : IX { public void Foo() { //... } }
class B :A,IX { public void Foo() { Console.WriteLine("A.Foo"); } } } YENIDEN DESTEkLEME - 2 using System;
namespace CSD 170 Mert KPRC(mrtkprc@gmail.com) Sayfa 171 / -206- { class App { public static void Main() { IX ix = new B(); ix.Foo(); // B.Foo ix = new A(); ix.Foo(); // A.Foo } } interface IX { void Foo(); } class A : IX { public void Foo() { Console.WriteLine("A.Foo"); } }
class B :A,IX { public void Foo() { Console.WriteLine("B.Foo"); } } } Bir arayz metotu sanal metot degildir bu nedenle override edilerek aagiya dogru ok biimlilik devam ettirilemez ancak arayz metotu virtual biimde bildirilebilinir. Bu durumda artik aagida override edilebilir. rnegin: using System;
namespace CSD { class App { public static void Main() { IX ix = new B(); ix.Foo();
} } interface IX { void Foo(); } class A : IX { 171 Mert KPRC(mrtkprc@gmail.com) Sayfa 172 / -206- public void Foo() { Console.WriteLine("A.Foo"); } //...
} class B :A { public void Foo() { Console.WriteLine("B.Foo"); } //...
} } Grldg gibi arayz metotlari da ok biimli etkiye dahil edilebilmektedir. Hatta arayz metotlari abstract olarak da bildirilebilinir. interface IX { void Foo(); } abstract class A : IX { public abstract void Foo(); }
Birden fazla arayzle tamamen ayni isimli ve ayni parametrik yapiya sahip bulunuyor olabilir bu durumda biz bu metotu bir kez yazarak her iki arayznde gereksinimlerini karilayabiliriz. interface IX { void Foo(); } interface IY { void Foo(); } class A : IX { public void Foo() {
} } 27.Hafta 2.Gn (04 Kasm 2011) ARAYZ METOTLARININ AIKCA DESTEKLENMES(EXPLICIT IMPLEMENTAION) 172 Mert KPRC(mrtkprc@gmail.com) Sayfa 173 / -206- Bir arayz metotu normal olarak ya da aika (expilicit) desteklenebilir. Aika destekleme sirasinda eriim belirleyici anahtar szck yazilmaz.(PUBLC DE YAZILAMAZ) Metot ismi arayz ismiyle niteliklendirilmektedir. rnegin : interface IX { void Foo(); } class Sample : IX { void IX.Foo(int a) {
} } Bir arayz metotu aika desteklendigi artik onu aagidan agiramayiz. nk isim aramasi sirasinda gzkmez fakat yukaridan arayz yoluyla agirabiliriz. Sample s = new Sample(); s.Foo(100) // error IX ix = s; ix.Foo(); // geerli Sample.Foo airilir rnek : using System;
namespace CSD { class App { public static void Main() { Sample s = new Sample(); IX ix = s; ix.Foo();
} } interface IX { void Foo(); } class Sample : IX { void IX.Foo() { Console.WriteLine("Explicit Implemantion"); } } } Bir arayz metotu hem normal hem de aika desteklenebilir. Bu durumda aagidan agirmalarda normal desteklenen arayz referansiyla agirmalarda aika desteklenen metot agirilir. using System;
namespace CSD 173 Mert KPRC(mrtkprc@gmail.com) Sayfa 174 / -206- { class App { public static void Main() { Sample s = new Sample(); IX ix = s; s.Foo(); // Normak destekleme ix.Foo();// Aikca destekleme
} } interface IX { void Foo(); } class Sample : IX {
public void Foo() { Console.WriteLine("Normal Implemantion"); } void IX.Foo() { Console.WriteLine("Explicit Implemantion"); } } } Bazen arayz yoluyla agirilan ve aagidan agirilan arayz metotlarinin farkli olmasi istenebilir. Bu tr durumlarda aika destekleme kullanilir. Farkli arayzler ayni metotla sahipse bu sayede biz onlari da ayirabiliriz. using System;
namespace CSD { class App { public static void Main() { Sample s = new Sample(); IX ix = s; IY iy = s;
} } ARAYZ ELEMANI OLARAK PROPERTYLER Arayzler; property elemanlara da sahip olabilir. Bu durumda get ve set blmlerinin ii yazilmaz. Get ve set anahtar szckler noktali virgl ile kapatilir. interface IX { void Foo(); int Count { get; set; } } rnek : using System;
namespace CSD { class App { public static void Main() { Sample s = new Sample(10); Console.WriteLine(s.Count); s.Count = 200; Console.WriteLine(s.Count); } } interface IX { void Foo(); int Count { get; set; } }
class Sample : IX { 175 Mert KPRC(mrtkprc@gmail.com) Sayfa 176 / -206- private int m_count;
public Sample(int count) { m_count = count;
} public void Foo() {
} public int Count { get { return m_count; } set { m_count = value; } } } } ARAYZLERLE LGL DNTRMELER 1-) Animsanacagi gibi siniflardan yada yapilardan o sinifin yada yapinin destekledigi arayz trlerine dogrudan dntrme vardir. (Sinifin taban sinifi bir arayz destekleyebiliyorsa tremi sinif bu arayz yeniden desteklemiyor olsa bile taban siniftan dolayi destekledigi kabul edilir.) 2-)Tm arayzlerin object sinifindan tretildigi varsayilmaktadir. Bu nedenle biz tm arayz referanslarini dogrudan object referanslarina atayabiliriz. rnegin: Sample s = new Sample(10); IX ix = s; object o; o = ix; Burada o referansin dinamik tr Sampledir. 3-)Bir arayz referansi tr dntrme operatryle herhangi bir sinif trne dntrlmek istendiginde her zaman derleme aamasindan baariyla geirilir. Fakat programin alima zamani sirasinda haklilik kontrol yapilir. Derleyici bu denetimi derleme aamasinda yapamaz nk dntrlmek istenen sinif o arayz desteklemiyor olsa bile yine de yle bir olasilik vardir : Belki o siniftan bir sinif tretilmitir , tremi sinif o arayz destekliyordur ve arayz referansinda tremi sinifin adresi vardir. Bu durumda dntrme hakli olmaktadir. Fakat bir referans tr dntrme operatryle bir yapi trne dntrlmek istendiginde denetim derleme aamasinda yapilir. alima zamanina birakilmaz. nk yapilardan tretilme yapilamamaktadir. 4-)Bir sinif referansi o sinifin desteklemedigi bir arayz trne ; tr dntrme operatryle dntrlebilinir. Bu durumda denetim yine alima zamanina birakilir. nk belki de o sinif referansinin ierisinde o siniftan tretilmi bir sinif nesnesinin adresi vardir ve tremi sinifta bu arayz destekliyor olabilir. 5-)Bir arayz referansi dogrudan onun taban arayz trne atanabilir. 6-)Bir arayz referansi hi tretme ilikisi olamayan baka bir arayz trne tr dntrme operatr yoluyla dntrlmek istenebilir. Bu durumda her zaman 176 Mert KPRC(mrtkprc@gmail.com) Sayfa 177 / -206- derleme aamasinda baariyla geilir ve denetim alima zamanina birakilir. nk belki de dntrmenin kaynagi olan arayz referansi bir sinif nesnesini gsteriyordur o sinif nesnesi de ayni zamanda dntrmenin hedefi olan arayz destekliyor durumdadir. .NET 'DE OK KULLANILAN BAZI ARAYZLER IDisposable Arayz Bu arayzn Dispose isimli tek bir metotu vardir. interface IDisposable { void Dispose(); } Yani bir sinif yada yapi IDisposable arayzn destekliyorsa onun Dispose metotu vardir. .NET ortami iletim sisteminin zerine kurulmu yapay bir ortamdir. Bu ortamda ara kodlar CLR tarafindan gerek makine kodlarina dntrlerek alitirilir. Ara kodlardan oluan kodlara .NET dnyasinda ynetilen(managed) kodlar denilmektedir. Bir .NET kodu alitirildiginda eger bu kod sistemle ilgili bir eyler yapiyorsa eninde sonunda o sistemin bazi servislerini kullanmak zorunda kalmaktadir. rnegin tipik olarak iletim sisteminin ; eitli sistem fonksiyonlarini agirabilmektedir. Ite .NET dnyasinin diinda ki dogal makine koduyla alitirilan kodlara ynetilmeyen (unmanaged ) kod denilmektedir. CLR aki .NET dnyasinin diina iktiginda artik bu kodlari kontrol edemez. Dolayisiyla o kodlarin sistem dzeyinde yaptigi tahsisatlar .NET tarafindan otomatik geri birakilamaz. Bu tr kaynaklari kullanan siniflar kullanim bitince bu kaynaklari nasil boaltacaktir. .NET bunun farkinda olmadigi iin bunu otomatik olarak yapamaz. Bunu sinifi kullanan kiinin yapmasi gerekmektedir. Ite .NETde bir sinif ya da yapi eger ynetilmeyen bir kaynak kullaniyorsa bu sinif yada yapinin IDisposable arayzn desteklemesi tavsiye edilmektedir. Bylece bu sinif yada yapiyi yazan kii boaltim ilemini Dispose metotuyla yapmaktadir. Bu sinif yad a yapiyi kullanan kii de ilem bitince bu Dispose metotunu agirmasi gerekmektedir. Biz bir snf yada yapnn IDisposable arayzn destekleyen bir snf grdgmzde ne anlamalyz.? Bu sinif yada yapinin ynetilmeyen bazi kaynaklarini kullandigini ve bunlari boaltmanin bizim sorumlulugumuzda oldugunu anlamak zorundayiz bunu da biz Dispose metotunu agirarak yapmaliyiz. Peki IDisposable arayzn destekleyen bir sinif yada yapida kullanim bittikten sonra Dispose metotunu agirmazsak ne olur. Aslinda siniflarin biti metotlari (destructre) denilen zel metotlari vardir. Bu metot p toplayici tarafindan nesne yok edilmeden hemen nce agirilmaktadir ve genellikle ynetilmeyen kaynak kullanan programcilar boaltimi Dispose metotuyla yapmanin yani sira bu biti metotlarinda da yapmaktadirlar. Bu nedenle biz Dispose metotunu agirmasak bile en kt olasilikla boaltim p toplayici nesneyi toplarken yapilabilecektir. Yine de Dispose metotunun programci tarafindan agrilmasi tavsiye edilir. nk p toplayici nesneyi ok ge silebilir, bazi kritik durumlarda p toplama ilemi yapilmadan program sonlanabilir. Tabi btn bunlara karin hi bir ey olmayabilir. IDisposable arayznn ok biimli etkisinden nesnenin gerek trn bilmeden boaltim uygulayarak faydalanabiliriz. rnegin : ArrayList ierisinde ; IDisposable arayzn destekleyen heterojen nesneler olsun biz bunlarin dinamik trlerini bilmeden yle boaltim uygulayabiliriz. ArrayList al = new ArrayList(); foreach (IDisposable id in al) { id.Dispose(); } ICloneable Arayz ICloneable arayznn Clone isimli tek bir metotu vardir. 177 Mert KPRC(mrtkprc@gmail.com) Sayfa 178 / -206- interface ICloneable { object Clone(); } Biz bir sinif trnden bir referansi digerine atarsak nesneyi kopyalami olmayiz. Ayni nesneyi gsteren baka bir referans etmi oluruz. Bazen bir nesnenin tamamen iini ayni olan yeni bir kopyasi oluturulmak istenebilir. Aslinda bir nesnenin kopyasindan ikarmak demek yeni bir nesne yaratip o nesnenin statik olmayan veri elemanlarina asil nesnenin degerlerinin aynisini yerletirmek demektir. Fakat bu ilemi diaridan birisi yapamaz. Yapsa yapsa sinifi yazan kii yapar. Ite sinifi yazan kii byle bir metot bulunduracaksa nerilen yntem o sinifin ICloneable arayzn desteklemesi ve Clone metotunun bu ii yapmasidir. Sample s = new Sample(); Sample k; k = (Sample)s.Clone(); Burada k ve s ii ayni olan farkli nesneleri gstermektedir. Klonlama Sg(Shallow) ve Derin(Deep) olmak zere ikiye ayrlr. Sig kopyalamada sinifin referans veri elemani varsa yalnizca ana nesnenin kopyasindan ikarilir. Bylece bu referanslar eleman olan ayni nesneyi gsteriyor durumdadir. Fakat derin kopyalamada yalnizca ana nesnenin degil referans veri elemanlarin gsterdigi nesnelerin de kopyasi ikartilir. Kopyalamanin derin mi , sig mi yapilacagi arayzn destekleyenin istegine birakilmitir. using System;
namespace CSD { class App { public static void Main() { Sample s = new Sample(10, 20); Sample k; k = (Sample)s.Clone(); k.Disp();
} } class Sample : ICloneable { private int m_a; private int m_b;
public Sample() { } public Sample(int a, int b) { m_a = a; m_b = b; } public void Disp() { Console.WriteLine("{0}, {1}",m_a,m_b); } 178 Mert KPRC(mrtkprc@gmail.com) Sayfa 179 / -206- public object Clone() { Sample s = new Sample(); s.m_a = m_a; s.m_b = m_b; return s; }
}
}
rnegin ArrayList sinifi ; sig kopyalama yapmaktadir yani asil nesnenin kopyasindan ikarir fakat tuttugu nesnelerin kopyasindan ikarmaz. Anahtar Notlar : C#da elimizde s ve k biiminde iki referans olsun bu referanslarin ayni nesneyi gsterip gstermediini nasil anlayabiliriz. ? Biz ift esit yada != operatrleriyle bakarsa eer sinifin karsilastirma operatr metotlari varsa bunlar devreye girilir. rnein string sinifinda biz bu operatrleri uygularsak sinifin operatr metotlari bize referanslarin gsterdii yerdeki yazilari karsilastirir. Eer siniflarin byle operatr metotlari yoksa bu durumda gerekten referanslar ierisindeki adresler karsilastirilir. Iste object sinifin statik ReferenceEquals(s,k) metotu her zaman adresleri karsilastirir. 28.Hafta 1.Gn (10 Aralk 2011) DOSYA LEMLER Ierisinde bilgilerin bulundugu ikincil belleklerdeki blgelere dosya(file) denir. Dosyanin isimleri vardir. Dosyalar dizinler(Directory) ierisinde bulunur. Ayni dizin ierisinde ayni isimli birden fazla dosya bulunamaz fakat farkli dizinler ierisinde ayni isimli dosyalar bulunabilir. Bir dosyanin yerini betimleyen yazisal ifadelere yol ifadeleri(path name) denilmektedir. Microsoft sistemlerinde src kavrami vardir ve her srcnn ayri bir kk bulunur. Halbuki Unix/Linux sistemlerinde src kavrami yoktur tek bir kk vardir. Microsoft sistemlerinde dizin geimleri ters bl ile (\) Unix sistemlerinde dz bl (/) dr. Yol ifadeleri mutlak(absoluete) ve greli(relative) olmak zere ikiye ayrilir. Eger yol ifadesinin ilk karakteri ters bl(\) yada dz bl(/) ise buna mutlak yol ifadesi denir. Mutlak yol ifadeleri kk dizinden itibaren zlmektedir. Eger yol ifadelerin ilk karakterleri ters bl(\) yada dz bl(/) degilse bunlara greli yol ifadeleri denmektedir. Greli yol ifadeleri programin alima dizininden itibaren yer belirtir. Her programin bir alima dizini(Current Working Directory) vardir. Programin alima dizinini program aliirken degitirebiliriz. Programin default alima dizini .exe dosyanin bulundugu yerdir. Programin alima dizini .NETde Enviroment sinifinin CurrentDirectory isimli statik property elemaniyla alinip degitirilebilinir. rnegin: Environment.CurrentDirectory=@"C:\temp" Windows ayni zamanda her program iin default bir src de tutmaktadir. Biz yol ifadesinde src belirtiyorsak bu default srcye de degitirmi oluruz belirtmiyorsak bu default src referans alinir. rnegin : 1-) D:\temp\a.dat 2-)\temp\a.dat 179 Mert KPRC(mrtkprc@gmail.com) Sayfa 180 / -206- 3-)temp\a.dat Birinci durumda dizin de belirtildigi iin "a.dat dosyasi D:\temp dizininde aranir. Ikinci durumda aktif src hangisiyse o srcnn temp dizinin altinda aranir. nc durumda ise yol ifadesi greli olarak belirtilmitir. Yani hangi program aliiyorsa o dizinde aranmaya balanir. Aktif src programin alima dizinini bulundugu dizindir. Biz onu degitirirsek aktif srcye de degitirmi oluruz. System.Enviroment Snf Enviroment sinifi static bir siniftir ve alimakta olan programla ilgili bazi ayarlari yapmakta kullanilmaktadir. rnegin : CurrentDirectory property elemani programin alitigi dizini degitirmektedir. Enviroment sinifinin Exit isimli metotu programi sonlandirmak iin kullanilmaktadir. Metot parametre olarak iki kodunu alir. Bu kod iletim sistemine iletilmektedir. Bu kodun ka oldugunun bir nemi yoktur. Fakat geleneksel olarak baarili sonlamalar iin 0(sifir), baarisiz sonlamalar iin sifir(0) dii deger kullanilir. rnegin: if(!Test()) Enviroment.Exit(1); Exit metotu nerede agirilirsa agirilirsin program sonlanir. Enviroment sinifinin 9et)ogical+riers() isimli statik metotu sistemdeki srclerin kk ifadelerini bize verir. foreach (string drive in Environment.GetLogicalDrives()) { Console.WriteLine(drive); } .NETin dosya ilemlerine ilikin siniflarin hepsi System.IO isimli namespacede bulunur. Bunlari ogu zaten mscorlib.dll ierisindedir. FLE SINFI File sinifi dosya zerinde btnsel ilemler yapmak iin silmek gibi kopyalamak gibi taimak gibi kullanilmaktadir. File statik bir siniftir. *Exists; isimli statik metot bir dosyanin olup olmadigini belirlemek iin kullanilmaktadir. public static bool Exists(string path) *Windows dosyalar iin zaman tutmaktadir. Bunlar yaratim zamani,son eriim zamani ve son yazma zamanidir. Sinifin 9et:reationTime, 9et)astAccesTime ve 9et)ast;riteTime metotlari bu bilgileri almak iin kullanilmitir. *Move; metotu dosyayi taimak iin kullanilir. *Copy; metotlari kopyalamak iin kullanilir. Anahtar Notlar: Dosya metotlariyla urasirken islemlerimizi try-catch bloklariyla yapmamizda fayda vardir. unku bunlar ilgili dosya bulunamadiinda Exception firlatir. *Delete; isimli metot dosya silmekte kullanilir fakat silinecek dosya yok ise Exception olumaz. *File sinifinin /eadAllText metotu bir text dosyanin ierisindeki tm dosyayi okur ve bize bir string olarak verir ;riteAllText metotu ise bizden bir string alir onu dosyaya yazar. Eger zaten dosya var ise sifirlar ve yazar. * Ayrica File Sinifinin dosyadaki tm bilgileri bize byte olarak veren /eadAll3!tes metotu ile tm bilgileri byte dizisi biiminde oluturduktan sonra dosyaya 180 Mert KPRC(mrtkprc@gmail.com) Sayfa 181 / -206- yazan ;riteAll3!tes metotuda vardir. Anahtar Notlar: Dosyanin iindeki bilgiler ne olursa olsun dosya isletim sistemi iin bytelardan olusan bir topluluktur. Dosyalarin uzantilari ierii hakkinda kullaniciya bilgi vermek iin dusunulmustur. rnein bir .exe dosyanin uzantisi .xls yaparsak bunun excelin tarafindan ailacai anlamina gelmez. Benzer biimde bir .xls dosyanin uzantisini .exe yaparsak ; dosyayi notepadde atiimiz da tuhaf karakterler gruruz. Fakat dosyayi yine excelde aabiliriz. Anahtar Notlar: Text dosya denildiinde ierisinde yalnizca yazisal bilgilerin bulunduu dosyalar anlasilmaktadir. Bir .doc dosyasi bir text dosya deildir. Ierisinde yalnizca yazi olmayan dosyalara binary dosyalar denilir. Bir text dosyanin iinde sadece yazi vardir yazilarda deisik tablolar kullanilarak olusturulmus olabilir. rnein : ASCII tablosu, EBCDIC, UNICODE sistemiyle kodlanabilir. Bir dosyanin iinde ASCII ile kodlamis bir yazi olsun diyelim. Biz onu sanki UNICODE kodlanmis gibi gruntulemeye alisirsak yanlis karakterler gruruz. zetle bu konuya Text Encoding denilmektedir. Biz bir text dosyasi verildiinde onun Encoding bilmediimiz zaman dosyayi anlamlandiramayiz. C# da ki char turu ve string sinif her zaman Unicode ile karakterlere tutmaktadir. FileInfo SINIFI FileInfo sinifi belli bir dosyanin bilgilerini elde etmekte kullanilir. Aslinda bu sinifla elde edilen bilgilerin bazilari zaten File sinifiyla da elde edilebilir. FileInfo statik bir sinif degildir. Biz nce hangi dosyanin bilgisini alacagimizi sinifin balangi metotuyla veririz. Sonra sinifin statik olamayan metotlariyla bilgileri aliriz. Sinifin pek ok statik olmayan elemani bize degerli bilgileri verir. rnegin : Sinifin Length isimli property elemani dosyanin uzunlugunu bize verir. Directory SINIFI Directory sinifi ; File sinifin dizin zerinde ilem yapan versiyonudur. Statik bir siniftir. *Delete; metotu dizini silmek iin *Move; metotu taimak iin kullanilir. *Sinifin GetFiles isimli statik metotu bir dizin ierisindeki dosyalari elde etmek iin GetDirectory isimli metotlari dizin ierisindeki dizinleri etmek iin kullanilir. DirectoryInfo Snf Bu sinif da adeta FileInfo sinifin dizinin zerine ilem yapan versiyonu gibidir. Path Snf Bir yol zerinde yazisal ilem yapan genel bir siniftir. Sinifin bu ilemi yapabilmesi iin yol ifadesi ile belirtilen grenin bulunuyor olmasi gerekmez. *Sinifin GetFileName isimli metotu dosyanin bize isim ve uzantisini bize verir. *Path sinifinin GetExtension isimli metotu dosyanin uzantisini bize verir. *GetFileNameWithoutExtension isimli metotu yol ifadesinin ismini uzanti olmadan bize verir. rnek : foreach (string file in Directory.GetFiles(@"c:\windows")) Console.WriteLine(Path.GetFileName(file)); DOSYA ZERDNE STREAM LEMLER Yukaridaki siniflar yzeysel ve kaba ilemler yapar halbuki bir dosyayi aip ierisinden 181 Mert KPRC(mrtkprc@gmail.com) Sayfa 182 / -206- bir eyler okuyup bazi eyleri degitirmek gibi ayrintili ilemler yapmak isteyebiliriz. Bunlar iin Stream siniflari kullanilmaktadir. Anahtar Notlar: Asai seviyeli dosya islemleri ile biz kayitlar uzerinde islemler yapmaya alisirsak muhtemelen ok zorlaniriz ve programimizin performansi duser. unku ok miktarda bilgiyi diskte salamak ve belirli kosullari salayanlari ekme islemi sanildii kadar kolay bir islem deildir. Bu ayri bir uzmanlik alanidir ve bu islemleri yapan zel yazilimlar vardir. Suphesiz bu yazilimlarda aslinda asai seviyeli dosya islemleri yapmaktadir. Bu tur yazilimlara veri tabani ynetim sistemleri (Database Management System) denir. Genellikle ticari uygulamalarda bir takim bilgileri saklanip geri alinacaksa bu yazilimlardan faydalanilmaktadir. Bunlari en unluleri Oracle firmasinin Oracle yazilimi, IBM firmasini DB2 yazilimi, Microsoft firmasinin SQL Server, Open Source olarak MySQL (<racle para!5 #ast5rd5 ald5) gmulu sistemler iin SQLitedir. VTYS `nIn sagladigi tipik faydalari unlardir: 1-)Bize aagi seviyeli ilemlerle ugratirmazlar.Bir karakutu gibi kendi ierisinde ilemleri yaparlar. 2-)SQL denilen yksek seviyeli bir sorgulama dili kullanilir. 3-)Client-Server tarzi aliirlar ve uzak baglantilara izin verirler. 4-)Gvenli bir eriim sunarlar. 5-)ok fazla kayitlarin bulunmasi durumunda bu fazlaligi ynetebilirler. 28.Hafta 2.Gn (11 Kasm 2011) DOSYA ZERNDE STREAM SINFI C# `da dosya gibi ilem gren tm olgular Stream sinifi ile temsil edilmitir. Stream sinifi abstract bir siniftir bu siniftan eitli siniflar tretilmitir. S567AM 8ileStream MemoryStream .et'or,Stream Disk ilemleri FileStream ile temsil edilmitir. MemoryStream sinifi ise bellekteki bir blgeyi dosya gibi ele almaktadir. NetworkStream sinifi ise network ilemlerini dosya gibi bize gstermektedir. Bir dosya ile almadan nce dosyay amak gerekir iyi de amak ne demek? Dosyanin ailmasi sirasinda iletim sistemi dosya ile ilgili bir takim ilemler yapmaktadir. Dosya ilemi bittikten sonra dosyayi kapatmak gerekir. FileStream trnden bir nesne yaratildiginda zaten sinifin balangi metotlari dosyayi amaktadir. FileStream sinifinin pek ok balangi metotu vardir. Fakat en ok kullanilani aagidaki metottur. FileStream SINIFI public FileStream(string path, FileMode mode,FileAccess access) Metotun birinci parametresi ailacak dosyanin yol ifadesini belirtir. Metotun ikinci parametresi dosya ai modunu belirtir. Bu parametre FileMode isimli bir enum trndendir. Bu enum trnn elemanlari ve anlamlari yledir. FileMode Enum'un elemanlarnn anlamlar 182 Mert KPRC(mrtkprc@gmail.com) Sayfa 183 / -206- Open : Bu modda biz olan bir dosyayi aabiliriz. Eger dosya yok ise Exception oluur. Create : Bu modda dosya yok ise yaratilip ailir. Eger dosya var ise dosyanin ierigi silinip ailir. OpenOrCreate : Bu modda dosya varsa olan dosya ailir(ii boaltilmaz) yoksa yeniden yaratilir. CreateNew : Bu modda dosya yoksa yaratilir ve ailir. Eger dosya var ise Exception firlatilir. Truncate : Bu modda olan dosya sifirlanarak ailir eger dosya yok ise Exception firlatilir. Append : Dosya var ise olan dosya ailir eger dosya yok ise yaratilir ve ailir. Fakat dosyaya yapilan her yazma sona ekleme anlamindadir. Dosyanin herhangi bir yerinden okuma yapilabilir. Metotun son parametresi FileAcces isimli bir enumdur. Bu parametre dosyaya hangi ilemleri yapabilecegimizi belirtir. Bu enum trnn Read, Write ve ReadWrite isimli elemanlari vardir. Ailmi bir dosya FileStream Sinifin , Stream Sinifindan gelen Close(); metotu ile kapatilmalidir. Ilemlerin try-catch bloklari ierisinde yapilmasi ve dosyanin finally blogunda kapatilmasi gerekir. Bu durumda tipik olarak bir dosyanin ailma kalibi yledir. using System; using System.IO; namespace CSD { class App { public static void Main() { FileStream fs = null;
183 Mert KPRC(mrtkprc@gmail.com) Sayfa 184 / -206- Dosyaya okuma ve yazmak yapmak iin Stream Sinifinin abstract Read ve Write Metotlari kullanilmaktadir. Read ve Write metotlari Stream sinifindan tretilmi olan btn siniflarda override edilmitir. Read metotu yledir. public override int Read(byte[] array,int offset, int count) Write metotuda yledir. public override void Write (byte[] array,int offset, int count) Dosya bytelardan oluan bir topluluktur. Dosyada her bir bytein bir offset numarasi vardir. Ilk byte sifir olmak zere bir offset numarasi vardir. Iletim sistemi ailmi olan her dosya iin ilemlerin yapilacagi aktif noktayi belirten yani bir imle grevi gren dosya gstericisi denilen FilePointer bir deger tutar. Dosya aildiginda dosya gstericisi 0.(sifirinci) offsettir. Okuma ve yazma metotlari her zaman dosya gstericisinin gsterdigi yerden itibaren ilemleri yaparlar. Dosya gstericisi okunan ve yazilan miktar kadar otomatik ilerler. Dosya gstericisinin dosyanin son byteindan sonraki byte gstermesi durumuna EOF(End of File) durumu denir. EOF durumundan okuma yapilamaz. Fakat yazma yapilabilir. Yazma ekleme anlamina gelmektedir. Read metotunun birinci parametresi okunan bilgilerin yerletirilecegi byte dizinin referansini belirtir. Bu dizinin programci tarafindan yaratilmi olmasi gerekir. Ikinci parametre bu dizide bir index belirtmektedir. Okunan bilgilerin dizinin neresinden itibaren diziye yerletirilecegini gsterir. Son parametre ka byte okunacagini belirtir. Read metotu okuyabildigi byte sayisiyla geri dner. Talep edilen daha az byte okunabilir. Hatta dosya gstericisi EOF durumundaysa hi okumada yapilamayabilir. Bu durumda Read metotu sifir ile geri dner. Bu durum bir exception gerekesi degildir. Exception okumayi ya da yazmayi engelleyen ciddi ve aagi seviyeli IO problemleri varsa oluur. Write ilemi de benzerdir. Metottaki parametre yazilacak bilgilerin bulundugu diziyi belirtmektedir. Yani Write metotunda programci byte dizisini kendisi doldurur ve oradakilerini dosyaya aktarir. Ancak geri dn degeri void trdendir. Yani bu metot talep edilen her eyi normal olarak yazar. BitConverter SINIFI FileStream sinifi her eyi byte olarak yazar ve byte olarak okur. Bizim istedigimiz bir tr dosyaya yazip okuyabilmemiz iin onun byte dizisine dntrp geri almamiz gerekir. Ite BitConverter sinifi temel trleri byte dizisine dntrp byte dizisini de temel trlere dntrmektedir. BitConverter sinifinin bir grup farkli parametrik yapilara ilikin GetBytes metotu vardir. Bu GetBytes metotlari bizden dntrlecek bilgiyi alir. Onu bytelarina ayritirir. Bir byte dizisi yaratarak onu diziye yerletirir. BitConverter Sinifi statik bir siniftir dolayisiyla tm elemanlari statiktir. BitConverter Sinifinin ters ilemi yapan bir grup ToXxx metotu vardir. Burada Xxx dntrlecek tr belirtmektedir. ToInt32, ToInt16 gibi. Bunlara parametre olarak byte dizisini alirlar ve onu Xxx trne dntrerek geri verirler., using System; using System.IO; namespace CSD { class App { public static void Main() { 184 Mert KPRC(mrtkprc@gmail.com) Sayfa 185 / -206- FileStream fs = null; byte[] buf = new byte[4]; int val;
try { fs = new FileStream("test.dat", FileMode.Open,FileAccess.Read); for (int i = 0; i < 100; i++) { fs.Read(buf, 0, 4); val = BitConverter.ToInt32(buf, 0); Console.Write("{0} ",val);
} } } YAZILARIN BYTE DZSNE DNTRLMES VE GER ALINMASI BitConverter Sinifi ile biz ancak sayilari byte dizisine dntrp alabiliriz. Yazilari alamayiz. Yazilar degiik biimlerde kodlanabilirler. rnegin yazinin her bir karakteri ASCII tablosuna gre kodlanabilir. 2 byte ile UNICODE ile kodlanabilir yada UTF-8 gibi bir kodlama olabilir. Bizim bir yaziyi hangi kodlama biimine gre yazacagimizi bilmemiz gerekir. Bunun iin System.Text isim alani ierisindeki Encoding sinif kullanilmaldir. Encoding sinifindan eitli siniflar tretilmitir. 7ncodin( ASC997ncodin( :58;7ncodin( :nicode7ncodin( Tm Encoding siniflarinin, Encoding sinifindan gelen GetBytes, GetString metotlari vardir. Dntrme bunlarla yapilmaktadir. rnegin biz bir yaziyi ASCII kodlamasi ile byte dizisine dntrmek isteyelim. string s = "Ankara"; byte[] buf;
ASCIIEncoding ae = new ASCIIEncoding(); buf = ae.GetBytes(s); Ters dnmde benzer biimde yapilabilir. string result; 185 Mert KPRC(mrtkprc@gmail.com) Sayfa 186 / -206- result = ae.GetString(buf);
Encoding isimli taban abstract sinifin statik ASCII, UTF8,UNICODE gibi property elemanlari Get Blmnde bu trden nesneler yaratip bize vermektedir. Bylece yukaridaki ilemler aslinda yle de kolaylatirilabilinir. string s = "Ankara"; byte[] buf; string result;
buf = Encoding.ASCII.GetBytes(s); result = Encoding.ASCII.GetBytes(buf); Console.WriteLine(result);
DOSYA GSTERCSNN KONUMLANDIRILMASI VE Seek METOTU FileStream sinifinin , Stream sinifindan gelen Seek isimli metotu dosya gstericisine belli bir offsete konumlandirmakta kullanilmaktadir. public override long Seek(long offset, SeekOrigin origin) Metotun; 1. parametresi; konumlandirilmasi istenen yeri gsterilmektedir. 2. parametresi; SeekOrigin isimli bir enumdur ve konumlandirilma ileminin nereden itibaren yapilacagini gsterir. SeekOrigin Enum'un elemanlarn anlamlar: Begin : Konumlandirmanin batan itibaren yapilacagi anlamina gelmektedir. Bu durumda birinci parametre 0 yada sifirdan byk olmalidir. Current : Bu durumda konumlanma dosya gstericisinin bulundugu yerden itibaren yapilmasini saglar. Negatif geri , pozitif ileri anlaminda kullanilmaktadir. fs.See6(=1>See6<rigin.:$rrent); End : End konumlandirmanin EOF dan itibaren yapilacagini belirtir. Bu durumda birinci parametre kk eit sifir olmak zorundadir. Dosya gstericisini EOF durumuna ekmek iin u ilem uygulanir. fs. See6(0>See6<rigin.End); Dosya gstericisini konumlandirmak iin ayrica Position isimli long trden bir Propertyde kullanilmaktadir. Bu Propertynin set blmnde konumlandirma yapilmaktadir. rnegin : fs.?osition @ 100; BinaryReader ve BinaryWriter Snflar FileStream sinifi alimak zordur. Her eyi byte dizisine dntrp almak gerekir. Halbu ki Stream sinifinin sanal Read ve Write metotlarina kullanarak okuma ve yazma ilemlerini kullanan fakat byte dizisi dntrmelerini kendi iinde uygulayan siniflar vardir. BinaryWriter ve BinaryReader siniflari bizden bir Stream nesnesi alirlar. Byte dizisine dntrmeyi kendileri yaparak Stream sinifin Read ve Write metotlariyla ilemleri gerekletirirler. BinaryWriter Sinifini Stream parametreli balangi metotuyla 186 Mert KPRC(mrtkprc@gmail.com) Sayfa 187 / -206- nesne yaratilabilinir. Aslinda bu siniflarinda Close metotlari vardir. Siniflarin Close metotlari zaten aldiklari Stream nesnesini de kapatirlar. Bu durumda tipik bir BinaryWriter kullanimi yle olabilir. using System; using System.IO; using System.Text;
namespace CSD { class App { public static void Main() { FileStream fs; BinaryWriter bw = null;
try { fs = new FileStream("test.dat", FileMode.Create,FileAccess.Write); bw = new BinaryWriter(fs);
} } } } BinaryWriter sinifinin bir grup her trden parametre alan Write Metotu vardir. Bu Write Metotlari kendi ierisinde degeri byte dizisine dntrp yazdirmaktadir. using System; using System.IO; using System.Text;
namespace CSD { class App { public static void Main() { FileStream fs; BinaryWriter bw = null; 187 Mert KPRC(mrtkprc@gmail.com) Sayfa 188 / -206-
try { fs = new FileStream("test.dat", FileMode.Open,FileAccess.Write); bw = new BinaryWriter(fs);
} } } } 29.Hafta 1.Gn (17 Aralk 2011) BinaryReader sinifinin da bir grup Readxxxx metotu vardir. Bu metot en byte trnden bilgiyi okuyarak xxx trne dntrmektedir. STREAMREADER VE STREAMWRITER SINIFLARI StreamReader ve StreamWriter siniflari; dosyaya bilgileri yazisal olarak yazar ve okur. Yani rnegin BinaryReader ile Stream arasindaki fark ; BinaryWriter sinifinin int bir degeri bytelara dntrerek yazdirmasi , StreamWriter sinifinin ise yaziya dntrerek yazdirmasi. StreamWriter sinifi yine bir Stream alir. Bu Streamin Write metotunu kullanarak yazdirmayi yapar. StreamReader siniflari ve StreamWriter siniflari bizden bir Stream nesnesinin yani sira birde Encoding nesnesi istemektedir. Eger Encoding belirtilmezse default UTF-8 kodlamasi geerlidir. Anahtar Notlar : UTF-8 kodlamasi ok yaygin kullanilmaktadir. Bu kodlama biimi UNICODEin sikistirilmasi ile elde edilmektedir. Bu kodlamada nce karakterler UNICODE deerini dnusturulur. Sonra ilk 128 karakter (Standard ASCII karakterleri) bir byte ile dier iki veya daha fazla byte ile ifade edilir. Zaten C# derleyici UTF-8 formatinda istemektedir. Duz ASCII bir metin UTF-8 ile uyumludur. StreamReader sinifinin ReadLine isimli metotu dosyadan bir satir okur. Eger dosyanin sonuna gelinmise null referansla gelinmemise okunan satirla geri dner. 188 Mert KPRC(mrtkprc@gmail.com) Sayfa 189 / -206- StreamReader sinifinin diger bir nemli metotuda ReadToEnd Metotudur. Bu metot bir dosyayi sonuna kadar text olarak okur. BinaryReader,BinaryWriter ve StreamReader ve StreamWriter siniflari tamponlu bir mekanizma ile alimaktadir. Bilgiler nce bir tampona aktarilirlar oradan okunur veya yazilirlar. rnegin biz BinaryWriter sinifi ile bir bilgiyi yazdirmak istedigimizde yazdirilacak eyler nce biriktirilir sonra hedefe yazdirilir. Biz bunlari hemen yazdirilmasini istiyorsak bu siniflarin Flush() isimli metotlarini kullanmaktayiz. is OPERATR is operatr iki operandli araek bir operatrdr. Operatrn sol tarafindaki operand bir sinif trnden referans yada bir yapi degikeni olmak zorundadir. Sag tarafindaki operand bir sinif ismi yada yapi ismi olmak zorundadir. Bu operatr bool bir deger retir eger soldaki operandin dinamik tr sagdaki tr kapsiyorsa true kapsamiyorsa false degeri retmektedir.
object o = "Ankara"; if(o is string) //.... A<- B (B, Adan tretilmitir) object o = new B(); if(o is A) //....
using System; using System.IO; using System.Collections;
namespace CSD { class App { public static void Main() { ArrayList al = new ArrayList(); al.Add(10); al.Add(20.3); al.Add("ali"); al.Add(20.3); al.Add("veli"); al.Add('x'); al.Add("selami");
foreach (object o in al) { if (o is string) { string s = (string) o; Console.WriteLine(s);
}
} 189 Mert KPRC(mrtkprc@gmail.com) Sayfa 190 / -206-
} } } as OPERATR as operatr de kullanim bakimindan is operatrne ok benzemektedir. Iki operandli ara ek bir operatrdr. Operatrn solunda ki operand bir sinif referansi yada yapi degikeni sagindaki operand bir sinif ismi olmak zorundadir. Fakat as operatr sag taraftaki tr trnden bir referans degeri retir. Bu operatr eger sol taraftaki referansin dinamik tr sag taraftaki tr ieriyorsa sol taraftaki referansi sag taraftaki tre dntrrek o trden bir referans verir. Degilse null referans verir.
object o = "ankara"; string s; s = o as string; if(s!=null) //.... Burada yapilmak istenen ey tamamen e degerdir. object o = "ankara"; string s; if (o is string) s = (string) o;
using DEYM Animsanacagi gibi ynetilmeyen kaynak kullanan IDisposable arayzn desteklemekteydi. Byle sinif ve yapilari kullanirken iimiz bittiginde Dispose metotunu kullanmaktayiz. using (<ifade ya ilk deyimli bildirim>) using parantezinin ierisinde ki ifade yada bildirilen degikenin tr IDisposable arayzn desteklemek zorundadir. Bylece aki using blogunu girdikten sonra nasil ikarsa iksin parantez iersindeki ifade iin Dispose metotu agirilir. Yani: using System; using System.Collections;
namespace CSD { class App { public static void Main() { using (T a = new T()) {
} "" 7stte6i ile altta6i a!n5d5r.
T a = new T();
try 190 Mert KPRC(mrtkprc@gmail.com) Sayfa 191 / -206- {
} finally { a.Dispose(); }
} } }
using Deyiminin Otomatik Dispose metotunu agirmasi diinda bir ilevi yoktur. FileStream sinifin Dispose metotu, Close metotuyla ayni ilemi yapmaktadir. Bu durumda aki bu bloktan nasil ikarsa iksin dosya kapatilacaktir.... using parantezi ierisinden ayni trden birden fazla degiken bildirimi yapilabilir. rnein: using(T a = new T(),b = new T(), c = new T()) { } using ( T a = new T()) { using(T b = new T()) { using (T c = new T()) { } } } BASE ANAHTAR SZCG Base anahtar szcg tek baina kullanilmaz kesinlikle nokta operatrn de olmalidir. Bu anahtar szck zellikle override edilen tremi sinif metotunda sanallik mekanizmasini kirarak taban sinifin sanal metotunun agrilmasini saglamak iin kullanilmaktadir. using System; namespace CSD { class App { public static void Main() {
} } class A { public virtual void Foo() { //... } } class B : A { public override void Foo() 191 Mert KPRC(mrtkprc@gmail.com) Sayfa 192 / -206- { base.Foo(); } } }
base anahtar szcg ayni zamanda taban sinifla tremi sinifla ayni isimli eleman oldugunda taban siniftakini erimek iinde kullanilmaktadir. OPERATR METOTLARI Operatr metotlari C#a C++ dan aktarilmitir. Bu konu Javada yoktur.('angi dil daha i!i:)) Operatr metotlari dile ekstra bir ilevsellik kazandirmaz fakat okunabilirlik kazandirmaktadir. Operatr metotlari sayesinde biz siniflari ve yapilari sanki temel trlermi gibi kullanabiliriz. Normal olarak C# iki sinif referansi yada iki yapi degikeni aritmetik operatrleriyle yada karilatirma operatryle ileme sokulmazlar. Operatr metotlari bunu saglamaktadirlar. rnein : Rational a = new Rational(1,2); Rational b = new Rational(3,4); Rational c; c = a+b; a+b ileminde sinifin arti operatr denen bir metotunu agirir. Aslinda bu ilemler hi operatr metotu olmasaydi normal metotlarda da yapilabilirdi. c = Rational.Add(a,b); Operatr metotlarinin bildirimin genel biimi yledir... public static [implicit,explicit] <geri dnus deeri> operator <sembol>([Parametre Bildirimi])
public static Rational operator + (Rational a,Rational b) {
} Operatr metotlari public ve static olmak zorundadir. Operatr metotlarinin isimleri operatr anahtar szcg ile operatr sembolnden olumaktadir. (Bunlar ayri atomlardir). Tr dntrme operatr metotlari implicit yada expilicit olur. Bunlarin geri dn degerleri herhangi bir trden olabilir. Fakat parametreleri ya bir tane yada iki tane olmak zorundadir. Eger operatr sembol iki operand ile ilikili ise operatr metotunun iki parametresi, tek operandli metot ile ilikiliyse bir parametresi bulunmalidir. Ayrica operatr metotlarinin en az bir parametresi metotun yerletirildigi sinif yada yapi trnden olmalidir. using System; namespace CSD { class App { public static void Main() 192 Mert KPRC(mrtkprc@gmail.com) Sayfa 193 / -206- { Number a = new Number(10), b = new Number(20), c; c = a + b; Console.WriteLine(c.Val); } } class Number { private int m_val;
public Number(int val) { m_val = val; } public Number() {
} public int Val { get { return m_val; } } public static Number operator +(Number a, Number b) { Number result = new Number(); result.m_val = a.m_val + b.m_val; return result; } } }
Derleyici bir operatrle karilatiginda nce operandin trlerine aratir eger operandlar temel trdense kk tr byk tre dntrlerek ilem yapilir operandlardan en az biri sinif yada yapi trndense derleyici her iki operandinda ilikin oldugu sinif yada yapi ierisinde operatr sembolne ilikin operatr metotlarini aday metot olarak seer bunlar arasinda uygun ve en uygun metotlar seilir. rnegin a + b; ileminde A -> T1 sinifina ilikin B -> T2 sinifina ilikin olsun. Bu ii yapabilecek operatr metotlarin T1 ve T2 sinifindaki operator + isimli metotlardir. Operatr metotlari da overload edilebilir. Yani rnegin: sinifin birden fazla operator + metotu bulunabilinir. phesiz operatr metotlari kombine edilebilir. rnegin : Rational a,b,c,d; d = a+b+c; Biz operator metotu yazarak operatr nceliklerini degitiremeyiz onlarin soldan saga , sagdan sola kisimlarini degitiremeyiz. Rational a,b,c,d; d = a+b*c; Burada ne olursa olsun nce arpi metotu agrilir. 193 Mert KPRC(mrtkprc@gmail.com) Sayfa 194 / -206- 29.Hafta 2.Gn (18 Aralk 2011) * , / , + , - METOTLARININ YAZIMI Bu operatr metotlarinin geri dn degerleri herhangi bir trden olabilir fakat en normal olan durumu bunlarin ilgili sinif yada yapinin trnden olmasidir. Anahtar Notlar : Bir siniflar bir temel turu islemi sokan operatr metotu yazmak istiyorsak iyi bir teknik iin bunu iki tarafli olarak yazmaliyiz. rnein : kuuk harf r bir sinif turunden n ise temel turlerden olsun diyoruz. r + n iin operatr metotu yazacak n + r iin de yazmaliyiz. Tabi bu metotlari baimsiz yazmak yerine nce r+n islemini yapan operatr metotunu yazip n + r islemini yapani yazarken dierinden faydalanmak uygun olur. ++(Art Art) ve - -(Eksi Eksi) OPERATOR METOTLAR Bu operatr metotlarini yazarken metotun geri dn degerinin ilgili sinif yada yapi trnden olmasi uygun olur. Programci bunlari yazarken parametre zerinde arttirim yada eksiltim uygulamamali yeni bir nesne yaratip arttirimi yada eksiltimi onun zerinde yapip o yeni nesneye geri dnmelidir. Aksi taktirde n ek ve son ek etkiler uygun biimde oluturulamayacaktir. rnegin : Complex sayi sinifi iin ++ operatr metotu yle yazilabilir. public static Comparison operator ++(Complex a) { Complex result = new Complex(); result.m_real = a.m_real + 1; result.m_imag = a.m_imag; return result; } KARILATIRMA OPERATRLERNE LKN OPERATR METOTLARININ YAZIMI Bu operatr metotlarinin geri dn degerleri herhangi bir trden olabilirse de en normal durum bool trden olmasidir. Karilatirma operatr metotlari iftler halinde yazilmak zorundadir. iftler yledir. > < == != >= <= Bu iftlerden bir tanesi yazilmisa digerinin de yazilmasi gerekmektedir. TR DNTRME OPERATR METOTLARININ YAZIMI Tr dntrme operatr metotlari sayesinde biz bir sinif trn baka bir sinif trne yada bir temel tre atayabiliriz. rnegin : Rational r = new Rational(1,2); double d; d = r; Tr dntrme operatr metotunun bildirimi yle yapilir. public static [implicit,expilicit] operator <tur> ([Parametre Bildirimi]) rnein: public static implicit operator double (Rational x) { return (double) x.m_a/x.m_b; } Tr dntrme operatr metotlari implicit yada expilicit olabilir. Metotun ismi operatr anahtar szcg ile dntrlecek trden olumaktadir. Ayrica geri dn degerinin 194 Mert KPRC(mrtkprc@gmail.com) Sayfa 195 / -206- tr yazilmaz. Metotun geri dn degerinin dntrlecek tr trnden oldugu kabul edilmektedir. Bir sinif yada yapi tr bir hedefe atandigi zaman eger aralarinda bir tretme ilikisi yok ise derleyici bu ii yapabilecek bir tr dntrme operatr metotu aratirmaktadir. Eger bulursa kaynak nesneyi o metota argman olarak geirip o metotu agirir. Dntrme ileminden metotun geri dn degeri elde edilmektedir. Eger tr dntrme operatr expilicit olarak yazilmisa biz onu ancak tr dntrme operatryle devreye sokabiliriz. Implicit olarak yazilmisa biz onu dogrudan dntrmelerde de tr dntrme operatryle yapilan dntrmelerde de devreye sokabiliriz. Ayni tr dntrme operatr metotunu hem implicit hem de expilicit versiyonlari yazlamaz. Bizim s trnden d trne atama yaptigimizi dnelim. Sinifin d trne dntren operatr metotu olmasin. Fakat sinifin T1 ve T2 trne dntrme yapan operatr metotu olsun. Fakat T1 ve T2 trne de otomatik dntrme olsun. Bunlardan hangisi seilecektir? Burada T1 -> D ve T2 -> D dntrmelerinden hangisi daha iyiyse o seilir. Tr dntrme operatryle dntrme yapildigi durumda yine ayni kural uygulanir. Tabi biz tr dntrme operatryle T1 veya T2 trlerinin herhangi birine dntrme yapabiliriz. Tr dntrme operatryle D trne dntrme operatr yapildigi zaman bu kural uygulanir. SINIFLARIN INDEKSLEYC ELEMANLARI Bir sinif trnden bir referansi yada bir yapi degikenini keli parantez operatryle kullanabilmek iin o sinif yada yapida o sinifta indeksleyici denilen bir elemanin bulunuyor olmasi gerekmektedir. Indexleyiciler propertyler gibi yazilmaktadir. Genel biimleri yledir. [erisim belirleyicisi] <tur> this<[parametre bildirimi]> { get { } set { } } Yine bir indeksleyicinin yalnizca get blm olabilir yalnizca set blm olabilir yada her ikisi de olabilir. using System; namespace CSD { class App { public static void Main() { Sample s = new Sample(12345); int digit; digit = s[1]; Console.WriteLine(digit); } } class Sample { private int m_val; public Sample(int val) 195 Mert KPRC(mrtkprc@gmail.com) Sayfa 196 / -206- { m_val = val;
} public int this[int index] { get { return int.Parse(m_val.ToString()[index].ToString()); } } } }
Indexleyicinin parametreleri herhangi bir trden olabilir. rnegin: public int this[string s] { get { return s.Length; } } Indexleyiciler ok boyutlu olabilirler yani birden fazla parametreye sahip olaibilirler. public int this[int a,int b] { get { } set { } } SINIFLARIN STATC BALANGI METOTLARI Siniflarin statik balangi metotlarinda eriim belirleyicisi kullanilamaz. Bunlarin parametreleri olamaz. Yani static balangi metotlari overload edilemez. Baina static anahtar szcg getiriliri. rnegin: class Sample { public Sample() // Normal bas.metot {
} static Sample() // Static bas. metot {
} } Sinifin normal balangi metotlari her agrildiginda aliir fakat static balangi metotlari toplamda yalnizca bir kere agrilir. Static balangi metotu sinifin bir elemani kullanildiginda yani herhangi bir biimde bu snf kullanldgnda agrlr(agrlan elemann yada metotun statik olup olmamas nemli degil). Tabi sinif trden bir referansin bildirilmesi bunun agrilmasi gerekmez. Her zaman statik balangi metotu o sinif iin ilk agrilan metottur. Sinifin statik balangi metotu olmak zorunda degildir varsa arpilir yoksa agrilmaz... 196 Mert KPRC(mrtkprc@gmail.com) Sayfa 197 / -206- Bir sinif ile aliirken toplamda bir kez bir hazirlik ilemi yapmamiz gerekiyorsa her nesne iin yapmamiz gerekmiyorsa bunu tipik olarak static balangi metotlarinda yapmamiz gerekiyor. Statik balangi metotlari tipik olarak sinifin statik veri elemanlarina ilk degerlerine vermek iin kullanilmaktadir. SINIFIN VER ELEMANLARINA SINIF BLDRM ERSNDE LK DEGERN VERLMES Sinifin veri elemanlarina sinifin bildirimi ierisinde ilk deger verilebilir. Aslinda bu bir yapay durumdur. Standartlara gre bu verilen ilk degerler belirtildigi sirada atama deyimine dntrlerek sinifin tm balangi metotlarinin ana blogunun baina bulundurulur. Yani yukarida ki ilemin aagidakinde hi bir farki yoktur. class Sample { private int m_a = 100; private Random m_rand = new Random(); } asaidakinin yukaridan bir farki yoktur. public Sample() // Normal bas.metot { m_a = 100; m_rand = new Random(); } Bu sentaks zellikle sinifta ok sayida balangi metotu bulundugu durumda bazi veri elemanlarina ayni veri degerlerinin atanmasi sz konusu oldugu durumda pratiklik saglamaktadir. Ayrica programci hi bir constructor yazmasa da bu durumda derleyici default constructoru yazarken yine ana blogunun baina bunu taimaktadir. Sinifin baka bir siniftan tretildigi durumda sinifi bildirimi ierisinde verilen ilk degerler taban sinifin balangi metotu agrilmadan nce ilemi sokulur. rnegin : class B : A { private int m_val = 100; public B(): base() { } } *** Burada nce m_val degikenine deger atanir ondan sonra taban sinifin balangi metotu agrilir. Programci byle bir etkiyi sinif bildirimi ierisinde ilk deger vermenin diinda saglayamaz. Sinifin statik bir veri elemanlarina da sinif bildirimi ierisinde ilk deger verilebilinir. private static int m_a = 100; Derleyici bu ilk deger ilemini atama deyimine dntrerek sinifin static balangi metotunun ana blogun iine yerletirilir.. 30.Hafta 1.Gn (24 Kasm 2011) SINIF YADA YAPI NDE YAPILAN TR BLDRMLER( E SINIFLAR) Bir sinif yada yapi bildirimi ierisinde de baka bir yapi, enum, sinif, arayz gibi tr bildirimleri yapilabilinir. rnegin: class Sample { class Test {
197 Mert KPRC(mrtkprc@gmail.com) Sayfa 198 / -206- } } Anahtar Notlar : C#da tur denildiinde class, struct, enum , interface , delegate bildirimleri anlasilmaktadir. Animsanacagi gibi; bir tr isim alani iersinde bildiriliyorsa eriim belirleyicisi olarak public yada internal kullanilabilinir. Fakat eger bir tr sinif yada yapinin iersinde bildiriliyorsa eriim belirleyicisi olarak o sinif yada yapinin elemani olacak ekilde herhangi bir elemanina getirilebilecek her eriim belirleyicisi getirebilinir. I ie tr bildirimlerinde hi bir data iermesi sz konusu degildir. Ne iteki sinif ditaki sinifin elemanlarini , ne de ditaki sinif iteki sinifin veri elemanlarini ierir. Bunlar bagmsz snflardr. Ierme yalnizca isimsel bakimdandir. Iteki tr ismi ditaki trn ierisinden dogrudan kullanilabilinir. Fakat iteki trn diaridan kullanilabilmesi iin hem onun public olmasi hem de di sinif ismiyle niteliklendirilmesi gerekmektedir. Bunun diinda iki sinif tamamen bagimsizdir. using System; namespace CSD { class App { public static void Main() { Sample.Test st; Sample.Color sc; } } class Sample { private static int m_a; public void Foo() { Test t; Color c; } public enum Color { Red,Green,Blue } public class Test { private static int m_b; public void Bar() {
} } } }
I ie tr bildiriminde; iteki sinifin ditaki sinifa yada yapiya iteki yapinin ditaki sinifta yada yapiya eriim ayricaligi vardir. (Fakat ditakinin itekini yoktur.) rnegin biz iteki sinif ierisinde ditaki sinifin yalnizca public blmne degil her blmne eriebiliriz. Peki i ie tr bildirimlerinin ne anlami vardir ? 198 Mert KPRC(mrtkprc@gmail.com) Sayfa 199 / -206- Bazen bir sinifin kendisini yazmak iin baka siniflara gereksinim duyabiliriz. Bu durumda o sinifin diaridan kullanim iin hi bir anlami yoktur. Onu sadece diger sinif kullanmaktadir. class BinaryTree { private Node m_root;
private class Node { public T m_data; public Node m_left; public Node m_right; } } Burada Node sinifi diaridan degil yalnizca BinaryTree sinifinin ierisinde kullanilacaktir. Fakat BinaryTree sinifi ilemini yaparken Node sinifi kullanmaktadir. Bazen de iteki sinifin ditan kullanilmasi mmkn olabilir. Yine de bu kullanim diariyla ilgilidir. class ListBox { public class ItemCollection {
} }
Burada ItemCollection sinifi; ListBox.ItemCollection biiminde kullanilabilinir. Fakat bu sinif yinede ListBox konusu ile ilgili ilemler yapmaktadir. SINIFLARIN BT METOTLARI(DESTRUCTORS) Sinifin biti metotu (destructor) p toplayici tarafindan nesne heapten silinmeden hemen nce agrilan zel bir metottur. Biti metotlari zellikle ynetilmeyen (unmanaged) kaynaklarin boaltilmasi amaciyla kullanilir. Sinifin biti metotlari sinif ismiyle ayni metottur ismin bainda ona yapiik biimde bir tilda(~) karakteri vardir. public Sample() {
} static Sample() {
} ~Sample() {
} Aslinda biti metotu .NET genelinde finalize isimli metottur. Yani C# derleyicisi biti metotunu grdgnde aslinda koda onu Finalize ismiyle yazmaktadir. Biti metotu eriim belirleyici anahtar szck ieremez statik olamaz ve overload edilemez. Yani bundan bir tane olabilir ve parametresi yoktur. Biti metotlarinin maalesef C#da ok faydali kullanimlari yoktur.(Halbuki C++ da ok yogum kullanilmaktadir). C#da biti metotlarinin p toplayici tarafindan ne zaman agrilacagi bilinmemektedir. 199 Mert KPRC(mrtkprc@gmail.com) Sayfa 200 / -206- Finalize metotunun p toplayici tarafindan tam olarak ne zaman agrilacagi bilinmemesi onun ilevselligini azaltmaktadir. stelik sinifin baka sinif trnden bir veri elemanin bulunmasi durumunda bunlarin silinme sirasinda gelii gzel olmaktadir. Yani p toplayici nce eleman olan sinif nesnesini silmek isteyebilir. Sonra elemana sahip olan nesneyi silmek isteyebilir. Bu siranin bir garantisi yoktur. Bylece biz ieren sinifin biti metotunda ierilen sinif ile ilikin veri elemanlarini gvenli olarak kullanamayiz. Eger sinifimiz bir ynetilmeyen(unmanaged) kaynak kullaniyorsa boaltim Dispose metotunda yapilmasi iyi bir tekniktir. Tabi ayrica mmkn oldugu lde her ihtimale kari boaltim yine biti metotunda yapilabilir. TRLERN TYPE NESNELER CLR ne zaman bir trle ; karilairsa onun iin heapte Type snf trnden bir nesne yaratir. Yani program ierinde kullandigimiz her tr iin toplamda bir tane Type nesnesi yaratilmi durumundadir.Bu type nesnesi ierisinde o tre ilikin nemli metadata bilgileri vardir. Bir tre ilikin type nesne referansi typeof operatryle elde edilebilir. Bu operatrn kullanimi yledir. typeof(<tur ismi>) rnek: using System; namespace CSD { class App { public static void Main() { Type t; t = typeof(Sample); } } class Sample {
} }
Type sinifin name isimli property elemani yalnizca bize trn ismini verir, FullName isimli property elemani ise isimalani ile birlikte verir. Object sinifindaki GetType isimli metotu ile de biz type nesne elemanini da elde edebiliriz. Ancak bu GetType metotu referansin dinamik trne ilikin sinifin type nesne referansini elde eder. using System; namespace CSD { class App { public static void Main() { Sample s = new Sample(); object o = s; Type t = s.GetType(); 200 Mert KPRC(mrtkprc@gmail.com) Sayfa 201 / -206- Console.WriteLine(t); t = typeof(Sample);
Console.WriteLine(t.FullName);
} } class Sample {
} }
Referansin dinamik tr anlayarak ilem yapmak iin yle bir switch deyimide kullanilabilinir. Tabi bylesi ilemler iin mmkn oldugunca ok biimliligi kullanmak gerekir. .NET ktphanesinde bazi metotlar bizden bir tr bilgisi istemektedir. ArrayList al = new ArrayList(); int[] a; for (int i = 0; i < 10; i++) { al.Add(i);
} a = (int[]) al.ToArray(typeof(int));
for (int i = 0; i < a.Length; i++) { Console.WriteLine(a[i]); }
Bizde bu tr durumlarda typeof operatryle tr bilgisini verebiliriz. GENERC TRLER Generic tr kavrami C#a Framework 2.0(VS 2005) ile eklenmitir. Bu konu teden beri C++ `da Template ismi altinda zaten bulunmaktadir. Generic konusu C#a byk lde her ey object olarak ifade etmekten kaynaklanan kutulama ve kutuyu ama dnmlerinin oluturdugu zaman kaybini engellemek amaciyla eklenmitir. rnegin bir ArrayList her eyi object olarak tutar ve bize geri verir. Biz int bilgilerini ArrayListte saklayacak olsak bunlarin kutulama dntrmesiyle heape geecek ve yeniden heapten kutuyu ama dntrmesiyle alinacaktir. Bu durumda biz rnegin yalniza int trleri tutabilen IntArrayList gibi bir sinif yazsak int bilgiler bu sinifta tutulurken kutulama ve kutuyu ama dnmesi yapilmayacagindan dolayi daha hizli alima sz konusu olur. (20 kata kadar hz fark vardr.) Fakat bu durumda da diger trler iin bu sinifin kopyasini oluturmak gerekir. Generic Trler bir sinif, yada yapi gibi trleri parametrik olarak bir tre dayali biimde bildirilmeye olanak saglar. rnegin: class MyList<T> { private T[] m_array; public int Add(T a) {
} 201 Mert KPRC(mrtkprc@gmail.com) Sayfa 202 / -206-
} Burada T bir tr temsil etmektedir. Sz konusu sinifta sadece bir ablondur. Bir Generic tr yalnizca isimle belirtilmez. O ainin trde aisal parantezler iinde belirtilmelidir. rnegin : MyList<int> a; MyList<long> b;
Generic bir sinif bildiriminin genel biimi yledir. class <sinif ismi><<Tur parametre listesi>> rnegin ktphane ierisinde System.Collection.Generic; isim alani ierisinde ArrayList sinifinin List isimi altinda Generic bir versiyonu vardir. using System; using System.Collections.Generic; namespace CSD { class App { public static void Main() { List<int> a = new List<int>();
for (int i = 0; i < 10; ++i) a.Add(i); foreach (int x in a) Console.WriteLine("{0} ", x); Console.WriteLine();
} }
} Bir Generic Tr ismi hi bir zaman tek baina kullanilamaz. Her zaman ailim trleri belirtilmek zorundadir. Generic Collection trlerinin yapi trnden ailimlari onlarin object versiyonlarina gre 20 kat daha hizlidir. Fakat referans trleri iin ailim dikkate alindiginda bunlarin Generic versiyonlari ile object versiyonlari arasinda bir hiz farki yoktur. Fakat yine de bunlarin Generic versiyonlari tr gvenligi bakiminda tercih edilmelidir. Peki durum byleyken hi ArrayList sinifini kullanmayip hep List<T> sinifini mi kullanamaz miyiz ? Ite mmkn oldugunca bu durum tercih sebebidir. Fakat bazen yinede mecburen ArrayList kullanimi gerekebilir. rnegin : Collection ierisinde farkli trlere ilikin heterojen nesneler tutuluyorsa bu durum tercih edilir. .NET ierisinde yalnizca ArrayList sinifin degil tm Collection siniflarinin da Generic versiyonlari vardir. Bir Generic sinifin her farkli trden ailimi farkli bir tr belirtir. Bunlari birbirine atayamayiz. Sample<int> a = new Sample<int>(); Sample<long> b = new Sample<long>(); b = a; // Errorrrrrr!!!! class Sample<T> {
} 202 Mert KPRC(mrtkprc@gmail.com) Sayfa 203 / -206- C # ile C++ `in Generic mekanizmalarinin arasinda nemli bir fark vardir. C#da generic bir tr generic olarak ara koda aktarilir ve ailimi derleyici degil CLR yapar... Halbu ki diger diller aim derleme aamasinda derleyici tarafindan yapilmaktadir. Bylece C#da generic bir tr bir dll ierisine yerletirilebilinir. Generic olmayan bir sinif generic bir siniftan tretilebilinir. class A<T> { public void Foo(T a) {
} } class B : A<int> {
}
Burada B sinifi A sinifini int ailimindan tretilmitir. Generic bir sinif generic olmayan bir siniftan tretilebilinir. rnegin : class A { public void Foo(string s) {
} } class B<T> : A {
}
Burada B `nin her trden ailimi Adan tretilmi biimdedir. Generic bir sinif baka bir generic bir siniftan tretilebilinir. class A<T> { public void Foo(string s) {
} } class B<T> : A<T> {
} Burada rnegin B nin int trnden ailimi Anin int trnden ailimindan tretilmitir. Generic bir interface sz konusu olabilir. Bu durumda bu arayz desteklenirken arayzn ailimi tr neyse elemanlarda o tre gre oluturulmalidir. rnegin: interface IX<T> { void Foo(T a);
} class Sample : IX<int> { 203 Mert KPRC(mrtkprc@gmail.com) Sayfa 204 / -206- public void Foo(int a) {
} } Generic Bir Sinif Generic Bir Arayz destekleyebilir. rnegin: interface IX<T> { void Foo(T a);
} class Sample<T> : IX<T> { public void Foo(T a) {
} } Generic Bir Delege sz konusu olabilir. Burada Proc delegesini T ve K isimli iki tr parametresi vardir. GENERC METOTLAR Yalnizca sinif ve yapilar degil metotlarda Generic olabilir. Generic metot bildiriminde metot isminde sonra aisal parantezler ierisinde tr parametreleri belirtilir. rnegin: public static void Foo<T, K>(T a, K b) {
} Generic bir metot iki biimde agrilir.Birincisi aika Metot isminde sonra aisal parantezler ierisinden trler belirtilir. rnegin: Sample.Foo<int, double>(100, 12.3); Ikinci olarakta hi tr parametreleri belirtilmeden argmanlardan bunu derleyicinin ikartmasi saglanabilir. rnegin : Bu biimde otomatik akil yrtme (deduction) yapilabilmesi iin btn generic parametrelerinin bildirimde yapilmi olmasi gerekir. Bu durumda agirma yapilirken tutarsizlik da olmamalidir. rnegin: Aagidaki gibi bir metot otomatik akil yrtme ile agrilamaz. nk biz agirirken geri dn degerinin trn belirtemeyiz. Generic bir sinif bir metotuda generic olabilir. Bu durumda biz metot ierisinde hem sinifin hem de metotun generic parametrelerini kullanabiliriz. rnegin: class Sample<T> { public void Foo<K>() { T a; K b;
} } GENERC PARAMETRELER LKN KISITLAR Bir generic sinif yada metot derlenirken default olarak generic tr parametrelerinin herhangi bir trden olabilecegi dikkate alinmaktadir. Bu nedenle bu konuda ki herhangi bir uyumsuzluk errora yol aar. class Sample<T> 204 Mert KPRC(mrtkprc@gmail.com) Sayfa 205 / -206- { public void Foo() { T a = null; // error } } Burada eger T yapi trnden ailirsa bu null atamasi geersiz olacaktir. Ite bunu mmkn hale getirebilmek iin bur rnekte tr parametresinin referans trne ilikin oldugu sylenir. Tr parametresi iin kisit where cmlecigi ile yapilir. where <tur parametresi> : <kisit> Kisitlar trl olabilir: Birinci kisitlar , ikincil kisitlar ve balangi kisitlari...Birincil kisit u biimde oluturulur. Class kisiti ilgili tr parametresinin referans trlerine ilikin olacagini belirtir. Struct kisiti ilgili tr parametresinin yapi trlerine ilikin olacagini belirtir. Kisit olarak bir tr ismi kullanilirsa bu durum ilgili tr parametresinin o trden yada o trden tretilmi olacagini belirtir. class Sample<T> where T : class { public void Foo() { T a = null; } } Ikincil kisitlar bir yada birden fazla arayz ismini ierir, bu durumda aim yapilacak trn o arayzleri desteklemesi zorunlulugu oluur. phesiz bu generic snflar kullanlrken am srasnda derleyici bu kstlar uyulup uyulmadgn kontrol eder. Birinci kst , ikinci kst yada balang metotu kst bir arada kullanabilir. Bu durumda kesinlikle nce birinci kstn sonra ikinci kstn sonra balang metotu kstn belirtilmesi gerekmektedir Tabi yalnzca bir tanesi de kullanlabilir. class Sample<T> where T : class,IDisposable,ICloneable {
} Burada T tr referans trne ilikin olmak zorundadir ve ayrica IDisposable,ICloneable arayzn desteklemek zorundadir . Balangi metotu kisiti new() ile belirtilir ve ilgili trn default balangi metotunu sahip olmasi gerektigini belirtir. rnegin: class Sample<T> where T : class,IDisposable,ICloneable,new() {
} Balang metotu kst sadece default balang metotu iin geerlidir. Baka bir constructor iin geerli degildir. Birden fazla parametre iin ayri ayri kisit verilebilir. rnegin: class Sample<T,K> where T : class where K : struct
{
} 205 Mert KPRC(mrtkprc@gmail.com) Sayfa 206 / -206-
SINIFLARIN ve YAPILARIN CONST VER ELEMANLARI Bir sinifin veri elamani const anahtar szcg ile bildirilebilir. Fakat bu durumda bunlara sabit ifadeleriyle ilk deger verilmi olmasi gerekmektedir. rnegin: class Sample { public const int Size = 10; } Const veri elemanlari default olarak statiktir ve sabit ifadesi olarak kullanabilir. Sinifin const bir veri elemani daha sonra degitirilemez. SINIFLARIN READ-ONLY VER ELEMANLARI
Sinifin readonly veri elemanlari yalnizca balangi metotunda degitirilebilinir. Bunlarin sinif bildirimi ierisinde ilk deger verilebilir yada balangi metotu ierisinde deger atanabilir. Fakat bir daha degeri degitirilmez. const bildirimi ancak temel trleri iin ve string tr iin kullanabilir. Bir sinif trnde referans const yapilamaz. nk new ilemi sabit ifadesi anlamina gelmektedir. Bunun iin sinif referanslari iin const duygusunu yaatmak iin readonly anahtar szcg kullanilir . using System; namespace CSD { class App { public static void Main() { //... } } class Sample { public readonly Random r; public Sample() { r = new Random(); //... } //... } } *** readonly elemanlar, const gibi statik olmak zorunda degildir. Ancak istenirse statik yapilabilinir. 206