You are on page 1of 206

Mert KPRC(mrtkprc@gmail.

com) Sayfa 1 / -206-


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.

Tr Uzunluk
(byte)
Yapi Kariligi Sinir Degerler
TAM SAYILAR
int 4 System.Int32 [-2147483648 , +2147483647]
uint 4 System.UInt32 [0,4294967295]
short 2 System.Int16 [-32768,+32767]
ushort 2 System.UInt16 [0,65535]
long 8 System.Int64 [-9223372036854775808,
+9223372036854775807]
ulong 8 System.UInt64 [0,18446744073709551615]
byte 1 System.SByte [-128,127]
sbyte 1 System.Byte [0,255]
GEREK SAYILAR
float 4 System.Single 3.6*10
-38
3.6*10
38
double 8 System.Double 1.8*10
-308
1.8*10
308
decimal 16 System.Decimal 28 digit mantis
DIGER TRLER
bool 1 System.Bool true,false
char 2 System.Char [0,65535]

* 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.

() soldan-saga
+ - sagdan-sola
* / % soldan -saga
+ - soldan-saga
= sagdan-sola

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');

if (ch=='e')
{
System.Console.WriteLine("Evet Setiniz");
}
else
{
System.Console.WriteLine("Hayir Setiniz...");
}

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()
{

Sample s;
s = new Sample();
s.a = 10;
s.b = 20;

System.Console.WriteLine(s.a);
System.Console.WriteLine(s.b);
}

}

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()
{

System.Console.WriteLine("{0}/{1}/{2}",day,month,year);

}

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);

System.Console.WriteLine(k);
}
else
{
System.Console.WriteLine("Yazi Hatali Girildi ");
}

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;

s3 = s1 + s2;

System.Console.WriteLine(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-
{

System.Console.WriteLine("{0}/{1}/{2}",day,month,year);
}
}

}


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()
{

string[] names = new string[5];

names[0] = "Ali";
names[1] = "Veli";
names[2] = "Selami";
69
Mert KPRC(mrtkprc@gmail.com) Sayfa 70 / -206-
names[3] = "Ayse";
names[4] = "Fatma";

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;

names = s.Split(new char[] { ' ', ','},System.StringSplitOptions.RemoveEmptyEntries);

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];
}

string[] names = { "Ali","Veli","Selami","Ayse","Fatma"};


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)
{

}

string[] files;
files = Directory.GetFiles(@"c:\windows");
foreach (string file in files)
Console.WriteLine(file);

*Bu GetFiles metotlari yalnizca klasr ierisindeki dosyalari bulmaktadir. Dizinleri
bulmamaktadir.


Aagidaki GetFiles metotu belli bir klasrdeki joker karakterleriyle belirtilen kaliba uygun
dosyalari bulur
public static string[] GetFiles(string path, string searchPattern)
{

}

string[] files;
files = Directory.GetFiles(@"c:\windows","*.exe");
foreach (string file in files)
Console.WriteLine(file);

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.


string[] files;
files = Directory.GetFiles
(
@"e:\CSharp-Haziran",
"*.*",
SearchOption.AllDirectories
);

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;

t.a = 10;
t.b = 20;
Console.WriteLine(t.a);
Console.WriteLine(t.b);

}
}
struct Test
{
public int a;
public int b;


}
}
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()
{


DateTime dt = DateTime.UtcNow;
Console.WriteLine(dt.ToString());

}
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.

(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

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();

o = s;

string str;
str = o.ToString();
Console.WriteLine(str);

}

}
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
{

}
catch (YourException e)
{

}
catch (MyException e)
{
155
Mert KPRC(mrtkprc@gmail.com) Sayfa 156 / -206-

}

}
}
class MyException : Exception
{

}
class YourException : Exception
{

}
}
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()
{

try
{
Foo(-10);

}
catch (YourException e)
{
Console.WriteLine("YourException ocurred");
156
Mert KPRC(mrtkprc@gmail.com) Sayfa 157 / -206-

}
catch (MyException e)
{
Console.WriteLine("MyException ocurred");

}
Console.WriteLine("Main ends");

}
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;

try
{
a = Foo();
}
catch (Exception e)
{
Console.WriteLine(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;

ix.Foo();// Aikca destekleme
iy.Foo();// Aikca destekleme

}
}
interface IX
{
void Foo();
}
interface IY
{
174
Mert KPRC(mrtkprc@gmail.com) Sayfa 175 / -206-
void Foo();
}
class Sample : IX,IY
{

void IX.Foo()
{
Console.WriteLine("IX Explicit Implemantion");
}
void IY.Foo()
{
Console.WriteLine("IY Explicit Implemantion");
}

}
}
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;

try
{
fs
= new FileStream("test.dat", FileMode.Create,FileAccess.ReadWrite);
}
catch (Exception e)
{
Console.WriteLine(e.Message);
}
finally
{
if (fs != null)
fs.Close();
}

}

}
}

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);

}
Console.WriteLine();
}
catch (Exception e)
{
Console.WriteLine(e.Message);
}
finally
{
if (fs != null)
fs.Close();
}

}
}
}
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);


}
catch (Exception e)
{
Console.WriteLine(e.Message);
}
finally
{
if (bw != null)
bw.Close();


}
}
}
}
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);

for (int i = 0; i < 100; i++)
{
bw.Write(i);

}


}
catch (Exception e)
{
Console.WriteLine(e.Message);
}
finally
{
if (bw != null)
bw.Close();


}
}
}
}
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

You might also like