Professional Documents
Culture Documents
C# dil i ortaya çı kal ı dah a h iç b irş ey yapmayan varsa ya da b irş eyl er yapı p da ne
yaptı ğ ı ndan emin ol mayan varsa iş te b u yaz ı tam siz e göre. Bu yaz ı mı z da kl asik M erh ab a
D ü nya programı mı z ı yaz ac ağ ı z .A ma programı mı z ı yaz arken h er ş eyi adı m adı m
öğ renec eğ iz . U nutmayı n amac ı mı z b urada M erh ab a D ü nya yaz mak değ il . :) O h al de
aş ağ ı daki programı iyic e inc el eyin önc e, ş öyl e b ir sü z ü n programı yukarı dan aş ağ ı ya,
f az l a detayl ara inmeden yaz ı mı z ı okumaya devam edin;
using System;
{
c l ass Sı nı f 1
{
static void M ain(string args[])
{
Consol e.W riteL ine("M erh ab a D ü nya");
}
}
}
Y ukarı daki il k programı mı z ı inc el ediğ iniz e göre açı kl amal arı mı z a geçeb il iriz . E ğ er önc eden
C+ + ve Java il e il gil enmiş arkadaş l ar varsa yukarı daki kodl ar tanı dı k gel eb il ir. N itekim,
h er ne kadar M ic rosof t f irması il k b aş l arda b unu kab ul etmese de C# dil i Java ve C+ +
dil l erinin h armanl anması ndan ol uş muş b ir dil dir. Bugü n b unu kab ul etmeyen yoktur
sanı rı m.
Ş imdi kodl arı mı z ı inc el eyel im. İ l k satı rdaki < using System;> if adesi System adl ı b ir isim
al anı nı n kul l anı l ac ağ ı nı b el irtiyor.P eki nedir b u isim al anı (N amespac e). İ simal anı kavramı
son yı l l arda program modü l l erinin çok sayı da artması ndan dol ayı popü l er h al e gel miş tir.
K ol ay ve h ı z l ı programl ama yapmamı z ı sağ l ayan b ir takı m h az ı r kü tü ph anel er h er ne
kadar iş imiz i kol ayl aş tı rsa da eğ er isimal anl arı ol masaydı kul l anac ağ ı mı z h er kü tü ph ane
b iz im için iş in içinden çı kı l maz b ir h al e gel eb il irdi. D ü ş ü nü n ki iki ayrı f irma iki ayrı sı nı f
kü tü ph anel eri ol uş turdu ve b u kü tü ph anel erin içinde aynı isiml i b irden çok sı nı f yapı sı var.
E ğ er b iz programc ı ol arak iki f irmanı n da kü tü ph anesini kul l anmak istiyorsak h er ikisini
aynı kod içinde kul l anamayı z . Ç ü nkü aynı isiml i sı nı f l ar derl eme aş aması nda h ata
verec ektir. Bu durumda yapı l ması gereken tek ş ey ya da en etkil i yöntem isimal anl arı nı
kul l anmaktı r. Y ani b ir sı nı f a(c l ass) ul aş ab il mek için onun isim al anı yl a çağ ı rmak. İ sim
al anl arı h iyerarş ik yapı da ol ab il ir. M esel a System isim al anı nı n al tı nda b aş ka b ir isim al anı
onun al tı nda b aş kal arı vs. İ ş te .N E T isimal anı (namespac e) h iyerarş isinin en tepesinde
b ul unan isim al anı System adl ı isimal anı dı r. E n temel iş l eml erimiz için b il e b u isim al anı nı
kul l anmal ı yı z . A ksi h al de programı mı z çal ı ş mayac aktı r. İ simal anl arı nı kul l anmak için
isimal anı nı n b aş ı na using söz c ü ğ ü getiril ir.
Soru: System isim al anı nı n içinde D ata isimal anı nda b ul unan b ir c s adl ı sı nı f ı
kul l anab il mek için kaynak kodumuz a ne ekl ememiz gerekir.
Bil diğ iniz gib i C# dil i % 100 nesne tab anl ı b ir dil dir. Y aptı ğ ı mı z h erş ey b ir sı nı f nesnesidir
C# dil inde. N esne ol mayan h içb irş ey yoktur. C+ + dil indeki main iş l evini h atı rl arsı nı z
çoğ unuz . P rogramı mı z c + + dil inde main iş l evinden b aş l ar ama main iş l evi h iç b ir z aman
b ir sı nı f içinde ol mamı ş tı r.C# dil inde h erş ey sı nı f l arl a temsil edil diğ i için main iş l evi de
b iz im b el irl ediğ imiz b ir sı nı f ı n iş l evi ol mak z orundadı r. Y ukarı daki programı mı z da < c l ass
Sı nı f 1> if adesi il e programı mı z da b ir sı nı f nesnesi ol uş turuyoruz . Sı nı f 1 sı nı f ı nı n b ir iş l evi
ol an main' in el b ette eskiden de ol duğ u gib i öz el b ir anl amı vardı r. Bil iyorsunuz ki
derl eyic il er programı n nerden çal ı ş ac ağ ı nı b il mek isterl er, aksi h al de derl eme iş l eminden
sonra "programı nı z için b aş l ama noktası b ul unamadı " h atası al ı rı z . Bu yü z den main iş l evi
b iz im için eskiden de ol duğ u gib i programı mı z ı n b aş l angı ç noktası dı r. Y ani b iz programda
yapmak istedikl erimiz i main iş l evi içinde gerçekl eş tirec eğ iz . Sı nı f tanı ml amal arı mı z ı ise
istediğ imiz noktada yapab il iriz . D ah a önc ede dediğ imiz gib i isimal anl arı b irçok sı nı f ı n veya
tek b ir sı nı f ı n ol uş turduğ u kü medir. Biz im ana programı mı z da b ir sı nı f ol duğ una göre
Cl ass1 sı nı f ı nı istediğ imiz isiml i b ir isimal anı na sokab il iriz . Y ukarı da < namespac e
M erh ab aD unya> yaz arak isimal anı nı b aş l atı yoruz .
Ş imdi main iş l evinin içine b akal ı m, System isimal anı nda b ul unan Consol e sı nı f ı nı n b ir
metodu ol an W riteL ine() il e ekrana b ir string if adesi yaz dı rı yoruz . Biz b urda iki tı rnak
if adesi içinde yaz ı mı z ı b el irtmemiz e rağ men f onksiyonun kul l anmı b ununl a sı nı rl ı değ il dir.
C# dil indeki f onksiyon aş ı rı yü kl eme (f unc tion overl oading)kul l anı l arak f onksiyonu b irçok
parametrik yapı da kul l anab il memiz sağ l anmı ş tı r. F onksiyon aş ı rı yü kl eme konusuna
b undan sonraki yaz ı l arı mı z da değ inec eğ imiz i b el irtel im. W riteL ine() iş l evinin adı ndan da
anl aş ı l ac ağ ı gib i ekrana b asmak istediğ imiz yaz ı dan sonra satı r atl ama iş l emi yapar.Bunu
test etmek için b ir tane "M erh ab a D ü nya" da siz yaz dı rı n. G örec eksiniz ki siz
b el irtmemeniz e rağ men al t al ta iki tane "M erh ab a D ü nya" yaz ı sı çı kac ak.
M erh ab a, b u makal emiz de, h emen h emen tü m W indow s uygul amal arı nı n temel yapı taş ı
ol an W indow s menü l erinin nası l h az ı rl andı ğ ı nı ve b asit b ir uygul aması nı adı m adı m
görec eğ iz . Bil diğ iniz gib i W indow s menü l erini ş imdiye kadar V isual Basic ortamı nda çok
b asit b ir ş ekil de yapmak mü mkü ndü . A ma artı k V isual C# il e menü h az ı rl amak h em dah a
kol ay h em de dah a eğ l enc el i. Bu makal ede yapac ağ ı mı z uygul amadaki amac ı mı z , F il e ve
E dit b öl ü mü nden ol uş an W indow s menü sü nü tek b ir W indow s b utonuyl a aktif ya da pasif
duruma getirmek.
Ş imdi uygul amamı z ı n il k adı mı ol an yeni proj e ol uş turma sayf ası nı açal ı m.
F il e->N ew -> P roj ec t menü sü nü kul l anarak aş ağ ı daki gib i yeni b ir proj e ol uş tural ı m.
P roj e tipi ol arak V isual C# P roj ec t, templ ate ol arak da W indow s A ppl ic ation seçtikten
sonra proj emiz e uygun isim verip O K b utonuna tı kl ayal ı m.
P roj emiz i ol uş turduğ umuz da V isual C# I D E ' sinin b iz im için b ir b aş l angı ç f ormu
ol uş turduğ unu görü rü z . Bu f orm doğ al ol arak ş u anda b oş tur. Tool b ox menü sü nü
kul l anarak F orm ü z erine istediğ imiz kontrol l eri sü rü kl e b ı rak yöntemiyl e yerl eş tireb il iriz .
Y a da istediğ imiz kontrol ü çif t tı kl ayarak da aynı iş l evi gerçekl eş tireb il iriz . E ğ er tool b ox
menü sü nü göremiyorsanı z ekranı n sol al t kü ş esinde b ul unan
Tool Box ikonuna tı kl ayı n. Ş imdi f ormumuz a b asit b ir M ainM enu kontrol u ekl eyel im. Y ine
Tool Box menü sü nden aş ağ ı daki ikona ş ekl ine b enz eyen kı sma çif t tı kl ayı n. E ğ er iş l em
b aş arı l ı ysa f ormunuz un en ü st kı smı nda edit edil mek ü z ere b ir menü ol uş ac aktı r.
M ainM enu ü z erine f are il e gel erek istediğ iniz menü el emanl arı nı ekl eyin.Ben önc e F il e
el emanı nı sonra E dit el emanı nı ve E dit el emanı nı n içinde de Copy ve P aste menü
el emanl arı nı aş ağ ı daki gib i ol uş turdum.
Ş imdi menü el emanl arı mı z a P roperties penc eresinden isim verel im. A ş ağ ı da gördü ğ ü nü z
penc ereden f orm design penc eresinden seçtiğ iniz el emanl a il gil i öz el l ikl ere
ul aş ab il irsiniz .Ş imdi E dit menü el amanı na tı kl ayarak P roperties ekranı ndaki name
öz el l iğ ine "menuE dit" yaz al ı m. Burda menu el emanı na verdiğ imiz ismi dah a sonra kod
yaz arken kul l anac ağ ı mı z için akl ı mı z da kal ac ak b ir isim vermemiz dü z enl i kod yaz mak için
öneml i b ir seb eptir. M enü el emanl arı yl a iş imiz b ittiğ ine göre sı ra menü yü kontrol
edec eğ imiz b utonu yerl eş tirmeye gel di. Tool Box penc eresinden "Buton" a çif t tı kl ayarak
f orma b ir b uton yerl eş tirel im .D ah a sonra b utona tı kl ayı p P roperties penc eresinden b uton
ismi (N ame) ol arak "Biz imButon " yaz al ı m. Biz imButon ' un tex t öz el l iğ ine ise "M E N U
P A Sİ F E T" yaz ı sı nı yaz al ı m. Bu yaz ı yı yaz mamı z ı n seb eb i ise ş udur: M ene el emanl arı
varsayı l an ol arak aktif durumdadı rl ar. Bu yü z den menü yü pasif h al e getirmek için b u
yaz ı yı seçtik.
E vet,F orm tasarı m iş l emi b itti. Ş imdi sı ra gel di Biz imButon il e menü ye aktif ve pasif
duruml arı arası nda geçiş yaptı rmak. Tab i ası l iş te ş imdi b aş l ı yor.
F orm ü z erindeki b utona çif t tı kl ayarak kod yaz ma ekranı na gel el im.
G ördü ğ ü nü z gib i V isual C# b iz im için b ir takı m kodl ar ol uş turdu. Biraz b u h az ı r kodl arı
ana h atl arı yl a inc el eyel im.
using System;
using System.D raw ing;
using System.Col l ec tions;
using System.ComponentM odel ;
using System.W indow s.F orms;
using System.D ata;
Y ukarı daki kodl arl a programı mı z ı n kul l anac ağ ı b ir takı m sisteml er derl eyic iye b il diril iyor.
System.W indow s.F roms.F orm sı nı f ı ndan yeni b ir F orm1(b iz im f orm) sı nı f ı tü retil erek b u
f orm içindeki el emanl ar tanı ml anı yor.
private void I nitial iz eComponent() iş l evi il e F orm1 sı nı f ı içindeki el emanl arl a il gil i il k
iş l eml er yapı l ı yor. E l emanl arı n f orm ü z erindeki yeri ve el emanl ara ait P roperties
penc eresinden tanı ml adı ğ ı mı z b ü tü n öz el l ikl eri b u iş l ev il e yerine getiril ir.
İ ş te b u da b iz im kodumuz :
Bil diğ imiz gib i b il gisayarl arı programl amak için programl ama dil l erine ih tiyaç duyul ur.Bu
dil l erden en popü l erl eri Basic ,C,C+ + ,P asc al ,Java ve A ssemb l er ' dı r.M akina dil i ise
donanı mı kontrol etmek için donanı mı ü reten f irma taraf ı ndan tanı ml anan komutl ar
kü mesidir. Baz ı programl ama dil l eri derl eyic il ere ih tiyaç duyması na karş ı n b az ı l arı ise
yoruml ayı c ı l ara ih tiyaç duyarl ar, mesel a b ir c + + programı nı çal ı ş tı rab il mek için C+ +
derl eyic isine ih tiyac ı mı z varken, P erl il e yaz ı l mı ş b ir CG I sc ripti için komut yoruml ayı c ı sı na
ih tiyac ı mı z vardı r. D erl eyic il er programı çal ı ş tı rmadan önc e kodl arı makina komutl arı na
çevirirl er f akat yoruml ayı c ı l ar b ir grup kodu satı r satı r ya da b l okl ar h al inde yoruml ayarak
çal ı ş tı rı rl ar.
A sl ı nda derl eyic il er de, komut yoruml ayı c ı l arı da b irer b il gisayar programı ndan b aş ka
b irş ey değ il dirl er.Y ani c ve c + + dil l eri b ir giriş b ekl eyen ve çı kı ş veren b irer b il gisayar
programl arı gib i dü ş ü nü l eb il ir.G iriş ol arak kaynak kodu veren b u programl ar çı kı ş ol arak
ise makina kodu ü retirl er.
C dil i en popü l er yapı sal programl ama dil idir.C dil i D ennis R itc h ie taraf ı ndan, M artin
R ic h ards ve K en Th ompson taraf ı ndan gel iş tiril en BCBL ve B dil l erinin temel l eri ü z erine
kurul du.
C dil i "Th e C P rogramming L anguage b y Brian K ernigh an and D ennis R itc h ie" kitab ı yl a
b ü yü mü ş tü r.C dil i için, 19 83 yı l ı nı n b ü yü k önemi vardı r.Ç ü nkü 19 83 yı l ı nda A N SI
standartl ar komitesi C standartl arı için topl anmı ş tı r.Bu standartl aş ma sü rec i tam 6 yı l
sü rmü ş tü r.V e tab i ki ş u anki standartl arı n ol uş umuna katkı da b ul unan A N SI 9 9
standartl arı da diğ er öneml i b ir gel iş medir.
C programc ı l ar taraf ı ndan h erh angi b ir tü r program gel iş tirmek için yaz ı l mı ş genel amaçl ı
b ir dil dir. C il e b ir dü ş ü k seviyel i sistem için program yaz ab il ec eğ imiz gib i, yü ksek seviyel i
b ir G U I (G raf ik A rab irimi) tasarl amamı z da mü mkü ndü r.V e el b ette kendi kü tü ph anemiz i
de C il e ol uş turab il iriz .C dil inin ortaya çı kması ndan b unc a yı l geçmesine rağ men
popü l aritesini h içb ir z aman kayb etmemiş tir. G ü nü mü z programc ı l arı çeş itl i amaçl ar için
programl arı nı gel iş tirirken C dil i il e yaz ı l mı ş kaynak kodl arı nı kul l anı rl ar.
Bj arne Stroustrup 19 80 yı l l ı nda C+ + dil ini ortaya çı karmı ş tı r. C+ + dil i C temel l i ve C nin
b ir ü st kü mesi ol arak dü ş ü nü l eb il ir. C+ + en popü l er nesne temel l i programl ama dil idir.
C+ + dil inin il k ismi "C w ith Cl asses"(C il e sı nı f l ar) idi. C+ + dil i C dil ine naz aran dah a etkil i
ve gü çl ü dü r.V e en öneml i öz el l ğ i ise C ' den f arkl ı ol arak nesne temel l i b ir dil dir.Ş u anda
C+ + dil i A N SI ve I SO kurul uş l arı taraf ı ndan standartl aş tı rı l mı ş tı r. Bu standartl arı n son
versiyonu 19 9 7 yı l ı nda yayı nl anmı ş tı r.
C# , gü çl ü , modern, nesne tab anl ı ve aynı z aman type-saf e(tip-gü venl i) b ir programl ama
dil idir.A ynı z amanda C# , C+ + dil inin gü çl ü l ü ğ ü nü ve V isual Basic ' in ise kol ayl ı ğ ı nı
sağ l ar.Bü yü k ol ası l ı kl a C# dil inin çı kması Java dil inin çı kması ndan b u yana programc ı l ı k
adı na yapı l an en b ü yü k gel iş medir. C# , C+ + ' ı n gü c ü nden , V isual Basic ' in kol ayl ı ğ ı ndan
ve Java ' nı n da öz el l ikl erinden f aydal anarak tasarl anmı ş b ir dil dir. F akat ş unu da
söyl emel iyiz ki, D el ph i ve C+ + Buil der ' daki b az ı öz el l ikl er ş imdi C# ' da var. A ma D el ph i
ya da C+ + Buil der h içb ir z aman V isual C+ + ya da V isual Basic ' in popü l aritesini
yakal ayamamı ş tı r.
CL R , .N E T F ramew ork yapı sı nı n servis sağ l ama ve çal ı ş ma z amanı nı n kod organiz asyonu
yapan ortamı dı r. CL R , E CM A standartl arı nı destekl er.
K ı sac ası C# kul l anmak için CL R ve .N E T F ramew ork sı nı f kü tü ph anesine ih tiyac mı z vardı r.
Bu da demek ol uyor ki C# , JA V A , V B ya da C+ + değ il dir. C,C+ + ve JA V A ' nı n gü z el
öz el l ikl erini b arı ndı ran yeni b ir programl ama dil idir. Sonuç ol arak C# il e kod yaz mak h em
dah a avantaj l ı h em dah a kol ay h em de etkil eyic idir.
Bu derste C# dil indeki if adel er,tipl er ve değ iş kenl er anl atı l ac aktı r.
Dersimizin hedefleri :
D eğ iş kenl eri en sab it ş ekil de veril erin depol andğ ı yerl er ol arak tanı ml ayab il iriz .
D eğ iş kenl erin içine veril erimiz i koyab il irirz veya değ iş kenl erimiz in içindeki veril eri C#
programı ndaki iş l eml erimiz için kul l anab il l iriz . D eğ iş kel erin tipini b el irl eyen f aktör,
onl arı n içerdikl eri veril erin çeş itl eridir.
C# dil inde kul l anac ağ ı mı z h er değ iş kenin b ir tipi ol mak z orundadı r ( V b sc ript ve
JavaSc ript gib i dil l erde değ iş ken tanı ml arken onun tipini de ayrı c a b el irtmeye gerek
yoktur.) Bir değ iş ken ü z erinde yapı l an tü m iş l eml er de onun h angi tipte b ir değ iş ken
ol duğ u göz önü ne al ı narak yapı l ı r. Böyl ec e programda b ü tü nl ü k ve gü venl ik korunmuş
ol ur.
Bool ean ( doğ ru/yanl ı ş ), ve ü ç sayı sal veri tipi; integer( tamsayı ), f l oating point
(ondal ı kl ı sayı ) ve dec imal ( muh aseb e ve f inansal iş l eml er için) C# dil inin en b asit veri
tipl eri ol arak sayı l ab il ir.
K od 1 : Bool ean değ erl erin görü ntü l enmesi : Bool ean.c s
using System;
Y ukarı daki K od 1’ de de görü l ec eğ i gib i b ool ean değ iş kenl er ya true(doğ ru) veya
f al se(yanl ı ş ) değ erl erini al ab il irl er. P rogramı n çı ktı sı ş öyl e ol ac aktı r.
>I t is True th at C# Station provides C# programming l anguage c ontent.
>Th e statement ab ove is not F al se.
A ş ağ ı daki tab l o tamsayı tipl erini, b oyutl arı nı ve al ab il ec ekl eri değ er aral ı kl arı nı
göstermektedir.
T ype ( S ize ( in
R a ng e ( a ra lı k )
T ip ) b its)( b o yu t )
sb yte 8 -128 to 127
b yte 87 0 to 255
sh ort 16 -327 6 8 to 327 6 7
ush ort 16 0 to 6 5535
int 32 -2147 4836 48 to 2147 4836 47
uint 32 0 to 429 49 6 7 29 5
l ong 6 4 -9 22337 2036 8547 7 5808 to 9 22337 2036 8547 7 5807
ul ong 6 4 0 to 18446 7 4407 37 09 5516 15
c h ar 16 0 to 6 5535
Tamsayı tipl eri kü suratsı z iş l eml er için çok el veriş l idirl er. F akat c h ar( karakter) tipi
U nic ode standartl arı na uygun ol arak b ir karakteri temsil eder. Y ukarı daki tab l odan da
görec eğ iniz gib i el imiz de çok sayı da tamsayı tipimiz vardı r. Bunl ardan istedikl eriminiz i
ih itiyaçl arı mı z a göre rah atça kul l anab il iriz .
Bir sonraki tab l o ise ondal ı k (f l oating point ) ve dec imal veri tipl erini,b oyutl arı nı ,
h assasiyetl erini ve geçerl i ol dukl arı aral ı kl arı l istel er.
T ype ( S ize ( in
P rec isio n R a ng e
T ip ) b its)( b o yu t )
f l oat 32 7 digits 1.5 x 10-45 to 3.4 x 1038
D oub l e 6 4 15-16 digits 5.0 x 10-324 to 1.7 x 10308
D ec imal 128 28-29 dec imal pl ac es 1.0 x 10-28 to 7 .9 x 1028
O ndal ı kl ı sayı l arı kü suratl ı iş l eml erde kul l anmak iyi ol ur. Bunun yanı nda muh aseb e ve
f inansal iş l eml er için dec imal veri tipi dah a uygun ol ac ak ş ekil de tasarl anmı ş tı r.
Bil gisayar programl arı iş l eml eri yaparken if adel eri kul l anı rl ar ve sonuç ortaya çı kartı rl ar.
P rograml arda yer al an if adel er değ iş kenl er ve iş l eçl erden ( operatör) ol uş urul ar. Bir
sonraki tab l oda iş l eçl eri, iş l eçl erin iş l em sı ral arı nı ve iş l eme yönl erini göreb il irsiniz .
Sol iş l eme yönü demek iş l eml erin sol dan sağ a doğ ru yapı l dı ğ ı dı r. Sağ iş l eme yönü
demek iş l eml erin sağ dan sol a doğ ru yapı l dı ğ ı dı r. M esal a atama iş l eçl erinin h epsinde
önc e sağ taraf ı n sonuc u b ul unur ve b u sonuç sol taraf a aktarı l ı r.
using System;
c l ass U nary
{
pub l ic static void M ain()
{
int unary = 0;
int preI nc rement;
int preD ec rement;
int postI nc rement;
int postD ec rement;
int positive;
int negative;
sb yte b itN ot;
b ool l ogN ot;
l ogN ot = f al se;
l ogN ot = ! l ogN ot;
Consol e.W riteL ine("L ogic al N ot: {0}", l ogN ot);
İ f adel er iş l eml er yapı l ı rken arka-artı rma ve arka-az al tma iş l eçl eri önc e değ iş kenin
değ erini döndü rü r sonra değ iş ken ü z erinde artı rma veya az al tma iş l emini yapar. D iğ er
taraf tan, ön-artı rma ve ön-az al tma iş l eçl eri önc e değ iş ken ü z erinde artı rma veya
az al tma iş l emini yapar sonra değ iş kenin son h al ini döndü rü r.
K od 2‘ de unary (tek) değ iş ken önc e sı f ı r ol arak atanı yor. Ö n-artı rma (pre-inc rement)
iş l ec i uygul andı ğ ı nda, unary değ iş kenin değ eri 1’ e çı kı yor ve “ preI nc rement”
değ iş kenine atanı yor. Hemen arkası nda Ö n-az al tma(pred-dec rement) iş l ec i sayesinde
unary değ iş kenimiz tekrar sı f ı r değ erini al ı yor preD ec rement değ iş kenine b u değ er
atanı yor.
M antı ksal değ il iş areti, doğ ru if adeyi yanl ı ş , yanl ı ş if adeyi ise doğ ru ol arak değ iş tirir.
K od 2’ inin çı ktı sı ş öyl e ol ac aktı r :
using System;
c l ass Binary
{
x = 7 ; y = 5;
resul t = x + y;
Consol e.W riteL ine("x + y: {0}", resul t);
resul t = x -y;
Consol e.W riteL ine("x -y: {0}", resul t);
resul t = x *y;
Consol e.W riteL ine("x *y: {0}", resul t);
resul t = x /y;
Consol e.W riteL ine("x /y: {0}", resul t);
resul t = x % y;
Consol e.W riteL ine("x % y: {0}", resul t);
resul t + = x ;
Consol e.W riteL ine("resul t+ =x : {0}", resul t);
K od 3: te b irçok aritmetik iş l eml er yapı l ı yor. Bu iş l eml erin sonuc unu da siz l er tah min
edeb il irsiniz ...
“ f l oatR esul t” değ iş kenin tipi ondal ı kl ı sayı tipi ol duğ u ve “ x ” ve “ y” değ iş kenl erimiz
tamsayı tipl erinde ol dukl arı onl arı açı k b içimde ondal ı kl ı sayı tipine çevirdik ( ex pl ic itl y
c ast ) ve b u ş ekil de iş l em yaptı k.
Y ukarı daki kod parçası nda b ir de kal an (remainder % ) iş l ec inin kul l anı l ı ş ı na dair örnek
verdik. Bu iş l eç, iki sayı nı n b öl ü mü nü nden kal an sayı yı sonuç ol arak döndü rü r.
Ş imdiye kadar b urada sı kça gördü ğ ü nü z diğ er veri tipi ise string ( karakter diz isi veya
karakter katarı )’ dir. String veri tipi U nic ode karakter tipl erinin b ir l istesini içerirl er ve
tek çif t tı rnak iş aretl eri arası nda yaz ı l ı rl ar.
C# K ont rol yap ıları v e s eç me iş lemleri
Bu derste C# dil indeki if adel er,tipl er ve değ iş kenl er anl atı l ac aktı r. C# dil inde kul l anı l an
seçme veya kontrol if adel erini öğ renec eksiniz .
Dersimizin hedefleri :
Ö nc eki dersl erimiz de, h er program b el irl i if adel eri sı rası yl a çal ı ş tı rı p b itiyordu. P rogram
içinde inputl ara veya program içinde yapı l an h esapl ara göre değ iş ik iş l eml er
yapı l mı yordu. Bu derste öğ rendikl erimiz de programl arı mı z ı n b el irl i ş artl ara göre değ iş ik
ş ekil l erde çal ı ş ması nı sağ l ayac aktı r. İ l k seçme if ademiz "if ". "if " kontrol yapı sı nı n 3
temel f ormu vardı r.
using System;
c l ass I f Sel ec t
{
pub l ic static void M ain()
{
string myI nput;
int myI nt;
el se
{
Consol e.W riteL ine("Y our numb er {0} is greater th an 30.", myI nt);
}
K od 1' de tü m program b oyunc a tek b ir değ iş keni kul l anı yoruz , "myI nt". K ul l anı c ı dan
etkil eş iml i ol arak veri al mak için önc e "L ü tf en b ir sayı giriniz :" il etisini konsul a
yaz dı rı yoruz . "Consol e.R eadl ine()" if adesi il e program kul l anı c ı dan b ir değ er girmesini
b ekl er. Bir rakam yaz ı l ı nc a ve enter tuş una b ası l ı nc a program yaz ı l an değ eri önc e string
tipinde ol an myI nput değ iş kenine atanı yor. String ol arak al ı nan veriyi program tamsayı
tipinde b ir değ iş ken ol arak kul l anmak istediğ i için "myI nput" tamsayı tipine
dönü ş tü rü l mel i. Bu dönü ş ü m için "I nt32.P arse(myI nput)" komutunu kul l andı k ( tip
dönü ş ü ml eri ve I nt32 gib i veri tipl eri il eriki dersl erde inc el enec ektir.) D ah a sonra,
dönü ş ü mü n sonuc u "myI nt" isiml i değ iş kene aktarı l ı yor.
A rtı k istediğ imiz tipte b ir veriye sah ib iz ve b unu "if " if adesi içinde iş l eyeb il iriz . "if " if ade
b l oğ unun il k f ormu ş u ş ekil dedir : if (mantı ksal if ade) { "mantı ksal if ade"nin doğ ru ol ası
durumunda yapı l ması gerekenl er }. Ö nc el ikl e "if " anah tar kel imesi il e b aş l amal ı yı z .
Sonrası parantez l er arası ndaki mantı ksal if ade. Bu mantı ksal if adenin doğ ru veya yanl ı ş
ol ması b ul unur. Biz programı mı z da kul l anı c ı dan al dı ğ ı mı z sayı nı n sı f ı rdan b ü yü k ol up
ol madı ğ ı nı kontrol ediyoruz ">0" il e. E ğ er sayı sı f ı rdan b ü yü kse, mantı ksal if adenin
sonuc u doğ rudur ve { } parantez l eri arası ndaki kod b l oğ u çal ı ş tı rı l ı r. E ğ er mantı ksal
if ade yanl ı ş b ir sonuç ü retirse { } arası ndaki kon b l oğ u çal ı ş tı rı l madan b l oktan sonraki
if adel ere geçer.
İ kinc i "if " if adesi asl ı nda b irinc isi il e aynı dı r, ikinc isi sadec e b l ok içinde değ il dir. E ğ er
b ool ean if ade doğ ru sonuç ü retirse, b u if adeden h emen sonraki çal ı ş ı r. Bool ena if adenin
yanl ı ş ol ması durumunda ise b u if adeden h emen sonraki if ade çal ı ş tı rı l madan b ir
sonraki if adeye geçil ir ve o if ade çal ı ş tı rı l ı r. Bu ş ekil deki "if " yapı sı nı , b ool ean if adenin
doğ ru ol ması nda sadec e b ir tane if ade çal ı ş tı rı l ac aksa yeterl idir. Buna karş ı n "if "
if adesinin sonuc una göre b irden f az l a if ade iş l eme konul ac aksa b l ok ol arak { }
parentez l eri arası nda yaz ı l ı r. Benim kiş isel önerim "if " den sonra çal ı ş tı rı l ac ak if ade
sayı sı na b akmadan, b u if ade(l eri) h er durumda b l ok ol arak yaz maktı r. İ l eride yeni
programı n okunması nda ve yeni iş l evl er ekl enmesinde siz e h atal ardan kaçmanı z a
yardı m eder.
Birçok z aman siz e eğ er/değ il se tü rü nde çal ı ş ac ak b ir "if " yapı sı gerekeb il ir. Üçü nc ü tip
"if " if adesi eğ er doğ ru değ er ü retirse ş unl arı yap, doğ ru değ il se "el se" anah tar
söz c ü ğ ü nden sonraki kodl arı çal ı ş tı r tü rü nde b ir yapı sı ol arak yaz ı l mal ı dı r.
Birden f az l a mantı ksal if adeyi iş l ememiz gerektiğ inde ise, if /el se if /el se tipinde b ir "if "
yapı sı nı kul l anmak gerekir. D ördü nc ü örneğ imiz de b u tip b ir if yapı sı nı göreb il irsiniz . Bu
tip yapı yine "if " ve b ool ean if adesi il e b aş l ar. Bool ean if ade doğ ru ise h emen al ttaki
b l oktaki kodl ar çal ı ş tı rı l ı r. Bunun yanı nda, b ool ean if adenin değ iş ik duruml arı na göre
"el se if " iç yapı sı kul l anı l ı r. "el se if " de aynı if gib i b ir b ool ean if adeyi al ı r ve sonuc u
doğ ru h emen sonraki b l oktaki kodl arı çal ı ş tı rı r.
Bool ean if adenin al ab il ec eğ i tü m ih timal l ere göre b u ş ekil de "el se if " if adel eri
sı ral anab il ir f akat en sonda b ir "el se" il e yukarı daki tü m ş artl arı n yanl ı ş ol ması
durumunda çal ı ş tı rı l ac ak kodl arı b el irl eriz . Bu dördü nc ü "if " yapı sı nda da yine sadec e b ir
tane if /el se b l ok yapı sı çal ı ş tı rı l ı r.
"sw itc h " yapı sı da "if /el se if /el se" yapı sı na çok b enz er.
using System;
b egin:
Consol e.W rite("P l ease enter a numb er b etw een 1 and 3: ");
myI nput = Consol e.R eadL ine();
myI nt = I nt32.P arse(myI nput);
dec ide:
def aul t:
Consol e.W riteL ine("Y our input {0} is inc orrec t.", myI nput);
goto dec ide;
}
K od 2' de b irkaç tane "sw itc h " yapı sı örneğ imiz var. "sw itc h " yapı sı yine "sw itc h " anah tar
kel imesi il e b aş l ar ve sı nanac ak değ iş keni parantez içinde b el irtiriz . Sw itc h yapı sı nı n
çal ı ş ması için ş u veri tipl erinden b ir tanesini kul l anmak gerekir : sb yte,sh ort,ush ort,int,
l ong, ul ong, c h ar, string, or enum ( enum dah a sonraki b ir derste iş l enec ektir.)
Birinc i örneğ imiz deki "sw itc h " yapı sı int tipinde b ir değ er al maktadı r. Tamsayı
değ iş kenimiz in al ab il ec eğ i değ erl ere göre değ iş ik iş l eml er yapab il iriz . "myI nt"
değ iş kenimiz in h erb ir ih timal ini değ erl endirirken "c ase" anah tar kel imesini, muh temel
değ erini ve iki nokta ü st ü ste ":" yapı sı nda b ir sı nama yapı yoruz . Ö rneğ imiz de, "c ase 1
:", "c ase 2: ", ve "c ase 3:" ş ekl inde yaz dı k. Sı nama sonuçl arı ndan uygun ol anı n h emen
al tı nda kod b l oku yer al ı r. Bu kod b l okundan sonra ise "b reak" veya "goto" if adel erini
kul l anmamı z gerekir.
İ sterseniz "def aul t" seçeneğ ini de "sw itc h " if adesi il e b irl ikte kul l anab il irsiniz . "def aul t"
if adesinin al tı ndaki kod b l oku, "def ul t"' tan önc eki "c ase"' l erin h içb iri sı namayı
geçemediğ i z aman çal ı ş ı r ve tü m "c ase"' l erden sonra gel ir.
Her "c ase" ' den sonra "b reak" if adesinin z orunl u ol duğ unu tekrar h atı rl atal ı m. "b reak"
if adesi "sw itc h " yapı sı ndan dı ş arı çı kmayı ve al ttaki kodl ara geçmemiz i sağ l ar. "def aul t"
anah tar kel imesinin kod b l okundan h emen sonra "b reak" koymak programc ı nı n isteğ ine
kal mı ş tı r. Sw itc h if adesinde iki tane dikkat edil mesi gereken h usus vardı r.
Birinc isi, f arkl ı duruml arı (c ase' l eri) ard arda aral arı na h iç kod yaz madan sı ral amaktı r.
A sl ı nda b urada yapı l an iş , değ iş kenimiz in b irden f az l a değ eri için tek b ir "c ase" kod
b l oku ol uş turmaktı r. Bir c ase ve h emen arkası na b aş ka b ir c ase yaz dı ğ ı mı z da program
otomatik ol arak b ir sonraki "c ase" ' e geçer. A ş ağ ı daki kodu inc el ediğ imiz de, "myI nt"
değ iş keni 1,2, veya 3 değ erl erinden h erh angi b irini al ı rsa kendi değ erini ekrana
yaz dı rı yoruz . D iğ er durumda ise değ iş kenimiz in değ erinin 1 ve 3 arası nda ol madı ğ ı nı
ekrana yaz dı rı yoruz .
K od 2' de yer al an ikinc i "sw itc h " yapı sı ise "goto" if adesinin nası l kul l anı l ac ağ ı nı
göstermek amac ı yl a yaz ı l mı ş tı r. "goto" , programı n b el irl i b ir kı smı nda yer al an, öz el
etiket (l ab el ) il e b el irtil miş kı smı na atl aması na ve oradan itib aren çal ı ş maya devam
etmesine yarar. P rogramı mı z da kul l anı c ı "c ontinue" yaz arsa "b egin" ol arak b el irl enmiş
etikete gider ve oradan çal ı ş maya devam eder. A sl ı nda b u ş ekil de "goto" kul l anmak
etkil i b ir döngü ol ur. E ğ er kul l anı c ı "end" yaz arsa program "b ye" yaz ar ve döngü den
programı mı z çı kar.
A çı kça görü l ü yor ki "goto" kel imesini kul l anmak b iz e programda b el irl i ş artl ar al tı nda
gü ç kaz andı rı r. Y ine de "goto" if adesini programda sı k b ir ş ekil de kul l anmak "sipagetti"
kod ol arak adl andı rı l an programl amaya yol açab il ir ki, b u tü r kodl ama programı h em
okurken h em de h atal arı ayı kl arken b ü yü k sorunl ara seb ep ol ab il ir.
C# ile T emel W ind ow s F ormları O lu ş t u rma
Bu yaz ı mı z da W indow s programl amanı n temel el emanl arı ndan ol an w indow s f orml arı nı n
nası l ol uş turul duğ unu ve nası l kul l anı l dı ğ ı nı görec eğ iz , w indow s f orml arı nı açı kl arken b asit
b ir dört iş l em yapan h esap makinası ol uş turac ağ ı z .W indow s f orml arı derken neyi
kastediyoruz ? Tex tb ox , l ab el , b utton gib i öneml i el emanl arı n h epsi b irer w indow s
f ormudur. Bu w indow s f orml arı na ul aş mak için System.W indow s.F orms isimal anı nı
kul l anı yoruz . V e tab i ki programı mı z ı n aktif b ir w indow s uygul aması ol arak çal ı ş ması için
de aş ağ ı daki isimal anl arı nı proj emiz e ekl iyoruz .
P rogramı mı z ı yaz maya b aş l amadan önc e programı mı z ı n kodl arı nı içerec ek b ir isim al anı
ol uş tural ı m. Ben b una CsHesapM akinasi adi verdim.(M akal eyi okurken kaynak kodu
inc el emeniz i tavsiye ederim) Siz istediğ iniz b aş ka b ir isim kul l anab il irsiniz .
D ah a önc eki makal el erimiz de b el irttiğ imiz gib i programı mı z ı n çal ı ş ması için derl eyic iye
programı n b aş l angı ç noktası nı b il dirmemiz gerekirdi.Bu b aş l angı ç noktası da genel de
main() f onksiyonu ol uyordu. K odumuz u öyl e ayarl ayac ağ ı z ki main() f onksiyonu ic ra
edil diğ inde çal ı ş tı rmak istediğ imiz w indow s f ormu ekranda görü nsü n. Bunun için main
içine aş ağ ı daki kodu yaz ı yoruz .
A ppl ic ation.R un(new F orm1()); // Y eni b ir F orm1 nesnesi ol uş turul arak uygul ama ol arak
b aş l atı l ı yor.
Ş u an için F orm1 h akkı nda en uf ak b ir b il giye sah ip değ il iz .P eki b u F orm1 nası l
ol uş turul ac ak. Y ukarı da da b ah settiğ imiz gib i F orm1 sı nı f ı ndan b ir nesne ol uş turmak için
System.W indow s.F orms isimal anı nı kul l anmal ı yı z . Bu yü z den b u isim al anı nı n al tı nda
b ul unan F orm sı nı f ı ndan yeni b ir F orm1 sı nı f ı tü retmemiz gerekec ek, b u tü retme iş l emi
aş ağ ı daki gib idir. F orm1 sı nı f ı nı tü rettikten sonra F orm1' içinde b ul unac ak el emanl arı
tanı ml ı yoruz .4 iş l emi yapmak için 4 b uton, iş l eme giren değ erl er için 2 tex tb ox ve 2 tane
de l ab el f ormu tanı ml ı yoruz .Tanı ml ama iş l emi aş ağ ı daki gib idir.
Ş imdi b u w indow s f ormunun ekrana nası l b ası l dı ğ ı nı inc el eyel im.M ain() iş l evi içinde yeni
b ir F orm1 nesnesi yaratı l dı ğ ı nda F orm1 nesnesine ait kuruc u iş l ev ol an F orm1() iş l evi
çağ rı l ı r.(K aynak kodu inc el eyin). F orm1() kuruc u iş l evinde ise I nitial iz eComponent(); adl ı
b ir f onksiyon çağ ı rı l arak F orm1 nesnesine ait ol an ü ye el emanl arl a (b utton,l ab el ,tex tb ox
vs) il gil i il k iş l eml er yapı l ı r.F rom1 açı l dı ğ ı z aman F orm1 içinde b ul unan el emanl arl a il igil i
yapmak istediğ imiz il k öz el l ikl eri I nitial iz eComponent() f onksiyonu içinde yapı yoruz .
private void I nitial iz eComponent()
{
// form1 içinde yer alacak elemanlar yaratılıyor(kaynak kodu inceleyin)
th is.name="F orm1"; //F orm1 nes nes inin kendis i için th is anah tar s ö z cü ğ ü nü
kullanıyoruz
th is.tex t = " H esa p M a k ina sı " ;
th is.Bac kCol or = System.D raw ing.Col or.F romA rgb (((System.Byte)(255)),
((System.Byte)(128)), ((System.Byte)(0)));
th is.Cl ientSiz e = new System.D raw ing.Siz e(400, 149 );
}
Ş imdi sı ra el emanl arl a il gil i ol ayl arı n b irb irl eri il e il iş kisine.M esel a b ir b uton f ormunun c l ic k
ol ayı nı n f orm taraf ı ndan yakal anab il mesi için aş ağ ı daki satı rl arı yaz mal ı yı z .
b uton4_ Cl ic k() iş l evinde, çal ı ş ma z amanı nda b ir nesnenin öz el l ikl erinin nası l
değ iş tiril diğ ini görü yoruz .b utton4 b öl me iş l emi yaptı ğ ı ndan isaret.Tex t="/"; yaz dı k. sonuc
adl ı tex tb ox f ormunun Tex t öz el l iğ i b ir string if adesi ol duğ u için iş l eml erimiz i yaptı ktan
sonra sonuc .tex t if adesine atama yapab il mek için System.Convert isimal anı nda b ul unan
ToString iş l evini kul l anarak if adeyi String tü rü ne dönü ş tü rü yoruz . A ynı ş ekil de String
ol arak al dı ğ ı mı z tü rl er için aritmetik iş l em yapab il mek için yine aynı isimal anı nda b ul unan
ToI nt32 iş l evi il e String tü rü nü int32 f ormatı na dönü ş tü rü yoruz . Bü tü n b u iş l eml eri 4
b utonumuz için yaptı ğ ı mı z da dört iş l em yapab il en b asit ve b ol b ol b ug içeren (unutmayı n
amac ı mı z sadec e f orml arı n kul l anı mı nı öğ renmek) b ir h esap makinamı z ol ac ak.
.N E T T eknoloj ilerine G iriş
G ü nü mü z de b il gisayar dü nyası nda internet ol maz sa ol maz derec ede öneml i b ir yer
edinmeye b aş l adı . A rtı k insanl ar ev ve iş yerl erinde kul l andı kl arı uygul amal arı na da
internet ü z erinden eriş ip kul l anmak istiyorl ar. Bu internetin getirdiğ i öz gü rl ü ğ ü n
kaçı nı l maz b ir sonuc udur.P eki yaz ı l ı m dü nyası b una h az ı rmı ydı ? G el iş tiril en h er programı
kol ayc a internet ormanı nda da çal ı ş tı rab il irmiydik? Bu sorul arı n c evapl arı b ir sene
önc esine kadar h ayı r, ol amaz veya ş u andaki sisteml er b u denl i öz gü rl ü ğ ü b iz e
sağ l amı yor tü rü ndendi.
M ic rosof t' un A SP ' si il e veya P HP il e yapı l an uygul amal ar tam ol arak insanl arı n istekl erine
c evap veremiyordu. Her ne kadar iyi ve gel iş miş w eb uygul amal arı nı b ir yere kadar
yapab il iyorduksa da b el irl i b ir noktadan sonra C+ + ,D el ph i veya V B il e gel iş tirdiğ imiz
modü l l eri w eb uygul amamı z a ekl eyerek sorunl arı mı z ı h al l etmeye çal ı ş yorduk. Tab i b u tü r
yönteml er programı n gel iş me sü resini uz atı yordu. Z amanı n giderek önem kaz andı ğ ı b ir
devirde h al iyl e programl arı mı z ı da h ı z l ı b ir ş ekil de gel iş tirmemiz gerekiyor(du). Hı z l ı
uygul ama gel iş tirme(R apid A ppl ic ation D evel opment- R A D ) gel eneksel programl ama
araçl arı yl a ve prgramc ı nı n yetenekl eriyl e çöz ü m b ul unac ak b ir mesel e değ il . A rtı k
programl ama dil l eri, dil l e b irl ikte gel en kü tü ph anel er ve b unl ar h akkı ndaki
dokü mantasyonl arı il e b irl ikte değ erl endiril iyor.
.N E T il e b irl ikte programc ı nı n h iz metine sunul an 3400' den f az l a sı nı f , modern anl amda
çok gü z el b ir gel iş tirme ortamı sunuyor. Bu sayede programl aml arı dah a h ı z l ı b ir ş ekil de
gel iş tirme imkanı na sah ip b ul unuyoruz . .N E T kul l anarak yaz dı ğ ı mı z A SP .N E T, W indow s
F orms veya mob il c ih az l ar için gel iş tirdiğ imiz b ir uygul amayı b irinden diğ erine
dönü ş tü rmek iş i çok kol ay b ir ş ekil de yapı l ab il iniyor. Bu sayede aynı anda h em w indow s
h em de w eb uygul amal arı gel iş tirmek çok h oş unuz a gidec ektir :-).
P eki b unc a h oş öz el l ikl eri b iz e sağ l ayan .N E T al t yapı sı nda program yaz arken h angi dil i
veya dil l eri kul l anmak z orundayı z ? Bu konuda M ic rosof t çok radikal b ir karar al arak
gel ec ek için h az ı rl anmı ş yeni al t yapı da Common L anguage R untime (CL R ) il e uyuml u h er
.N E T dil ini kul l anmamı z a ol anak sağ l ı yor. .N E T il e gel en SD K ' da C# ,V B.N E T ve Js.N E T
kul l anarak program yaz ab il iyoruz . D iğ er taraf tan 30' un ü z erinde programl ama dil iyl e
.N E T uygul aması gel iş tireb il irsiniz .
CL R denen ş ey tam ol arak nedir? .N E T al tyapı sı nda programl arı n çal ı ş ması nı kontrol eden
ve iş l etim sistemi il e programı mı z arası nda yer al an arab irimdir. N ormal de yaz dı ğ ı mı z
programl ar derl enirken makine dil ine çevril irdi ve program b u ş ekil de iş l etim sistemi il e
direkt b ağ l antı kurarak çal ı ş ı rdı . F akat pl atf orm b ağ ı msı z b ir gel iş tirme ve yü rü tme ortamı
istiyorsanı z ne ol ac ak? İ ş te tam b u anda CL R devreye girer ve .N E T programl arı nı f arkl ı
pl atf orml arda makineye ve iş l etim sistemine göre programı mı z ı çal ı ş tı rı r. N ormal de b ir
W indow s, L inux veya M A CO S kurul u sisteml er aynı programı n kodunu çal ı ş tı ramaz l ar. Bu
pl atf orml ar için programı n ayrı ayrı yaz ı l ı p, onl ara göre h az ı rl anmı ş derl eyic il erde
derl enmesi gerekir. D ü nyada çok sayı da yaygı n pl atf orm ol duğ unu dü ş ü nü rsek, b unl arı n
h erb iri için ayrı ayrı derl eme iş l emini tek b ir iş l etim sisteminde yapmamı z imkansı z
gib idir. Bu durumda çöz ü m , ortak b ir aradil kul l anmak ve h erb ir pl atf orm için b u aradil e
çevril miş programı n kodunu çal ı ş tı rac ak al tyapı l arı h az ı rl amaktı r.
Ş imdi ş u soruya sı ra gel di: "İ yi de .N E T h angi aradil i kul l anı yor?" Sorumuz un c evab ı
M SI L (M ic rosof t intermediate L anguage) .N E T pl atf omunda h angi dil i kul l anı rsak
kul l anal ı m yaz dı ğ ı mı z programı n kodu direkt ol arak makine dil ine değ il de M SI L ' e çevril ir.
Bu sadec e programı çal ı ş tı rdı ğ ı mı z sistemde kurul u ol an CL R çal ı ş ma anı nda M SI L
kodl arı nı çevirerek programı mı z ı çal ı ş tı rı r, çal ı ş ma anı nda derl eme iş l emini ise JI T
derl eyic il eri (Just in Time c ompil ers) ü stl enir.
G el ec ek makal emiz de JI T' l er, M SI L l anguage, CTS (Common Type System) gib i dah a
teknik konul arı detayl ı ol arak el e al mayı dü ş ü nü yorum. Siz l ere kol ayl ı kl ar dil erim.
. N E T ' in CL R , CT S v eJ I T d erleyic ileri
Ö nc eki yaz ı mı z da "dot N E T" pl atf ormu konusuna giriş yapmı ş tı k.(Y az ı yı okumak için
tı kl ayı n) Burada ise dah a detayl ı ol arak .N E T kavraml arı nı inc el eyec eğ iz ve .N E T' l e
Java' nı n karş ı l aş tı rı l dı ğ ı b ir testin sonuçl arı na yer verec eğ iz .
.N E T pl atf ormunda istediğ imiz programl ama dil i il e program yaz ab il ec eğ imiz i önc eki
yaz ı mı z da söyl emiş tik. Bunun için tek ş art, kul l andı ğ ı mı z dil in .N E T için yaz ı l mı ş ol an b ir
derl eyic isine ih tiyac ı mı z ol duğ udur. .N E T uyuml u programl ama dil i ol uş tururken b el irl i
standartl ara uyul ması gerekir. Bu standartl ar CL S (Common L anguage Spec if ic ations -
D il l erin ortak öz el l ikl eri) il e b el irl enmiş tir. CTS(Common Type System) ise veri tipl eri,
nesnel er, arayü z l er ve programl ama dil l erine ait öz el l ikl eri tanı ml ar ve CL S' in b ir parçası
ol arak karş ı mı z a çı kar. CL S' de tanı ml anmı ş kural l ara uymak ş artı il e istersek kendi
programl ama dil imiz i dah i gel iş tireb il iriz veya h erh angi b ir dil i .N E T pl atf ormunda
uygul ama gel iş tirmek ü z ere değ iş tireb il iriz .
CL R ,programl arı mı z ı değ iş ik ş ekil de derl eyeb il ir. V arsayı l an derl eme tü rü JI T(Just I N
TI M E - çal ı ş am anı nda derl eme) ' dı r. P rogram çal ı ş ı rken dah a önc e derl enmemiş b ir
parçası na gel inc e h emen o kı smı da derl er ve b unu h af ı z da c h ac h ' e koyar. Tekrar aynı
program parçası nı çal ı ş tı rmak gerekirse b urayı h af ı z adan çal ı ş tı rı r. E ğ er R A M ' imiz i yeteri
kadar b ü yü kse, programı n tamamı derl enmiş ve h af ı z ada depol anmı ş durumda ol ab il ir.
Bu durumda programı mı z çok h ı z l ı çal ı ş ı r.
CL R il e gel en ü çü nc ü derl eyic imiz P reJI T(ön JI T derl eyic isi) ise derl eme iş ini program
çal ı ş madan önc e yapar ve tü m makine kodl arı nı b ir yerde sakl ar. Ç al ı ş ma anı nda çok h ı z l ı
ol an programı mı z diğ er JI T derl eyic il eriyl e derl enmiş ol anl ara naz aran çok h ı z l ı çal ı ş ı r.
.N E T perf romans testi l inkindeki sonuçl ara göre : G enel de C# Java' dan 3.30 kat dah a
h ı z l ı . C# V isual C+ + 6 .0' dan ise 3.11 kat dah a h ı z l ı çal ı ş ı yor. Hatta V B.N E T kodu V B 6 .0' a
naz aran 46 .45 kat dah a h ı z l ı çal ı ş ı yor. :-)
Vis u al C# ile Programlamaya G iriş
V isual C# , V isual Studio ail esinin yeni ü yesidir, b u yeni dil c ve c + + temel l eri ü z erine
kurul ması na rağ men komponent temel l i programl ama tekniğ ini gel iş tirmek için b irtakı m
yeni öz el l ikl er ekl enmiş tir. C# dil inin sentaksı C ve C+ + programc ı l arı na çok tanı dı k
gel ec ektir. Bundan ş ü ph eniz ol ması n.
G enel A ç ı k la ma la r
Bu yaz ı da görec eğ imiz b asit uygul amada Q uic kSort al goritması nı kul l anarak nası l b asit b ir
C# proj esinin ol uş turul duğ unu görec eğ iz . Bu uygul amada b ir c # programı nda en sı k
kul l anı l an yapı l ardan ol an dosyaya ve c onsol e ekranı na okuma/yaz ma, f onksiyon
ol uş turma ve b asit diz il erin kul l anı mı açı kl anac aktı r.
Bu yaz ı kesinl ikl e C# dil inin tü m öz el l ikl erinin anl atı l dı ğ ı yaz ı değ il dir. Bu yaz ı C# dil ini
öğ renmek için siz l ere b ir b aş l angı ç noktası sunar.
Ö nerilen K a yna k la r
V isual Studio.N E T (Beta 2 veya sonrası ) örnek kaynak kodu derl emeniz için gerekl idir.
C/C+ + b il gisi siz e b u yaz ı yı anl amanı z da yardı mc ı ol ab il ir ama gerekl i değ il dir.
A dı m 1. P ro j eye B a ş la ma
V isual Studio il e program gel iş tirme organiz asyonu sol ution(çöz ü m) çal ı ş ma al anl arı
ü z erindendir. Sol ution dediğ imiz ortam b ir veya dah a f az l a proj eyi içereb il ir. Bu makal e
için tek b ir C# proj esi içeren b ir sol ution ol uş turac ağ ı z .
2. Sol dan(P roj ec t Types) V isual C# , sağ dan(Templ ates) ise Consol e A ppl ic ation
b utonl arı nı seçin.
3. P roj eniz in adı nı b el irl eyin ve proj eniz in h angi kl asörde sakl anac ağ ı nı b el irl eyin.Bu
kl asör V isual Studio taraf ı ndan otomatik ol uş turul ur.P roj e adı ol arak b en q uic ksort
yaz ı yorum.Siz istediğ iniz adı vereb il irsiniz .
V isual Studio.N E T içinde b ir V isual C# proj esi b ul unan b ir sol ution ol uş turdu. P roj e
assemb l yinf o.c s ve c l ass1.c s adl ı iki tane dosya içermektedir.
Bundan sonraki adı ml arda proj emiz i nası l derl eyec eğ imiz i ve b u iki dosya h akkı nda
detayl ı b il giyi öğ renec eğ iz .
A dı m 2. H ello , W o rld!
K usura b akmayı n ama gel eneğ i b oz madan il k def a C programl ama dil i il e yaz ı l mı ş ol an
"Hel l o, W orl d! " programı nı c # il e yaz ac ağ ı z . Bu b ir gel enektir ve h er yeni b ir dil i
öğ renmeye b aş l adı ğ ı nı z da b unu siz de görec eksiniz .
1. Sol ution E x pl orer ' da b ul unan ' c l ass1.c s' dosyası na çif t tı kl ayı n. Sol ution E x pl orer ' ı
göremiyorsanı z , view menü sü nü kul l anarak görü nü r h al e getireb il irsiniz .
2. Ş ab l onl a ol uş turul muş koda aş ağ ı da kı rmı z ı il e yaz ı l mı ş kı smı ekl eyin (c l ass1.c s).
using System;
3. D ikkat edin siz kodunuz u yaz dı kça V isual Studio siz e sı nı f l ar ve f onksiyon adl arı
h akkı nda b il gi verir, çü nkü .N E T F ramew ork tip b il gisini yayı nl amaktadı r.
U yg u la ma mı zı Derleyelim
1. P rogramı mı z da değ iş ikl ik yaptı ğ ı mı z a göre artı k Buil d menü sü nden Buil d ' ı seçerek
programı mı z ı derl eyeb il iriz .
2. Hata ve mesaj l ar en al tta b ul unan "O utput W indow " denil en penc erede görü nü r.
E ğ er h erh angi b ir h ata yoksa uygul amamı z ı D eb ug menü sü al tı nda b ul unan ' Start
w ith out D eb ugging' menü sü ne tı kl ayarak çal ı ş tı rab il iriz .
P ro g ra mı mı zı n Ç ı k tı sı
System.Consol e sı nı f ı na ait W riteL ine() f onksiyonu kendisine argü man ol arak gönderil en
diz geyi sonuna satı r sonu karakteri de ekl eyerek ekrana yaz ar.
Bu f onksiyon integer ve f l oating-point gib i diğ er veri tipl erini de argü man ol arak al ab il ir.
P rogram b el l eğ e yü kl endiğ inde programı n kontrol u M ain() f onksiyonuna gel ir.W riteL ine()
f onksiyonunu oraya yaz mamı z ı n seb eb i b udur.
A dı m 3. P ro g ra mı n Y a pı sı
Ş imdi b asit b ir Hel l o W orl d uygul aması gel iş tirmiş ol duk, ş imdi de b ir V isual C#
uygul aması nı n b asit c omponentl erini inc el eyel im.
K a yna k K o d Y o ru mla rı
// karakterl erinden sonra gel en ve satı rı n sonuna kadar ol an söz c ü kl er yorum satı rl arı dı r
ve C# derl eyic isi taraf ı ndan görü nmez l er. A ynı z amanda b irden f az l a satı ra yorum
ekl emek istiyorsak /* */ karakterl eri arası na yorum yaz arı z .
U sing K o mu tu
.N E T F ramew ork gel iş tiric il ere yü z l erc e yararl ı sı nı f l ar sunar. M esel a, Consol e sı nı f ı ,
c onsol e ekranı na ait girdi ve çı ktı l arı iş l er. Bu sı nı f l ar h iyerarş ik b ir ağ aç içinde organiz e
edil miş tir. A sl ı nda Consol e sı nı f ı nı n tam ismi System.Consol e ' dur. D iğ er sı nı f l ar ise
System.I O .F il eStream ve System.Col l ec tions.Q ueue. içindedirl er.
using komutu b iz e sı nı f ı n ismini namespac e(isim al anı ) kul l anmadan kul l anab il memiz i
sağ l ar.
A ş ağ ı da kı rmı z ı il e yaz ı l an yaz ı l ar using komutunun uygul aması nı n sonuc udur.
using System;
c l ass Cl ass1
{
static void M ain(string[] args)
{
System.Consol e.W riteL ine ("Hel l o, C# .N E T W orl d! ");
Consol e.W riteL ine ("Hel l o, C# .N E T W orl d! ");
}
}
S ı nı f B ildirimi
Sı nı f l ar h akkı nda çok derin b ir b il gi vermeyi dü ş ü nmü yorum.F akat b iz im örneğ imiz in
neden b ir parçası ol duğ unu açı kl amakta f ayda gördü m.
M a in( ) F o nk siyo nu
A dı m 4. C o nso le G iriş i
Ş imdi iş l eml erimiz e b ir Q uic kSrot uygul aması gel iş tirerek devam edel im. İ l k yapmamı z
gereken kul l anı c ya h edef ve kaynak dosyası nı n isiml erini sormak ol ac aktı r.
S o u rc e C o de M o dific a tio ns
C o nso le' da n O k u ma
Consol e sı nı f ı nı n R eadL ine() metodu kul l anı c ı ya b ir giriş ekranı sunar ve geriye
kul l anı c ı nı n girdiğ i diz geyi(string) geri döndü rü r.Bu metod b el l ek tah sisatı nı otomatik
ol arak kendi içinde yapmaktadı r ve .N E T garb age c ol l ec tor mekaniz ması sayesinde iade
etmeniz gereken h erh angi b ir al an yoktur.
P ro g ra m Ç ı k tı sı
P rogramı Deb u g | S ta rt W itho u t Deb u g g ing menü l erini kul l anarak çal ı ş tı rı n.
A ş ağ ı da programı mı z ı n son h al inin çı ktı sı nı görü yorsunuz .
A dı m 5. Dizilerin K u lla nı mı
P rogramı mı z sı ral ama yapmadan önc e giriş ten satı rl arı al arak b ir diz i içinde sakl aması
gerekir. Ş imdi .N E T temel sı nı f l arı ndan ol an A rrayL ist sı nı f ı nı inc el eyec eğ iz .
Consol e.W riteL ine ("Q uic kSort C# .N E T Sampl e A ppl ic ation\n");
A rrayL ist sı nı f ı na direkt ul aş ab il mek için System.Col l ec tions isimal anı nı proj emiz e using
komutuyl a ekl iyoruz . Bu sı nı f dinamik ol arak b ü yü yü p kü çü l eb il en nesne diz il eri için
kul l anı l ı r. Y eni b ir el eman ekl emek için b asit b ir ş ekil de A dd() metodunu kul l anab il irsiniz .
Bu diz iye ekl enen yeni el eman orij inal nesne için ref erans ol arak kul l anı l ı r, ve garb age
c ol l ec tor al an iadesi için h az ı r ol ac aktı r.
D iz inin var ol an b ir el emanı na ul aş ab il mek için, diz iye ait I tem() metoduna ul aş mak
istediğ imiz el emanı n sı ra(index ) numarası nı geçeb il iriz .K ı sac a [] operatörl erini kul l anarak
da istediğ imiz el emana I tem() metodunu kul l anmadan da ul aş ab il iriz .
Ş imdi isterseniz dosyadan okuma ve dosyaya yaz ma iş l eml erini gerçekl eş tirel im.
D osyadaki h er satı rı okuyup, b ir string diz isinin h er el emanı nı b ir satı r gel ec ek ş ekil de
ekl eyec eğ iz .Sonraki aş amada ise Q uic kSort al goritması nı kul l anarak diz iyi sı ral ı b ir
ş ekil de yaz ac ağ ı z .
namespac e M sdnA A
{
K a yna k Do sya da n O k u ma
D osyaya yaz arken diz inin sı ral anmı ş ol duğ unu varsaydı k ve öyl e devam ettik. A ynı
ş ekl ide F il eStream nesnesini ve StreamW riter sı nı f ı nı kul l anarak h edef dosyaya yaz ma
iş l emini yaptı k.
A dı m 7. F o nk siyo n Y a ra tma
Son aş amada diz iyi Q uic kSort al goritması il e sı ral ayan f onksiyonu yaz maya gel di. Bu
f onksiyonu uygul amamı z ı n ana sı nı f ı nı n içine koyac ağ ı z .
namespac e c # nedirc om
{
// D iz i el emanl arı nı b öl me
string sz Sw ap;
w h il e (nL ef t < = nR igh t)
{
Q u ic k S o rt( ) F o nk siyo nu
Y ukarı daki kodl arda yeni gördü ğ ü mü z metod CompareTo() metodudur. Bu metod iki
string if adesini karş ı l aş tı rı r.
Q u ic k S o rt U yg u la ma sı nı Ç a lı ş tı rma
Bu adı m uygul amamı z ı n son adı mı ol ac aktı r.Ş imdi programı mı z ı derl eyip çal ı ş tı rab il iriz .
P rogramı mı z ı n çal ı ş ması için b ir tex t dosyası ol uş turmamı z sı ral ama yapab il mek için
gerekec ek. E x e dosyası nı n b ul unduğ u diz ini tex t dosyası nı ol uş turup programı
çal ı ş tı ral ı m.
P ro g ra mı n Ç ı k tı sı
A ş ağ ı da programı mı z ı çal ı ş tı rdı ktan sonraki ekran çı ktı sı mevc uttur. Y ukarı daki ekranda
ise output.tx t dosyası nda meydana gel en değ iş ikl ikl eri göreb il irsiniz .
A dı m 8. Deb u g g er K u lla nma k
D eb ugger arac ı programı mı z ı n prob l eml erini çöz mek için öneml i ve gerekl i b ir araçtı r. İ yi
b ir b aş l angı ç yaptı ğ ı mı z a göre son aş amada programı mı z içinde nası l dol aş ac ağ ı mı z a ve
Q uic kW atc h ' ı nası l kul l anac ağ ı mı z a b akal ı m.
P rogram D eb ugger içinde çal ı ş ı rken eğ er b reakpoint ol an b ir noktaya gel inirse program
sonl andı rı l ı r ve deb ugger c ontrol ' ü b iz im el imiz e geçer. Herh angi b ir satı ra b reakpoint
koymak için il gil i satı ra sağ tı kl ayı p aş ağ ı daki gib i I nsert BreakP oint menü sü ne tı kl ayı n.
BreakP oint b ul unan satı rl ar kı rmı z ı il e gösteril ir. BreakP oint ' i kal dı rmak için il gil i satı ra
sağ tı kl ayı p R emove BreakP oint menü sü nü seçin.
P ro g ra m iç inde A dı m A dı m ilerlemek
P rogram b reakpoint ' in ol duğ u noktaya gel diğ inde, deb ugger programı n kontrol ü nü al ı r.
A ş ağ ı daki ş ekil de görü l dü ğ ü gib i sarı okl a programı n gel diğ i nokta gösteril ir.
K od içinde adı m adı m il erl emek için menü çub uğ undan D eb ug | Step O ver ' ı seçerek sarı
okun h areketini iz l eyin. D eb ug | Step I nto komutu gitmek istediğ imiz f onksiyona
gitmemiz i sağ l ar. A ş ağ ı da iki def a Step O ver menü sü nü seçtikten sonra kaynak
kodumuz un görü ntü sü mevc uttur.
D eb ugger ' ı n kontrol ü b iz de iken f arenin iml ec ini kaynak kodda istediğ imiz değ iş ken
ü z erine götü rerek değ iş kenin o anki değ erini öğ reneb il iriz .
A ynı z amanda b ir değ iş kene sağ tı kl ayarak Q uic kW atc h menü sü nü açab il irsiniz .
Q uic kW atc h il e değ iş ken h akkı nda dah a detayl ı b il gil er el de edeb il irsiniz . M esel a diz il er
h akkı nda aş ağ ı daki ş ekil de görü l dü ğ ü gib i b il gil er el de edil eb il ir.
Diğ er Deb u g g er A ra ç la rı
V isual Studio yukarı da b ah settiğ imiz araçl arı dı ş ı nda f arkl ı araçl arda b arı ndı rı r. M esel a
Cal l Stac k W iever arac ı il e o an h angi f onksiyonun çağ rı l dı ğ ı il e il gil i b il giyi el de
edeb il irsiniz . Bel l ekteki değ erl eri ve b ir prosesteki th read ' l eri de aynı anda
göreb il ec eğ imiz araçl ar mevc uttur.
S o nS ö z& S o nu ç
Bu yaz ı nı n amac ı siz l ere V isual Studio il e nası l b asit b ir uygul amanı n yapı l ac ağ ı nı adı m
adı m göstermekti. D iğ er .N E T ve C# kaynakl arı nı araş tı rmak için siz i
c esaretl endireb il diysek ne mutl u b iz e. Bu yaz ı yı b uraya kadar okuduğ unuz a göre en
az ı ndan ş u aş amada çal ı ş an b ir proj eniz var, istediğ iniz gib i ü z erinde değ iş ikl ikl er yapı p
sonuc u göreb il irsiniz .
C# ile Client / S erv er v e S oc ket p rogramlamaya giriş
ş imdi yaz ac ağ ı mı z programda kul l anı c ı W indow s uygul aması vası tası il e server ol an
programı mı z a b ağ l anac ak. F orm ü z erinde b ul unan b utona tı kl adı ğ ı mı z da yine f orm
ü z erinde b ul unan tex tb ox giriş indeki yaz ı yı server programı mı z al ac ak ve yaz ı da kaç
karakter ol duğ unu c l ient programı na gönderec ek.Cl ient program ise b ir mesaj kutusu il e
kul l anı c ı ya b il direc ek.Ö nc el ikl e c l ient ol an kul l anı c ı dan mesaj ı n gel diğ ini dü ş ü nü rek Server
programı mı z ı yaz al ı m. Server programı mı z ı yaz maya b aş l amadan önc e programda Soket
programl ama için kul l andı ğ ı mı z sı nı f l ara ve onl arı n ü ye f onksiyonl arı na kul l andı ğ ı mı z
kadarı yl a b ir göz atal ı m.
Tc pL istener sı nı f ı TCP protokol ü il e çal ı ş an servisl ere b ağ l anmamı z ı sağ l ar. M esel a HTTP
ve F TP protokol l eri TCP servisl erini kul l anı rl ar. Tc pL istener sı nı f ı nı n kuruc u f onksiyonunu 3
değ iş ik ş ekil de çağ ı rab il iriz .
1- )I P E ndP oint sı nı f ı nı kul l anarak I P numarası ve port numarası içeren b ir b il giyi kul l anma
yol u il e
2- )I P adresi ve port numarası nı geçerek çağ ı rma
3- )Sadec e P ort numarası il e çağ ı rma.Bu durumda varsayı l an ağ arayü z ü nü z TCP
servisl erini sağ l ayac aktı r.
Tc pL istener sı nı f ı na ait b u metod netw ork servisl erinden il gil i port' u dinl eyerek veril eri
al maya b aş l amamı z ı sağ l ar.
Tc pL istener sı nı f ı na ait b u metod veri transf eri için geri dönü ş değ eri ol arak b ir Soc ket
nesnesi döndü rü r.Bu geri dönen soc ket il gil i makinanı n I P adresi ve port numarası il e
kurul ur.(kuruc u iş l ev il e)
Soc ket s = new Soc ket(A ddressF amil y.I nterN etw ork,
Soc ketType.Stream,P rotoc ol Type.Tc p );
Soc ket sı nı f ı nı n b u kuruc u iş l evi parametre ol arak A dressF amil y dedigimiz adresl eme
semasi Soket tipi ve kul l anac agimiz protokol tipini al ir. Bu 3 paremtere de .N E T
F ramew ork c l ass kü tü ph anesinde E num sab itl eri ol arak taniml anmistir.
P rogramimiz da yaz digimiz "Soc ket I stemc iSoketi = Tc pD inl eyic isi.A c c eptSoc ket();" satiri
il e geri dönen soket nesnesinde b u 3 parametrede taniml anmistir.
Bu metod il e Soketin b agl anip b agl anmadigini geri dönen b ool degeri il e anl iyoruz .E ger
soket h edef kaynaga b agl iysa true degil se f al se degerine geri döner.
N etw orkStream sinif i kuruc ul arindan ol an "void N etw orkStream(Soc ket x );" f onksiyonu
il gil i kendisine gönderil en soket nesnesine ait datal ari N etw orkStream tü rü nden nesnede
tutar.b u programda kul l andigimiz soket tipi stream ol dugu için b u sinif i kul l aniyoruz .
N etw orkStream sinif i içinde isl em yapab il memeiz için ise System.I O isiamal aninda
b ul unan StreamR eader ve StreamW riter sinif l arini kul l anac agiz .
Tc p servisl erine b ağ l antı sağ l amak için Tc P Cl ient sı nı f ı kul l anı l ı r. I stemc i programı mı z da
Tc pCl ient sı nı f ı nı n < pub l ic Tc pCl ient(string, int);> kuruc u iş l evini kul l anı yoruz . İ l k
parametre b il gisayar adı ikinc isi ise port numarası dı r.
Bu metod il e b el irtil en port tan gel en veril er b ir N etw orkStream nesnesine aktarı l ı r.
G etStream metodunun geri dönü ş değ eri N etw orkStream ol duğ u için atama iş l emini
N etw orkStream tü rü nden b ir nesneye yapmamı z gerekir.
N ot: Y eş il il e yaz ı l an satı rl ar yorum satı rl arı dı r.Html f ormatı nda b ir al t satı ra inmiş ol an
yorum satı rl arı nı c opy&paste il e programı nı z a aktarı rken o satı rl arı tekrar tek satı r h al ine
getirmeyi unutmayı n, aksi h al de programı nı z derl enemez .
//Server.c s
//Soket b agl antimiz i yapiyoruz .Bunu Tc pL istener sinif inin A c c eptSoc ket metodu il e
yaptigimiz a dikkat edin
Soc ket I stemc iSoketi = Tc pD inl eyic isi.A c c eptSoc ket();
//I stemc iSoketi veril erini N etw orkStream sinif i tü rü nden nesneye aktariyoruz .
N etw orkStream A gA kimi = new N etw orkStream(I stemc iSoketi);
//Soketteki b il gil erl e isl em yapab il mek için StreamR eader ve StreamW riter
sinif l arini kul l aniyoruz
StreamW riter A kimY az ic i = new StreamW riter(A gA kimi);
StreamR eader A kimO kuyuc u = new StreamR eader(A gA kimi);
//StreamR eader il e String veri tipine aktarma isl emi önc eden b ir h ata ol ursa b unu
h andl e etmek gerek
try
{
string I stemc iString = A kimO kuyuc u.R eadL ine();
//A gA kimina, A kimY az ı nı il e I stemc iString inin uz unl uğ unu yaz ı yoruz
A kimY az ic i.W riteL ine(uz unl uk.ToString());
c atc h
{
Consol e.W riteL ine("Sunuc u kapatil iyor...");
return ;
}
}
}
I stemc iSoketi.Cl ose();
Consol e.W riteL ine("Sunuc u K apatil iyor...");
}
}
İ ş te b uda I stemc i programı mı z . Ö nc el ikl e ş unu b el irtiyimki aş ağ ı daki kodl arı n çoğ unu
V isual C# kendil iğ inden h az ı rl adı , o yü z den siz e Tavsiyem V isual C# kul l anmanı z .
Ö nc el ikl e aş ağ ı daki ş ekil de gördü ğ ü nü z f orm yapı sı nı b enz er b ir f orm h az ı rl ayı n.Sonra da
b uton_ c l ic k metodunu f orm_ kapatma metodunu ve using if adel erini ekl eyin. Y ada
z amanı nı z çoksa aş ağ ı daki kodl arı teker teker yaz ı n. (İ steyene kaynak kodu da
göndereb il irim)
//c l ient.c s
using System;
using System.N et.Soc kets;
using System.I O ;
using System.D raw ing;
using System.Col l ec tions;
using System.ComponentM odel ;
using System.W indow s.F orms;
using System.D ata;
pub l ic F orm1()
{
I nitial iz eComponent();
}
//F rom1 yü kl endiğ inde Tc pCl ient nesnesi ol uş turup A gA kı mı ndan(N etw orkStream) veril eri
okuyoruz
private void F orm1_ L oad(ob j ec t sender, System.E ventA rgs e)
{
try
{
I stemc i = new Tc pCl ient("l oc al h ost", 1234);
}
c atc h
{
Consol e.W riteL ine("Bagl anamadi");
return;
}
//Server programı nda yaptı kl arı mı z ı b urda da yapı yoruz .
A gA kimi = I stemc i.G etStream();
A kimO kuyuc u = new StreamR eader(A gA kimi);
A kimY az ic i = new StreamW riter(A gA kimi);
}
}
//K ul l anı c ı b utona h er tı kl adı ğ ı nda tex tb ox ' ta yaz ı yoksa uyarı veriyoruz
//Sonra A kimY az ic i vası tası il e A gA kı mı na veriyi gönderip sunuc udan gel en
//c evab ı A kimO kuyuc u il e al ı p M esaj l a kul l anı c ı ya gösteriyoruz
//Tab i ol ası h atal ara karş ı , Sunuc uya b ağ l anmada h ata ol uş tu mesaj ı veriyoruz .
try
{
if (tex tb ox .Tex t=="")
{
M essageBox .Sh ow ("L ü tf en b ir yaz i giriniz ","U yari");
tex tb ox .F oc us();
return ;
}
string yaz i;
A kimY az ic i.W riteL ine(tex tb ox .Tex t);
A kimY az ic i.F l ush ();
yaz i = A kimO kuyuc u.R eadL ine();
M essageBox .Sh ow (yaz i,"Sunuc udan M esaj var");
}
c atc h
{
M essageBox .Sh ow ("Sunuc uya b agl anmada h ata ol du...");
}
}
//TV e b ü tü n ol uş turduğ umuz nesnel eri f orm kapatı l dı ğ ı nda kapatı yoruz .
pub l ic void f orm1_ kapatma(ob j ec t o , Canc el E ventA rgs ec )
{
try
{
A kimY az ic i.Cl ose();
A kimO kuyuc u.Cl ose();
A gA kimi.Cl ose();
}
c atc h
{
M essageBox .Sh ow ("D ü z gü n kapatil amiyor");
}
}
A ş ağ ı daki server ve c l ient programl arı mı z ı n aynı anda çal ı ş tı kl arı sı rada al ı nmı ş ekran
görü ntü l eri mevc uttur.
Y az ı h akkı nda sorul arı nı z ı b ana sorab il irsiniz . K aynak kodl arı öz el b ir istek gel diğ inde
b uraya koyab il irim.
C#' t a T emel M et in D os yas ı İ ş lemleri
M etin dosyl arı nı ol uş turmak, yaz mak, içerikl erini okumak için System isimuz ayı nda
b ul unan Tex t al t uz ayı ndaki sı nı f l arı kul l anı yoruz . A ş ağ ı daki programı mı z da 3 tane
metodumuz var. Birinc isi, D osyayaY az () metin dosyası nı ol uş turup b u dosya ya b irkaç
ş ey yaz dı rı yor. Bu metod önc e StreamW riter sı nı f ı ndan dosya isiml i b ir ob j e ol uş turuyor.
D ah a sonra StreamW riter sı nı f ı nda b ul unan W riteL ine() metodu il e 2 satı r yaz ı yoruz
dosyamı z a. Son ol arak dosyamı z ı dosya.Cl ose() il e kapatı yoruz .
İ kinc i metodumuz , D osyadanO ku(), ise b ir metin dosyası nı n içeriğ ini ekrana yaz dı rı yor.
Bunun için önc e StreamR eader sı nı f ı na ait dosyaO ku nesnemiz i ol uş turuyoruz . Sonra
dosyamı z ı dosyaO ku=F il e.O penTex t(dosyaI smi); komutu il e açı yoruz . D osyamı z ı n il k
satı rı nda b ul unan yaz ı yı "yaz i" isiml i değ iş kenimiz e yaz i=dosyaO ku.R eadL ine(); il e
aktarı yoruz . Bundan sonra ise eğ er okuduğ umuz satı rda yaz ı varsa (yani dosyanı n sonu
değ il se) o satı rı ekrana yaz dı rı p b ir sonraki satı rı okuyoruz . O kuma ve ekrana yaz dı rma
iş l eml erini dosyanı n sonuna kadar (yada okuduğ umu satı rı n içeriğ inin nul l ol ana kadar )
devam ediyoruz . Son ol arak ise dosyaO ku.Cl ose() il e dosyamı z ı kapatı yoruz .
Üçü nc ü ve son f onksiyonumuz ise metin dosyamı z ı n sonuna b irş eyl er ekl eyen
D osyayaE kl e()' dir. Y ine StreamW riter sı nı f ı ndan dosya isimini verdğ imiz b ir nesne
ol uş turuyoruz . D osyamı z ı F il e.A ppenTex t() metodu il e açı yoruz ki b u metod sayesinde
dosyanı n sonuna istedğ iğ miz veriyi kol ayc a ekl eyeb il iriz . dosya.W riteL ine("Bu da en son
A ppend il e ekl ediğ imiz satı r..."); komutu il e tı rnakl ar arası nda metni dosyamı z ı n sonuna
ekl iyoruz . Her z amanki gib i açtı ğ ı mı z dosyayı iş imiz b itinc e h emen dosya.Cl ose(); il e
kapatı yoruz .
using System;
using System.I O ;
using System.Tex t;
c l ass Tex tF il e
{
pub l ic static void M ain(string[] args)
{
// M etin dosyamı z a b irş eyl er yaz an f onksiyon..
D osyayaY az ();
w h il e(yaz i! =nul l )
{
Consol e.W riteL ine(yaz i);
yaz i=dosyaO ku.R eadL ine();
}
}
C# D ilind e Yap ıland ırıc ılara A ş ırı Yüklenmes i
C# dil inde b ul unan ve nesne yönel iml i programl ama kavramı içinde yeral an gü z el b ir
öz el l iğ i yapı l andı rı c ı l ara aş ı rı yü kl enme konusunu b u yaz ı mı z da inc el eyel im. Baz en b ir
nesneyi ol uş tururken b u iş i b irden f arkl ı ş ekil l erde yapmak z orunda kal ı rı z .
Sı rası yl a, b irinc i yapı l andı rı c ı h iç b ir değ er al mı yor. İ kinc i yapı l andı rı c ı mı z iki tane
değ iş ken al ı yor. Bunl ardan ya s ve a di değ erl eridir. Üçü nc ü sü ise ya s, a di ve so ya di
parametrel erini al arak nesnemiz i ol uş turuyor. Son yapı l andı rı c ı mı z ise ya s, a di, so ya di
ve k u lla ndig iDil değ iş kenl eridir. İ l k ü ç yapı l andı rı c ı al ı nmayan ya s değ iş kenine 0
diğ erl erine nu ll değ erl eri atı yor.
Sı nı f ı mı z ı n b eş inc i ve son metodu ise b u sı nı f tan ü rettiğ imiz b ir nesnenin öz el l ikl erini
ekrana yaz dı rı yor. E ğ er nesnenin b ir öz el l iğ inin değ eri varsa onu yaz dı rı yor, yoksa b u
öz el l ik h akkı nda b ir mal umatı mı z yok gib isinden b ir uyarı yaz ı yor ekrana.
using System;
c l ass P rogramc i
{
int yasi;
string adi;
string soyadi;
string kul l andigiD il ;
th is.soyadi=nul l ;
th is.kul l andigiD il =nul l ;
}
}
C# İ s im u zayları ( names p ac e) Hakkınd a
Bu yaz ı mı z da C# dil indeki namespac e l er h akkı nda geniş b ir b il gi edinec eğ iz . Bil diğ iniz
gib i programl ama dil l erinde, programc ı l arı n iş l erini kol ayl aş tı rmak için b ir takı m h az ı r
kü tü ph anel er mevc uttur, b u kü tü ph anel erden b az ı l arı standart ol makl a b irl ikte b az ı l arı
programc ı l ar taraf ı ndan sonradan gel iş tirl miş ve kul l anı c l arı n h iz metine sunul muş tur.
M esel a M F C ve A TL gib i kü tü h anel erin kendil erine h as amaçl arı vardı r, M F C kü tü ph anesi
il e b ir takı m h az ı r C+ + sı nı f l arı na ul aş arak temel de z or ol an b ir takı m W indow s
pl atf ormuna öz gü iş l eml eri (f orms, dial og b ox vs.) yapab il iriz . Bu da M F C programc ı l arı na
çal ı ş ı r b ir uygul ama yapmak için dah a az z aman h arc atı r. Bu tü r kü tü ph anel er V isul Basic
te ve Java dil inde de vardı r. F akat b u dil l erin aksine C# dil i il e gel en h az ı r b ir takı m sı nı f
kü tü ph anel eri b ul unmamaktadı r, kı sac ası standart b ir C# kü tü ph anesi mevc ut değ il dir.
Bu demek değ il dir C# il e iş imiz dah a z or ol ac ak, asl ı nda dah a kol ay, .N E T F ramew ork
dediğ imiz al tyapı nı n b iz e veya diğ er programl ama dil l erini kul l anan programc ı l ara
sunduğ u b ir takı m temel tü rl er ve sı nı f l ar mevc uttur. Bü tü n b u sı nı f l arı ve tü rl eri b inary
dü z eyde iyi oı rganiz e edeb il mek için .N E T, namespac e kavramı nı sı kl ı kl a kul l anmaktadı r.
D emekki .N E T teki sı nı f kü tü ph anel eri b ir dil den b ağ ı msı z b ir yapı dadı r. M F C gib i sadec e
C+ + için yada b aş ka b ir dil için gel iş tiril memiş tir. Ç ok normal ol arak V isual Basic .N E T
kul l anı c ı sı il e C# kul l anı c ı sı aynı kü tü ph aneden f aydal anı rl ar.
[ C # ]
using System;
[ V B . N ET ]
I mports System
P ub l ic M odul e C# nedir
sub M ain()
Consol e.W riteL ine ("M erh ab a, b eni V B.N E T il e yaz dı l ar.")
E nd Sub
[ M a na g ed C + + ]
Y ukarı daki programl arda gördü ğ ü nü z gib i .N E T pl atf ormunu destekl eyen b ü tü n dil l er aynı
sı nı f ı kul l anarak ekrana yaz ı yaz dı rı yorl ar.Bu sı nı f System isimal anı içinde b ul unan
Consol e sı nı f ı na ait b ir f onksiyonl a gerçekl eş tiril mektedir.
N amespac e l eri kendi yaz dı ğ ı mı z kodl arı n organiz asyonu içinde kul l anab il iriz . Hem b öyl e
tü r isiml erinin karı ş ması nı da önl emiş ol uruz , z ira b ir tü r ismi yada sı nı f anc ak kendi
isimal anı içinde görü nü rl ü ğ e(visib il ity) sah iptir. M esel a System isimal anı nı ekl emeden
Consol e sı nı f ı nı kul l anamayı z . A ynı ş ekil de kendi yaz ı dğ ı mı z sı nı f l arı için de isimal anl arı
tanı ml ayarak, kaynak kodumuz u istediğ imiz b ir ş ekil de organiz e edeb il iriz . .N E T
F ramew ork sı nı f kü tü ph anesi h iyerarş ik b ir yapı ya sah ip ol duğ u için içeiçe isimal anl arı
tanı ml anmı ş tı r.
İ simal anl arı nı n kul l anı mı na b ir örnek verec ek ol ursak : D iyel imki 2D (iki b oyutl u)
graf ikl eri içeren b ir sı nı f kü tü ph anesi gel iş tiriyoruz , ve b u sı nı f kü tü ph anesi içinde "N okta"
adl ı b ir sı nı f ı mı z var. Bu isimal anı nı tanı ml amak için namespac e anah tar söc ü ğ ü nü n
aş ağ ı daki gib i b ir kul l anı mı vardı r.
namespac e 2D G raph
{
pub l ic c l ass N okta
{
......
}
}
Y ukarı daki N okta sı nı f ı nı kul l anab il mek için programı mı z a using deyimi il e isimal anı nı
ekl ememiz gerekir.Bu iş l em aş ağ ı daki gib i yapı l ı r.
using 2D G raph ;
namespac e 3D G raph
{
pub l ic c l ass N okta
{
......
}
}
Ş imdi 2D G rap ve 3D G raph sı nı f kü tü ph anel erinin h erikisini b irden kul l anmak isteyen b ir
programc ı using il e isimal nl arı nı ekl edil ten sonra N okta tü rü nden b ir nesne ol uş turmak
istediğ inde derl eyic i b unun 2D N okta mı yoksa 3D N okta mı ol duğ unu nerden b il ec ek.
Bunu çöz menin iki yol u vardı r. Birinc isi veri tipi b el irl erken aş ağ ı daki ş ekil deki b ir
kul l anı m terc ih edil ir.
V eri tü rl erinin b u ş ekil de b el irtil mesi pek terc ih edil meyen b ir yöntemdir. Ç ü nkü içiçe b ir
çok isimal anı nı n tanı ml andı ğ ı duruml arda kaynak kodumuz gereksiz yere isimal anl arı nı
yaz makl a uz amaktadı r. Bu h em okunab il irl iğ i b oz makta h emde programc ı ya z aman
kayb ettirmektedir.
using System;
using 3D G raph ;
using 2D G raph ;
İ kinc i b ir yöntem ise isimal anl arı nda b ul unan sı nı f l ar için takma isim (al ias)
kul l anmaktı r.Bu sayede isimal anl arı nı b ir kez ekl ediketen sonra o isim al anı nda b ul unan
sı nı f l ara doğ rudan eriş eb il iriz . Bir isim al anı ndaki sı nı f a takma ad aş ağ ı daki ş ekil de veril ir.
using System;
using 3D G raph ;
using 2D G raph ;
Y ukarı da mavi yaz ı il e b erl irtil en yerl erde takma isiml er tanı ml anmı ş tı r. Takma isiml er
anc ak ve anc ak tanı ml anadı kl arı b l ok içinde geçerl idir. Baş ka b l okl arda takma adl arı
kul l anmak derl eme z amanı nda h ataya yol açar.
Sonuç : İ simal anl arı c omponent(program parçac ı ğ ı ) yaz manı n en öneml i parçası dı r. Bir
"M erh ab a D ü nya" programı için isimal anı b el itmek siz de takdir edersiniz ki pek anl am
taş ı mamaktadı r. İ simal anl arı dah a çok kodumuz un tekrar kul l ı l ab il irl iğ ini artı rmak için
gel iş tiril en sı nı f kü tü ph anel erinde kul l anı l ı rl ar.
C# D ilind eki T emel Veri T ürleri
Her dil de ol duğ u gib i C# dil inde de önc eden tanı ml anmı ş ve dil l erin temel ini ol uş turan
veri sakl amak için kul l anı l an b ir takı m veri tipl eri vardı r. Bu makal emiz de C# dil inde
kul l anı l an veri tü rl erine değ inec eğ iz . C# dil inde temel ol arak veri tipl eri ikiye ayrı l ı r,
b unl ar önc eden tanı ml anmı ş veri tü rl eri ve kul l anı c ı taraf ı ndan tanı ml anmı ş veri tü rl eridir.
Ö nc eden tanı ml anmı ş veri tü rl eri de kendi arası nda ref erans tipi(ref erenc e types) ve
değ er tipi(val ue type) ol mak ü z ere ikiye ayrı l ı r. Bu detayl ı b il gil eri vermeden önc e veri
tipl eri nası l tanı ml anı r, veri tü rl erine nası l il k değ er veril ir ve veri tü rl erinin f aal iyet al anı
gib i temel konul ardan b ah setmek istiyorum.
Değ iş k en K a v ra mı
D eğ iş kenl er b ir programl ama dil inde temel veril eri sakl amak ve b u veril eri sonradan
kul l anmak için kul l anı l an b el l ek b öl gel eridir. C# dil inde genel ol arak b ir değ iş ken
tanı ml aması aş ağ ı daki gib i ol maktadı r.
V eritip i v eriadı ;
Ö rneğ in C# dil inde iş aretsiz ve 32 b itl ik veriyi temsil eden "a" isiml i b ir değ iş ken
aş ağ ı daki gib i tanı ml anı r.
int a ;
F akat yukarı daki tanı ml amada b ir sorun var. "a" adl ı değ iş kende h erh angi b ir değ er
tutul maktadı r.Bu yü z den C# derl eyic isi ş imdil ik "a" değ iş kenini kul l anmamı z a mü sade
etmez , çü nkü "a" da neyin ol duğ u h enü z b el l i değ il dir.Bu yü z den değ iş kenl ere =(eş ittir)
operatörü yl e il k değ erl er atarı z , ya da değ iş ken tanı ml aması ndan sonra, değ iş kene b ir
değ er atarı z . Bir değ iş kene b ir değ er atamak için iki f arkl ı yöntem kul l anı l ı r. A ş ağ ı da b u
iki yönteme ait örnek b ul unmaktadı r.
--------------------
int b ;
b = 10 ; /* değ iş ken tanımlandıktan s onra değ iş kene değ er atanıyor. İ ş lev s el olarak b u
iki kullanım açıs ından b ir fark yoktur. * /
--------------------
int a= 10 , b ;
b = 10 ; /* eğ er b ir s atırda b irden faz la değ iş eken tanımlamas ı yap mak is tiyors ak b u
yap ıyı kulanırız . B u durumda a v e b int tü rden değ iş kenlerdir denir. * /
Ö nemli N o t: C# dil inde b ir değ iş kene h erh angi b ir değ er atamadan onu kul l anmak
yasaktı r. Y ani derl eme iş l emi gerçekl eş mez , örneğ in aş ağ ı daki gib i b ir kul l anı m derl eme
z amanı nda h ata verec ektir. Bu yü z den eğ er b ir değ iş keni kul l anmak istiyorsak yukarı da
açı kl adı ğ ı mı z gib i değ iş kenl ere b ir değ er vermek z orundayı z . Bu kural önc eden
tanı ml anmı ş ref erans tipl eri için de değ er tipl eri için de geçerl idir.
int a ;
C ons ole. W riteL ine(a); //B u ifadeleri içeren b ir kod derlenemez .
Değ iş k enlerin F a a liyet A la nla rı ( S c o pe)
C# dil inde programı n genel akı ş ı açı l an ve kapanan parantez l er içerisinde yaz ı l ı r. Bu
açı l an ve kapanan parantez l er arası ndaki b öl geye b l ok denir. Tanı ml anan b ir değ iş kene,
anc ak tanı ml andı ğ ı b l ok içerisinde ul aş ı l ab il ir. Ö rneğ in aş ağ ı daki kı sa örnekte tanı ml anan
örnekte h er iki "a" değ iş keni b irb irinden b ağ ı msı z dı r ve b el l ekte ayrı b öl gel erde
sakl anı rl ar.
Y ukarı daki örnekte b irinc i ve ikinc i b l okta tanı ml anan "a" isiml i değ iş kenl er M ain b l oğ u
içinde geçersiz dir. Birinc i a değ iş keninin f aal iyet al anı 1.Bl ok ,ikinc i a değ iş kenin f aal iyet
al anı ise 2. Bl oktur. Bu durumda M ain() b l oğ unda Consol e.W riteL ine(a); gib i b ir if ade
h atal ı dı r, çü nkü M ain b l oğ u içinde tanı ml anan b ir a değ iş keni yoktur. U nutmamal ı yı z ki
dah a sonraki makal el erde detayl ı ol arak görec eğ imiz f or ve diğ er döngü l er de b irer b l ok
ol duğ u için b u b l okl arda tanı ml anan değ iş kenl er döngü b l oğ unun dı ş ı nda geçersiz
ol ac aktı r. D iğ er b ir öneml i nokta ise f aal iyet al anı devam eden b ir değ iş kenin b ir dah a
tanı ml anması nı n h ataya yol açması dı r. Ö rneğ in aş ağ ı daki gib i b ir durum derl eme
z amanı nda h ata verec ektir. Ç ü nkü b ir değ iş kenin f aal iyet al anı b itmeden aynı isiml i
değ iş ken tekrar tanı ml anı yor.
G ördü ğ ü nü z gib i M ain b l oğ unda tanı ml anan a değ iş keninin f aal iyet al anı açı l an b l okta
devam etmektedir.Bu yü z den yukarı daki gib i if adel er geçersidir.Üst seviyede açı l an
b l okl ar al t seviyedeki b l okl arı kapsadı ğ ı için, b irinc i tanı ml anan a değ iş keni sonradan
açı l an b l ok içinde h al a geçerl idir.
Y ukarı da anl atı l an duruma ters dü ş ü yor gib i görü nse de aş ağ ı daki gib i b ir kul l anı m son
derec e l egal b ir durumdur. Bu konuyu dah a sonraki makal el erimiz de detayl ı b ir ş ekil de
inc el eyec eğ iz .
Bu konu sı nı f l arl a il gil i b ir konu ol duğ u için detayl arı na girmeyec eğ iz ama ş imdil ik b öyl e
b ir kul l anı mı n geçerl i ol duğ unu b il meniz de f ayda var.
S a b itler
Bir program b oyunc a değ erinin değ iş meyec eğ ini dü ş ü ndü ğ ü mü z veril eri sab it veril er
ol arak tanı ml arı z . Sab it veril er tanı ml amak için tanı ml ama satı rı nda c onst anah tar
söz c ü ğ ü nü kul l anı rı z . c onst ol arak tanı ml anmı ş değ iş kenl erin en b ü yü k avantaj ı program
içinde sı kça kul l andı ğ ı mı z değ erl eri aniden değ iş tirmek gerektiğ inde görü l ü r.M esel a
matematiksel iş l eml er yapan b ir programda pi sayı sı nı c onst ol arak tanı ml ayı p istediğ imiz
z aman pi sayı sı nı değ iş tireb il iriz . Tab i b u iş l emi c onst değ il de normal b ir değ iş kenl e de
yapab il irdik, ama ş u da b ir gerçek ki çok uz un programl arda sab it ol ması nı istediğ imiz
değ iş keni yanl ı ş l ı kl a değ iş tireb il iriz . F akat c onst ol arak tanı ml adı ğ ı mı z b ir değ iş kenin
değ erini değ iş tirmeye çal ı ş tı ğ ı mı z da c # derl eyic isi derl eme aş aması nda h ata verec ektir.
Bu da göz den kaçan b az ı h ata duruml arı nı minimuma indirmek demektir. Sab it
if adel eriyl e il gil i b il memiz gereken 3 öneml i kural vardı r. Bunl ar ş unl ardı r :
1-) Sab itl er tanı ml andı kl arı nda değ erl eri atanmal adı r. İ l k değ er veril meyen değ iş kenl er
c onst yani sab it ol amaz l ar.
2-) Sab it if adel ere anc ak sab it if adel erl e il k değ er atanab il ir yani ş u ş ekil deki b ir kul l anı m
h atal ı dı r. c onst int = a + b ;
3-) Sab it if adel eri içsel tasarı m ol arak z aten statik ol dukl arı için, ayrı c a statik ol arak
b el irtmek h atal ı dı r ve kul l anı l amaz .(statik değ iş kenl er il eriki yaz ı l arda detayl ol arak
anl atı l ac aktı r.)
cons t doub le p i = 3 . 14 ; // doub le, kes irli s ayıları tutmak için tanımlanmış b ir v eri
tü rü dü r.
C# dil inde önc eden tanı ml anmı ş (c # dil inde varol an tipl er) veri tipl eri değ er tipl eri ve
ref erans tipl eri ol mak ü z ere ikiye ayrı l ı r. Bu iki veri tipi arası ndaki f arkı çok iyi kavramak
gerekir. D ah a önc e dediğ imiz gib i değ iş kenl er b el l ekte b ul unan veril erdir. A sl ı nda b ir
değ iş keni kul l anı rken o değ iş kenin b el l ekte b ul unduğ u adresteki veriye ul aş ı yoruz . D eğ er
tipl eri değ iş kenin değ erini direkt b el l ek b öl gesinden al ı rl ar. R ef erans tipl eri ise b aş ka b ir
nesneye ref erans ol arak kul l anı l ı rl ar. Y ani ref erans tipl eri asl ı nda b ir çeş it b el l ek b öl gesi
ol an h eap al anı nda yaratı l an veri tü rl erinin (b unl ara kı sac a nesne de diyeb il iriz )
adresl erini sakl arl ar. D eğ er tipl eri yaratı l dı kl arı nda stac k dediğ imiz b el l ek b öl gel erinde
ol uş turul url ar, ref erans tipl eri ise kul l anı mı b iraz dah a sı nı rl ı ol an h eap dediğ imiz b el l ek
b öl gesinde sakl anı rl ar. C ve C+ + dil l erine aş ina ol an arkadaş l arı n da tah min ettiğ i gib i
gösteric i kavramı il e ref erans veri tipl eri arası nda çok f az l a f ark yoktur. F akat C# dil inde
kul l anı c ı nı n direkt ol arak kul l anab il ec eğ i b ir gösteric i veri tü rü tanı ml amak yoktur. Bunun
yerine b az ı değ iş kenl er değ er tip b az ı l arı ise ref erans tipi ol arak iş l em görü rl er. P eki
b unl ar nel erdir? Temel veri tipl eri ol an int,doub l e, f l oat ve yapı nesnel eri gib i veri tü rl eri
değ er tipl er, h erh angi b ir sı nı f tü rü ise ref erans tü rü dü r. İ ki değ er tipi nesnesini b irb irine
eş itl erken değ iş kenl erde sakl anan değ erl er kopyal anarak eş itl enir ve b u durumda iki yeni
b ağ ı msı z nesne el de edil miş ol ur yani b irinin değ erini değ iş tirmek diğ erini etkil emez ,
anc ak iki ref erans tipini b irb irl erine eş itl ediğ imiz de b u nesnel erde tutul an veril er
kopyal anmaz , iş l em yapı l an nesnel erin h eap b öl gesindeki adresl eridir, yani iki nesne de
asl ı nda h eap b el l ek b öl gesinde aynı adresi gösterec ekl eri için b irinde yapı l an değ iş ikl ik
diğ erini de etkil eyec ektir. R ef erans tipl erini tanı ml arken h erh angi b ir adresi
göstermediğ ini b el irtmek için nul l değ ere atanı rl ar.(M esel a: y = nul l ;)
.N E T b ir yaz ı l ı m gel iş tirme pl atf ormudur. A sl ı nda b ü tü n veri tipl eri CTS dediğ imiz b ir
sistem il e tanı nı rl ar. Y ani C# dil inde ki veri tü rl eri asl ı nda CTS ' deki veri tü rl eri için b irer
arayü z gib idirl er. CTS sayesinde .N E T pl atf ormu için gel iş tiril en b ü tü n dil l er aynı veri
tipl erini kul l anı rl ar, tek değ iş en veri tü rl eni tanı ml ama yöntemi ve sentaksı dı r. Bu yü z den
b iz im C# dil i il e tanı ml ayac ağ ı mı z h er veri tipinin CTS ' de b ir karş ı l ı ğ ı mevc uttur. Bu veri
tü rl eri ve CTS karş ı l ı kl arı aş ağ ı da tab l ol ar h al inde mevc uttur.
C# dil inde tanı ml adı ğ ı mı z b ü tü n b asit veri tipl eri asl ı nda CTS ' de b ul unan b ir yapı
nesnesidir.C# dil indeki önc eden tanı ml anmı ş temel veri tipl eri on b eş tanedir. Bunl ardan
on ü çü değ er tipi ikisi de değ er tipidir.
A ş ağ ı da temel val ue tipl erin C# dil indeki adı , CTS karş ı l ı ğ ı , açı kl aması ve kul l anı m aral ı ğ ı
b ul unmaktadı r.
C #
ta k i C T S K a rş ı lı ğ ı A ç ı k la ma M a x v e M in a ra lı k ya da değ eri
a dı
8 b it iş aretl i
sb yte System.Byte -128 : 127
tamsayı
16 b it iş aretl i
sh ort System.I nt16 -32.7 6 8 : 32.7 6 7
tamsayı
32 b it iş aretl i
int System.I nt32 -2.147 .483.6 48 : 2.147 .483.6 47
tamsayı
6 4 b it iş aretl i -9 .223.37 2.036 .854.7 7 5.808 : -
l ong System.I nt6 4
tamsayı 9 .223.37 2.036 .854.7 7 5.807
8 b it iş aretsiz
b yte System.Byte 0 : 255
tamsayı
16 b it iş aretsiz
ush ort System.U I nt16 0 : 6 5.535
tamsayı
32 b it iş aretsiz
uint System.U I nt32 0 : 4.29 4.9 6 7 .29 5
tamsayı
6 4 b it iş aretsiz
ul ong System.U I nt6 4 0 : 18.446 .7 44.07 3.7 09 .551.6 15
tamsayı
32 b it tek kayan
f l oat System.Singl e + yada - 1,5*10-4 5
:+ ya da - 3,4*103 8
sayı
6 4 b it çif t kayan
doub l e Sytem.D oub l e + yada - 5*10-3 2 4
:+ ya da - 1,7 *103 0 8
sayı
dec imal System.D ec imal 128 b it ondal ı kl ı + yada - 1,5*10-2 8
:+ ya da - 7 ,9 *102 8
sayı
b ool System.Bool ean true ya da f al se
K arakterl eri
c h ar System.Ch ar 16 U nic ode karakterl eri
temsil eder
Ş imdi tab l oda veril en veri tü rl eri il e il gil i tanı ml amal ara örnekl er verel im :
float fl = 3 . 14 f ;
decimal d = 6 5 .2 5 M ;
b ool b = fals e ;
C# dil inde önc eden tanı ml anmı ş iki tane ref erans tipi vardı r. Bunl ar string ve ob j ec t
tü rl eridir. O b j ec t tü rü C# dil inde b ü tü n tü rl erin tü rediğ i b ir sı nı f yapı sı dı r. K ul l anı c ı
taraf ı ndan sonradan tanı ml anac ak b ü tü n veri tipl eri de asl ı nda O b j ec t tü rü nden tü remiş
ol ac aktı r. Bu da ob j ec t tü rü nden b ir nesneye h erh angi b ir veri tü rü nden nesneyi
atayab il ec eğ imiz anl amı na gel ir. Ç ü nkü C# dil inde b ü tü n nesnel er b ir ob j ec t' dir. ob j ec t
' l er öz el l iş tiril erek f arkl ı amaçl ar için kul l anı l ı r. Herh angi b ir nesneyi ob j ec t tü rü il e
eş l eş tirme kavramı b ox ing ol arak adl andı rı l ı r. Box ing ve b unun tersi iş l emi ol an unb ox ing
kavraml arı nı dah a sonraki makal el erimiz de detayl ı ol arak inc el eyec eğ iz .
D iğ er b ir ref erans tipi ise string tü rü dü r. C ve C+ + gib i dil l erde string iş l eml eri
yapab il mek için karakter diz il eri tanı ml anı r ve b unl ar string ol arak iş l eme al ı nı rl ar anc ak
C# dil inde karakter diz il eri tanı ml amak yerine string adı il e yeni b ir tü rü mevc uttur.
String veri tü rü b irtakı m yararl ı iş l er dah a kol ay b ir ş ekil de yapı l maktadı r. M esel a aş ağ ı da
iki string' in + operatörü yl e arka arkaya nası l ekl endiğ i gösteril mektedir. + operatörü
b urada string sı nı f ı için yü kl enmiş tir(overl oad). O verl oading kavramı b aş l ı b aş ı na b ir
makal e konusu ol duğ u için b urada değ inmeyec eğ im.
B ir dilin s entaks ı açıs ından ö z el anlamlar ifade eden karakterleri kullanmak is tiyors ak
b unları \ (es cap e) ifades iyle b elirtmek g erekir. M es ela b ir diz in b ilg is ini içeren b ir s tring
nes nes ini aş ağ ıdaki g ib i tanımlarız .
s tring yol = " C : \\docs \\x x x \\" ; // B u tü r kullanıma es cap e s eq uence kullanımı denir.
E s cap e s eq uence ' leri kullanmak yerine s tring içinde g ö rü nen ifadenin aynıs ı b elirtmek
için s tring ifades inin ö nü ne @ iş areti kullanılır. M es ela ;
Y ukarı da C# dil indeki temel ref erans veri tü rl eri tab l o h al inde gösteril miş tir.
Hemen h emen h er prof esyonel uygul amada gördü ğ ü mü z R egistry' ye yaz ma ve ordan
okuma iş l eml erinin nası l yapı l dı ğ ı nı b asit b ir uygul ama il e anl atac ağ ı z . D ü ş ü nü nki b ir
uygul ama gel iş tirdik ve uygul ama h er çal ı ş tı ğ ı nda kul l anı c ı yı sel aml amak istiyoruz ve
uygul amayı kaçı nc ı def a çal ı ş tı rdı ğ ı nı söyl emek istiyoruz ona. Bunun b ir çok yol u ol ması na
rağ men en gü z el ve en gü venil ir yol u il gil i b il gil eri W indow s un registry dediğ imiz
b öl gesinde tutmaktı r. registry dediğ imiz yerl er ol masaydı pek al a b u iş i dosyaya yaz ma
ve okumayl a da yapab il irdik. R egsitery b öl gesini okuma ve yaz ma amaçl ı .N E T f ramew ork
sı nı f kü tü ph anal erinden f aydal anac ağ ı z . Bu sı nı f l ar M ic rosf t.W in32 isimal anı nı n al tı nda
b ul unmaktadı r. Bu sı nı f l arı n en çok kul l anı l an metodl arı nı ve öz el l ikl erini anl atmaya
b aş l amadan önc e programı z ı n yapı sı nı kı sac a anl atayı m.
Bir c onsol e uygul aması ol uş turac ağ ı z . P rogram il k çal ı ş tı ğ ı nda b iz e b undan sonraki
açı l ı ş l arı nda b iz i sel aml aması için adı mı z ı sorac ak.D ah a sonra programı çal ı ş tı rdı ğ ı mı z da
"Hoş gel din Sef er. P rogramı 3. def a çal ı ş tı rı yorsunuz ." diyec ek. P rogramı n kaç def a
çal ı ş tı ğ ı nı anl amak için ise program il k açı l dı ğ ı nda registry b öl gesine "1" değ erini
yaz ac ağ ı z ve programı n h er çal ı ş tı ğ ı nda o değ eri b ir artı rac ağ ı z . Böyl ec e programı n kaç
def a çal ı ş tı ğ ı nı öğ renmiş ol ac ağ ı z . Tab i eğ er W indow s un < regedit> arac ı yl a dah a
önc eden uğ raş tı ysanı z b iz im programl ama yol uyl a değ iş tirdiğ imiz değ erl eri kendi
el l eriniz l e gidip değ iş tireb il irsiniz . D emek istediğ im b urda ş if re ve kul l anı c ı adı gib i b az ı
kiş iye öz el b il gil erin sakl anması pek gü venl i değ il dir.
E ğ er ş u ana kadar registry h akkı nda b ir b il giniz yoksa Start->R un ' menusune gel ip
regedit yaz arak registry h akkı nda b iraz b il gi edineb il irsiniz . Bu programl a rastgel e
değ erl er sil erseniz b az ı programl arı nı z z arar göreb il ec eğ i için tavsiyem h er h angi b ir sil me
iş l emi yapmayan ve sadec e nel er ol up
b ittiğ ine b akı n.
Ş imdi C# ı n b ü yü k b ir kol ayl ı k sağ l adı ğ ı registry yaz ma ve okuma için gel iş tiril miş
R egistryK ey sı nı f ı nı n iş l evl erini görel im.
Bil diğ iniz gib i w indow sun register yapı sı ağ aç ş ekl indeki kl asörl ere b enz er. Her yeni
anah tar al tı nda b ir al t anah tar açab il diğ imiz gib i anah tarl ar al tı nda yeni "string" yada "int"
gib i değ erl er ol uş turup programl a il gil i istediğ imiz değ erl eri sakl ayab il iriz . Bu ise
kl asörl erde ol uş turduğ umuz dosyal ara b enz er. D ah a önc ede dediğ imiz gib i b uraya regedit
l e kol ayc a ul aş ab il diğ imiz için gü venl ik amaçl ı b il gil eri (ş if re vs) veya programı mı z l a il gil i
kritik b il gil eri(serial numb er vs) b urada sakl amamamı z gerekir. Biz b u programdaki
b il gil erimiz i HK E Y _ L O CA L _ M A CHI N E \Sof tw are al tı nda c snedir isiml i b ir al t anah tar
ol uş turarak kaydedec eğ iz .
G eriye R egistryK ey tü rü nden b ir nesne dödü ren b u f onksiyon yeni b ir al t anah tar
ol uş turur yada var ol an b ir anah tarı okumak için açar.F onksiyonun prototipi aş ağ ı daki
gib idir. U nutmayı n b u metodu kul l anab il mek için il gil i kul l anı c ı nı n register b öl gesine
eriş im h akkı nı n ol ması gerekir. A ksi h al de Sec urityE x c eption h atası ol uş ur.
Bu metod iki ş ekil de kul l anı l ab il ir, overl oad edil miş iki metod aş ağ ı daki gib idir.
pub l ic R egistryK ey O penSub K ey(string);//Bu metod anah tar okumak amc ı yl a kul l anı l ı r ve
geriye R egisteryK ey döndü rü r.
pub l ic R egistryK ey O penSub K ey(string,b ool );//Bu metod il k metod il e aynı dı r f akat eğ er
açı l ac ak anah tara yaz mada yapac aksak ikinc i parametreyi true ol arak girmemiz gerekir.
V arsayal ı n ol arak R eadO nl y açı l ı r.
Bu metod iki ş ekil de kul l anı l ab il ir, overl oad edil miş iki metod aş ağ ı daki gib idir.
pub l ic void D el etSub K ey(string);//P arametre ol arak gönderil en al t anah tarı sil er.
pub l ic void D el etSub K ey(string,b ool );//P arametre ol arak gönderil en al t anah tarı
sil er.İ kinc i parametre ise b el irtil en al t anah tarı n ol maması durumunda
"A rgumentN ul l E x c eption" h atası nı n yakal nı p yakal anmayac ağ ı nı gösterir.E ğ er true ise b u
h ata yakal anı r, f al se ise h erh angi b irş ey ol maz .
Bu metod iki b el irtil en anah tardaki b ü tü n anah tarl arı sil er.Bir dosyayı sil diğ inide içindeki
tü m dosyal arı sil diğ iniz gib i.P rototipi aş ağ ı daki gib idir.
pub l ic void D el etSub K eyTree(string);
İ ki ş ekil de kul l anı l ab il ir.P arametre ol arak b el irtil en değ eri anah tardan sil er.İ kinc i
parametre ise D el eteSub K ey() metodunda ol duğ u gib i h ata yakal anı p yakal anmayac ağ ı nı
b el irtir.
:: F l ush () M etodu ::
R egistry ' de yaptı ğ ı mı z değ iş ikl ikl eri diske kaydetmek için b u metodun çağ rı l ması gerekir.
Be metod geriye döndü rdü ğ ü string diz isine il gil i anah tardaki al t anah tar isiml erini
dol durur.P rototipi aş ağ ı daki gib idir.
İ l gil i anah tardaki değ erin içeriğ ini ob j ec t tü rü ol arak geri dönderir.İ ki ş ekil de kul l anı l ab il ir.
P arametrik yapı sı aş ağ ı daki gib idir.
:: N ame Ö z el l iğ i ::
Tab an anah tardan itib aren(mesel a HK E Y _ L O CA L _ M A CHI N E ) il gil i anah tarı n tam yol unu
verir.
:: V al ueCount Ö z el l iğ i ::
Ş imdi yaz ı mı z ı n b aş ı nda b ah settiğ imiz örnek uygul amamı z a göz atal ı m.A ş ağ ı da b ul unan
kaynak kodda satı r aral arı na siz e yardı mc ı ol ac ak yoruml ar ekl edim.
//registry.c s
using System;
using System.W in32
//R egistryK ey sı nı f ı nı kaynakkodda direkt kul l anab il mek için b u isimal anı nı ekl edik.
c l ass CsR eg
{
pub l ic static void M ain()
{
R egistryK ey register;
register = R egistry.L oc al M ac h ine.O penSub K ey(@ "Sof tw are\c snedir",true);
//HK E Y _ L O CA L _ M A CHI N E /Sof tw are/c snedir anah tarı nı ol uş turup anah tara yaz ma
modunda açı yoruz .
Bu makal ede kavram ol arak en çok karı ş tı rı l an ve anl aş ı l ması diğ er konul ara göre z or
ol an A ssemb l y kavramı nı ve V isual Studio il e b irl ikte gel en G A CU TI L ve I L D A SM gib i
öneml i araçl arı inc el eyec egiz .
A semb ly N edir?
Hemen il k b aş ta b el irtel im ki b u makal ede b ah sedec eğ imiz A ssemb l y' nin al t seviye b ir
programl ama dil i ol an A ssemb l y il e yakı ndan uz aktan h içb ir al akası yoktur. Sadec e b ir
isim b enz erl iğ i vardı r. .N E T pl atf ormunda yaz dı ğ ı mı z kodl ar sonuc unda ol uş turduğ umuz
b ü tü n .ex e uz antı l ı dosyal ara ve .dl l uz antı l ı dosyal ara genel ol arak A ssemb l y
denil mektedir. P roj emiz e ait derl enmiş kodl ar ve metadata dediğ imiz b ir takı m
öz nitel eyic i kodl ar A ssemb l y' l er içerisinde b ul unur. A ssemb l y' l erin kab ac a öz el l ikl eri
aş ağ ı daki gib i sı ral anab il ir.
1-) A ssemb l y' l erde metadata denil en veril er, A ssemb l y' deki tü r b il gil eri ve b aş ka
kaynakl arl a ol an b ağ l antı l ar sakl anı r.
2-) A ssemb l y' de(dl l yada ex e) kendil erine ait versiyon b il gisi tutul ur. Hatı rl arsanı z kl asik
dl l ve ex e tipi dosyal arda versiyon b il gisi sakl anmadı ğ ı için çeş itl i uyumsuz l ukl ar
yaş anab il mekteydi. M esel a f arkl ı iki f irmanı n h az ı rl adı ğ ı dl l ' l er aynı isiml i ol duğ unda
sonradan register edil en dl l h al ih az ı rda b ul unan dl l ' in ü z erinde yaz ı l dı ğ ı için sistemde
b ul unan b az ı uygul amal arda sorun çı kı yordu. D l l ' l er b u tü r sorunl ara yol açtı ğ ı için D L L
Hel l (D l l c eh ennemi) kavramı ortaya çı kmı ş tı . A sl ı nda CO M dl l ' l eri il e b u sorun b ir neb z e
ortadan kal kmı ş sa da ası l çöz ü m A ssemb l y' l er il e gel miş tir.
3-) A ssemb l y' l erde versiyon b il gisi sakl andı ğ ı için b ir uygul ama içerisinde f arkl ı
versiyonl ara sah ip A ssemb l y' l eri kul l anab il iriz .
4-) P rogram kurma iş l emi, A ssemb l y ' ye il iş kin dosyayı direkt kopyal ayarak yapı l ab il ir.
E ski sistemde D L L ' l erin register edil mesi gerekiyordu.
A ssemb l y' l erin en öneml i öz el l ikl erinden b irisi de A pplic a tio n Do ma in dediğ imiz
kavramdı r. A ppl ic ation D omain sayesinde b ir proses içinde b irden f az l a b irb irinden
b ağ ı msı z çal ı ş an A ssemb l y ' yi çal ı ş tı rma imkanı na kavuş uruz . Bu konuya açı kl ayı c ı b ir
örnek ol ması açı sı ndan aş ağ ı daki örneğ i inc el eyeb il irsiniz .
Bu örnekte iki tane Consol e uygul aması yapac ağ ı z . Bu iki uygul amaya ait çal ı ş ı r
durumdaki dosyal ara artı k A ssemb l y diyeb il irsiniz . A ş ağ ı daki il k örnekte M ain iş l evi
içerisinde ekrana b ir yaz ı yaz dı rı yoruz .
//assemb l y1.c s
using System;
namespac e assemb l y1
{
c l ass c snedir1
{
Bu programı notepad ' da yaz ı p derl edikten sonra komut satı rı nda "c sc assemb l y1.c s"
yaz ı p assmb l y1.ex e dosyası nı ol uş turun. A ynı kl asör içine ş imdi aş ağ ı daki assemb l y2.c s
dosyası nı ol uş turun ve derl eyerek assemb l y2.ex e ' nin ol uş ması nı sağ l ayı n.
//assemb l y2.c s
using System;
namespac e assemb l y2
{
c l ass c snedir2
{
Y ukarı da da b ah settiğ im gib i A ppl ic ation D omain sayesinde b ir uygul ama içerisine değ iş ik
assemb l y' l er yü kl eneb il ir ve çal ı ş tı rı l ab il ir. A ppl ic ation D omian kavramı nı System isim
al anı nda b ul unan A ppD omain sı nı f ı temsil eder. Y eni b ir A ppl ic ation D omain' i ol uş turmak
için A ppD omain sı nı f ı nı n overl oad (aş ı rı yü kl enmiş )edil miş CreateD omain statik ü ye
f onksiyonl arı kul l anı l ı r. A ppD omain sı nı f ı nı n E x ec uteA ssemb l y f onksiyonuyl a dı ş arı dan
yeni b ir A ssemb l y yü kl enir ve o satı rdan itib aren yü kl enen assemb l y çal ı ş tı rı l ı r.
(Y ukarı daki örnekte iki A ssemb l y' nin de aynı kl asörde ol ması na dikkat edin.)
A ssemb l y h akkı nda b u geniş giriş b il gisini verdikten sonra A ssemb l y' nin f iz iksel
yapı sı ndan b ah sedel im b iraz . Bir A ssemb l y b el gesinde A ssemb l y metadata, tü r(type)
metadata, kaynakl ar ve I L (I ntermadiate L anguage) kodu b ul unur. Bü tü n b u yapı l ar b ir
A ssemb l y dosyası nda b ul unab il ec eğ i gib i A ssemb l y metadata' l ar sayesinde dı ş arı daki
kaynakl ara ref erans da veril eb il ir. A ssemb l y' l erin en öneml i yapı sı M anif est dediğ imiz
parçası dı r. M anif est assemb l y metadata' l ar b ul unur. P eki nedir b u A ssemb l y
metadata' l ar? Bir A semb l y adı , versiyonu gib i kiml ik b il gil eri, il gil i A ssemb l y il e il gil i ol an
diğ er dosyal ar, b aş ka A ssemb l y' l ere ol an ref eransl ar gib i b il gil erin tamamı na A ssemb l y
metadata denir. İ ş te b u b il gil erin ol uş turduğ u kü meye M a nifest denil mektedir.
A ssemb l y' l erin M anif est b öl ü mü nde b ul unan el emanl ar temel ol arak aş ağ ı daki tab l oda
veril miş tir.
Ö zellik A nla mı
A ssemb l yCompany A ssemb l y' nin f irma b il gisi
A ssemb l yCopyrigh t Copyrigh t b il gisi
A ssemb l yCul ture İ l gil i A ssemb l y' ye ait kü l tü r
b il gisi(A l manya,İ ngil tere,Tü rkiye
vs..)
A ssemb l yD el aySign G ec ikmel i imz anı n ol up
ol mayac ağ ı (True ya da F al se)
A ssemb l yD esc ription A ssemb l y il e il gil i kı sa açı kl ama
A ssemb l yF il eV ersion W in32 sistemindeki dosya
versiyonu
A ssemb l yI nf ormational V ersion CL R taraf ı ndan kul l anı l mayan ve
okunab il irl iğ i yü ksek ol an
versiyon b il gisi
A ssemb l yK eyF il e A ssemb l y' nin kayı t edil mesi için
gereken anah tarı n b ul unduğ u
dosya
A ssemb l yK eyN ame K ayı t için gereken anah tar
söz c ü k
A ssemb l yP roduc t Ürü n adı
A ssemb l yTitl e A ssemb l y' nin adı
A ssemb l yTrademark Trademark b il gisi
A ssemb l yV ersion String ş ekl indeki V ersion
numarası
B u t a b lo M S D N k it a p lığ ın d a n a lın m ış t ır
A ssemb l y' l er private ve sh ared ol mak ü z ere ikiye ayrı l ı r. Bunl arı detayl ı ol arak açı kl amaya
b aş l amadan önc e A ssemb l y' l eri görü ntü l emek için kul l anı l an I L D A SM .ex e arac ı nı
inc el eyel im. I L D A SM .ex e M SI L kodu içeren assemb l y dosyal arı nı okur ve kul l anı ş l ı b ir
arayü z il e kul l anı c ı ya sunar. I L D A SM .ex e programı nı çal ı ş tı rmak için komut satı rı na
I L D A SM .ex e yaz mamı z yeterl idir. A çı l ac ak penc ereden F il e->O pen menü sü nü kul l anarak
görü ntü l emek istediğ iniz A ssemb l y dosyası nı seçin.(A ş ağ ı da gördü ğ ü nü z ekran
görü ntü l eri A ssemb l y2.ex e' nin görü ntü l eridir.) Bir assemb l y' deki tü rl er, sı nı f l ar,
f onksiyonl ar çeş itl i semb ol l erl e temsil edil miş tir. Hangi semb ol l erin ne anl ama gel diğ ini
M SD N kitapl ı ğ ı ndan b ul ab il irsiniz .
Ş imdi de açı l ac ak penc ereden M ain b öl ü mü ne tı kl ayı n, ve aş ağ ı daki görü ntü yü el de edin.
Buradaki b ü tü n kodl ar I L kodudur.
Y ukarı da b ah settiğ imiz gib i A ssemb l y' l er private ve sh ared ol mak ü z ere ikiye ayrı l ı r.
N ormal ol arak gel iş tiril en A ssemb l y' l er private A ssemb l y ol arak adl andı rı l ı r. Bu tü r
assemb l y' l er uygul ama il e aynı diz inde ya da al t diz inl erde b ul unur. V ersiyon ve isim
uyuş maz l ı ğ ı sorunu b u tü r assemb l y' l erde ol mamaktadı r. Sh ared assemb l y' l er ise dah a
çok b ü yü k proj el erde mesel a b ir proj enin b ir f irmaya ait f arkl ı of isl erinde gerçekl eş tiril diğ i
duruml arda kul l anı l ı r. Bu durumda assemb l y' l erin uyması gereken b az ı kural l ar vardı r.
Bunl ardan en öneml isi strong name dediğ imiz tekil b ir isme sah ip ol ması dı r. Bu sayede
sh ared assemb l y' l er tekil ol duğ u için b ir sistemde gl ob al dü z eyde iş l em görü rl er. Y ani
f arkl ı f arkl ı uygul amal ardan aynı anda sh ared assemb l y' l ere ul aş ı l ab il ir. Ş imdi sh ared
assemb l y kavramı nı b iraz açal ı m.
S ha red A ssemb ly
Ş imdi adı m adı m b ir sh ared assemb l y ol uş turmayı görel im. Bunun için ikinc i yöntemi
kul l anac ağ ı m. Baş l angı ç ol arak gac util .ex e programı h akkı nda b il gi vermek istiyorum.
G ac util (gl ob al assemb l y c ac h e util ity) programı .N E T il e b irl ikte gel ir. A ssemb l y c ac h e' ye
yeni assemb l y yü kl emek varol an assemb l y' l eri l istel emek ve sil mek için kul l anı l ı r. K omut
satı rı ndan aş ağ ı daki parametrel erl e b u programı çal ı ş tı rab il iriz .
* gac util /l ---> G A C ' da b ul unan b ü tü n assemb l y' l eri l istel er.
* gac util /i assemb l ydl l ---> assemb l ydl l adl ı sh ared assemb l y' yi G A C ' a yü kl er.
* gac util /u assemb l ydl l ---> assemb l ydl l adl ı sh ared assemb l y G A C ' dan sil er.
İ l k adı m ol arak b ü tü n sh ared assemb l y' l ere strong name dediğ imiz b ir isim vermel iyiz .
G A C ' da b ul unan b ü tü n assemb l y' l erin f arkl ı b ir adı vardı r. CO M teknol oj isindeki gl ob al l y
uniq ue identif ier(G U I D ) ' e b enz eteb il iriz b u isiml eri. P eki b u strong name ' l eri nası l
ol uş turac ağ ı z ? Bu iş için yine .N E T il e b irl ikte gel en sn. exe adl ı arac ı kul l anac ağ ı z . sn
programı aş ağ ı daki gib i kul l anı l arak b ir tekil isim ol uş turul ur ve a na hta r. snk adl ı
dosyaya yaz ı l ı r.
sn -k a na h t a r . snk
anah tar.snk dosyası nı ol uş turduktan sonra b u anah tar ismi proj emiz deki A ssemb l yI nf o.c s
dosyası ndaki manif eset b öl ü mü ne ekl iyoruz . Y ani A ssemb l yK eyF il e öz el l iğ ini anah tar.snk
ol arak değ iş tiriyoruz . Sonuç ol arak A ssemb l yI nf o.c s dosyası aş ağ ı daki gib i ol ac aktı r.
...............
[assemb l y A ssemb l yD el aySign(f al se)]
[assemb l y A ssemb l yK eyF il e("../../anah tar.snk")]
[assemb l y A ssemb l yK eyN ame("")]
...............
Bu iş l eml eri yaptı ktan sonra proj eyi "Buil d" edip ol uş an A ssemb l y dosyası nı gac util .ex e
yardı mı yl a G A C ' a ekl iyoruz . Bu iş l emi komut satı rı ndan aş ağ ı daki gib i yapmal ı yı z .
Bu iş l emi yaptı ktan sonra sh ared ol an b u assemb l y' ye istediğ imiz .N E T proj esinden
ul aş ab il iriz . Tab iproj ec t->A dd ref erenc e menü sü nden sh ared assemb l y' ye ref erans
verdikten sonra yapab il iriz b unu. Sh ared assemb l y ol duğ u için yeni b ir proj ede b u
assemb l y kul l andı ğ ı mı z da l okal b ir kopyası ol uş turul maz dol ayı sı yl a G A C ü z erinden
eriş il ir.
K a yna k la r
Bir uygul amanı n içindeki kaynakl ar nel er ol ab il ir; resiml er, mü z ikl er ve yaz ı l ar(string). Bu
makal ede b u tü r kaynakl arı n, h aric i ol arak programı mı z a nası l ekl enec eğ ini öğ renec eğ iz .
D erl enmiş b ir program içerisinde b ir yaz ı yı değ iş tirmek çok z ordur. Bu yü z den sonradan
değ iş me ih timal i b ul unan kaynakl arı yönetmek için .N E T pl atf ormu b iz im için b ü yü k
kol ayl ı kl ar sağ l amı ş tı r. Baz ı duruml arda da programı mı z ı n f arkl ı dil l erdeki versiyonl arı
ol ab il ir. Bu durumda h er dil için b ir string kaynak dosyası (resourc e f il e) h az ı rl amamı z
yetec ektir.
Bu makal ede, .N E T il e b irl ikte gel en ve kaynak dosyal arı ol uş turmada kul l anı l an
resg en. exe adl ı programı , System.R esourc es isimal anı nda b ul unan R eso u rc eW riter
isiml i sı nı f ı , ve b u ol uş turul an kaynak dosyal arı kul l anmak için yine System.R esourc es
isimal anı nda b ul unan R eso u rc eM a na g er adl ı sı nı f l arı nı n kul l anı mı nı görec eğ iz . V e tab iki
b unl arı anl atı rken b asit b ir uygul ama ü z erinden anl atac ağ ı m.
Y ukarı da da b ah settiğ im gib i kaynak dosyal arda resim ve yaz ı l ar b ul unab il ir.İ l k adı mda
b asit b ir .tx t dosyası na istediğ imiz yaz ı l arı al t al ta yaz al ı m. R esgen.ex e yardı mı yl a b u tx t
dosyası ndan .N E T pl atf ormu için öz el b ir kaynak dosyası ol uş turac ağ ı z . Y al nı z dikkat
etmemiz gereken nokta ş u : b u ş ekil de h az ı rl anac ak b ir kaynak dosyası na resiml eri
ekl eyemiyoruz . E ğ er kaynakl arı mı z sadec e yaz ı l ar ise b u yöntemi kul l anı yoruz . E ğ er
kaynak ol arak resim ekl emek istiyorsak b iraz dan anl atac ağ ı m R esourc eW riter sı nı f ı nı
kul l anarak b asit b ir program yaz ac ağ ı z . Ş imdi aş ağ ı daki teriml er.tx t dosyası nı ol uş turun.
P ointer = G österic i
F unc tion = F onksiyon
A rray = D iz i
Templ ate = Ş ab l on
yaz il ar.tx t
Ş imdi resgen.ex e yardı mı yl a yaz il ar.tx t den yaz il ar.resourc es adl ı kaynak dosyayı
ol uş tural ı m. resgen.ex e yi çal ı ş tı rmak için Start-> P rograms -> M ic rosf t V isual
Studio.N E T -> V isual Studio.N E T Tool s -> V isual Studio.N E T Command P rompt yol unu
kul l anab il irsiniz .
K onsol ekranı na
r e sg e n y a z i l a r . t x t
yaz arak yaz il ar.resourc es dosyası nı n ol uş ması nı sağ l ayan. yaz il ar.resourc es dosyası nı b u
ş ekil de kul l anab il ec eğ imiz gib i X M L f ormatı nda b ir kaynak dosyası da ol uş turab il iriz .
Bunun içinde konsol ekranı na aş ağ ı daki komutu yaz ı n.
r e sg e n y a z i l a r . r e so u r c e s y a z i l a r . r e sx
K aynak dosyal arı nı n nası l kul l anı l dı ğ ı na geçmeden önc e resiml erin de ekl eneb il ec eğ i b ir
kaynak dosyası h az ı rl ayan b ir program yaz al ı m. Bu programda yukarı da da dediğ im gib i
System.R esourc es isimal anı al tı nda b ul unan R esourc eW riter sı nı f ı nı kul l anac ağ ı z . Bunun
için aş ağ ı daki programı yaz ı yorum.
using System;
using System.D raw ing;
using System.R esourc es;
c l ass Cl ass1
{
static void M ain(string[] args)
{
R esourc eW riter resw = new R esourc eW riter("yaz il ar2.resourc es");
I mage resim = I mage.F romF il e("l ogo.gif ");
Biraz programı açı kl amakta f ayda var. V isual Studio.N E T ' de yeni b ir Consol e U ygul aması
açı n. R esiml erl e iş yapab il mek için dah a doğ rusu I mage sı nı f ı nı kul l anab il mek için
System.D raw ing isimal anı nı ekl ememiz gerekir. Bunun için P roj ec t->A dd R ef erenc e
menü sü nü kul l anı p System.D raw ing.dl l i için proj emiz e ref erans verel im. K aynak dosyayı
ol uş turmak için ise System.R esourc es isimal anı nda b ul unan R esourc eW riter sı nı f ı nı
kul l anı yoruz . P rogramı mı z ı n b aş ı nda yeni b ir R esourc eW riter nesnesi ol uş turuyoruz .
V arsayı l an yapı c ı iş l evine ise ol uş turac ağ ı mı z kaynak dosyası nı n ismini veriyoruz . D ah a
sonra kaynak dosyası na ekl eyec eğ imiz b ir resim dosyası ndan I mage tü rü nden b ir nesne
tanı ml ı yoruz . Y ine aynı ş ekil de I mage sı nı f ı nı n yapı c ı iş l evine resim dosyası nı n adı nı
gönderiyoruz . D osyanı n çal ı ş an programl a aynı kl asör içinde ol ması na dikkat edin. A ksi
h al de F il eN otF oundE x c eption h atası al ı rı z . D ah a sonra b ir f or döngü sü yardı mı yl a 4 def a
kul l anı c ı dan kaynak için anah tar ve değ er giril mesini istiyoruz . K aynak dosyası na
kaynakl arı ekl emek için R esourc eW riter sı nı f ı nı n overl oad edil miş iki ü ye iş l evini
kul l anı yoruz . Bu iki ü ye iş l evinin prototipi aş ağ ı daki gib idir.
pub l ic void A ddR esourc e(string, ob j ec t); // b u f onksiyonu kaynağ a I mage nesnesini
ekl emek için kul l anı yoruz .
pub l ic void A ddR esourc e(string, string); // b u f onksiyonu ise iki string anah tar-değ er
ikil isini kaynak dosyası na girmek için kul l anı yoruz .
Son ol arak Cl ose iş l evi il e h af ı z ada b ul unan b il gil er yaz il ar.resourc e dosyası na yaz ı l ı r. Bu
iş l evi kul l anmadı ğ ı mı z da b il gil er dosyaya kaydedil meyec ektir.
Bu ş ekil de ol uş turduğ umuz kaynak dosyası nı n resgen.ex e il e ol uş turduğ umuz dan tek
f arkl ı kaynak dosyası na b ir resim b il gisinin b inary ol arak yerl eş tiril mesidir. K aynak
dosyası ol uş turmanı n iki yöntemini gördü kten sonra ş imdi b u kaynak dosyal arı b ir
uygul amada nası l kul l anac ağ ı mı z ı görel im. Bu amaçl a yeni b ir W indow s U ygul aması
b aş l atal ı m. A mac ı mı z b ir pic tureb ox yardı mı yl a kaynak dosyadaki b inary resim b il gil erini
göstermek ve yaz ı l arı da b ir l ab el kontrol u ü z erinde göstermek. Ö nc el ikl e V isual
Studio.N E T ' de b ul unan sol ution ex pl orer penc eresinden proj emiz e h az ı rl adı ğ ı mı z kaynak
dosyası nı ekl ememiz gerekir. Bunun için sol ution ex pl orer' daki proj emiz e sağ tı kl ayı p
A dd->A dd E x isting I tem ' dan yaz il ar2.resourc e adl ı kaynak dosyası nı seçel im. Bu
yönteml e kaynak dosyası proj emiz e E mb ed R esourc e ol arak ekl enec ektir. P roperties
penc eresindeki Buil d A c tion öz el l iğ ini kul l anarak b u ayarı değ iş tireb il iriz . K aynak dosyası nı
ekl edikten sonra aş ağ ı daki gib i b ir f orm penc eresi tasarl ayı n. F orm ü z erine b ir pic tureb ox
ve 4 tane l ab el kontrol u ekl eyin.
F ormumuz u tasarl adı ktan sonra F orm1 ' in l oad metodunu aş ağ ı daki gib i dü z enl eyin.
Y ukarı daki metotda f orm1 yü kl endiğ inde R esourc eM anager yardı mı yl a kaynak dosyadaki
b il gil eri ,f orm ü z erindeki kontrol l ere yerl eş tiriyoruz . Bu kodun çal ı ş ab il mesi için
System.R ef l ec tion(A ssemb l y sı nı f ı için) ve System.R esourc es(R esourc eM anager sı nı f ı için)
isimal anl arı nı n proj eye using il e ekl enmesi gerekir. İ l k ol arak o an ü z erinde çal ı ş ı l an
assemb l y için b ir R esourc eM anager nesnesi ol uş turuyoruz . Y eni b ir R esourc eM anager
nesnesi ol uş tururken R esourc eM anager ' in yapı c ı iş l evine kaynak dosyanı n proj edeki
görec el i yol unu ve o an ü z erinde çal ı ş tı ğ ı mı z A ssemb l y nesnesini geçiyoruz . Benim
ol uş turduğ um proj enin ismi w inA ppR es ol duğ u için 1. parametre "w inA ppres.yaz il ar2"
ol mal ı dı r. (D ikkat edin 1. parametrede kaynak dosyası nı n uz antı sı ol an .resourc e ekini
yaz madı k ). 2. parametreye ise A ssemb l y(System.R ef l ec tion) sı nı f ı nı n statik ü ye iş l evi
ol an G etE x ec utingA ssemb l y il e dönen A ssemb l y nesnesini geçiyoruz . K aynak
dosyası ndaki veril eri f ormun ü z erindeki kontrol l ere yerl eş tirirken R esourc eM anager
sı nı f ı nı n iki ayrı ü ye iş l evini kul l anı yoruz . Bunl ardan G etO b j ec t iş l evi il e pic tureb ox ' a
kaynaktaki resmi aktarı yoruz . G etO b j ec t iş l evinin parametresi kaynak dosyası ndaki
resime ait verinin anah tar adı nı geçiyoruz . Hatı rl arsanı z kaynak dosyayı ol uş turuken
resim için "Csl ogo" anah tarı nı kul l anmı ş tı k. G etO b j ec t il e geriye dönen nesne ob j ec t
tü rü nden ol duğ u için resim b il gisini pic tureb ox ' a yerl eş tireb il mek için
(I mage)rsm.G etO b j ec t("Csl ogo") if adesiyl e tü r dönü ş ü mü yapı yoruz . G etString iş l evi il e
de kaynak dosyası ndaki yaz ı l arı al ı yoruz . Bu iş l evden geriye dönen değ er parametre
ol arak veril en anah tara ait string değ eri ol duğ u için l ab el kontrol l erinin tex t öz el l iğ ine
atayab il iriz .
P rogramı derl edikten sonra aş ağ ı daki ekran görü ntü sü nü el de etmel isiniz .
N ot : E ğ er kaynak dosyası nı resgen.ex e il e X M L f ormatı nda h az ı rl asaydı k yukarı daki
iş l eml erin aynı sı yine geçerl i ol ac aktı . Benim tavsiyem kaynak dosyal arı nı X M L f ormatı nda
h az ı rl amanı z yönü ndedir. Hem V isual Studio.N E T ortamı nda kaynak dosyayı dah a rah at
dü z enl eyeb il irsiniz h em de X M L f ormatı ndaki dosyaya istediğ iniz ortaml ardan rah atl ı kl a
ul aş ab il irsiniz .
C#' d a A rrayL is t S ınıf ının K u llanımı
P rograml arı n çoğ unda b irden f az l a aynı tipte değ iş kenl ere ih tiyaç duyarı z . Bu sorunun
çöz ü mü ol arak b irçok dil de kul l anı l an veri yapı l arı ,diz il erdir. Bil diğ imiz kl asik diz il erin
programl ama teknikl erine getirdikl eri kol ayl ı kl arı n dı ş ı nda b irtakı m kı sı tl amal arı da vardı r.
Bu makal ede kl asik diz il erde sı k sı k karş ı l aş tı ğ ı mı z çeş itl i sorunl arı ve b u sorunl arı nası l
çöz eb il ec eğ imiz i inc el eyec eğ iz .
.N E T pl atf ormunun sı nı f kitapl ı kl arı nda b ul unan ve programc ı l arı n iş l erini çok
kol ayl aş tı ran A rrayL ist sı nı f ı il e kl asik diz il erde karş ı l aş tı ğ ı mı z sorunl arı nası l çöz ec eğ imiz i
görec eğ iz .
K l asik diz il erl e çal ı ş ı rken karş ı l aş ab il ec eğ imiz temel sorunl arı ş u ş ekil de sı ral amak
mü mkü ndü r:
Ö rneğ in sayı sı nı b il emediğ imiz b ir diz inin el eman sayı sı nı 500 ol arak b el irl ediğ imiz i
varsayal ı m. Ç al ı ş ma z amanı nda diz imiz in sadec e 10 el amanı nı kul l andı ğ ı mı z durumda
diğ er 49 0 el emanl ı k b el l ek al anı b oş ol arak kal ı r. Ö te yandan diz imiz de tutmak istediğ imiz
değ iş kenl erin sayı sı 501 b ir ol duğ u b ir durumda "I ndex O utO f R angeE x c eption" istisnai
durumu ortaya çı kar ve program b u h atadan dol ayı sonl anı r.
using System;
try
{
intD iz i[20]=5;
}
c atc h ( E x c eption e)
{
Consol e.W riteL ine(e.G etType());
}
Y ukarı daki programda intDizi ' miz i 10 el eman al ac ak ş ekil de tanı ml amamı z a rağ men b u
diz inin 20. el emanı na ul aş ı p ona b irş eyl er atamaya çal ı ş tı k. Bu durumda programı mı z
çal ı ş ı rken h ata verdi. Ç ü nkü diz inin sı nı rl arı b el l idir ve b u sı nı rl arı n dı ş ı na çı kamı yoruz .
E l eman sayı sı ih tiyac ı mı z a göre değ iş en b ir veri yapı sı ol ması gerçekten h oş ol maz mı ydı ?
E vet C# ' da b öyl e b ir diz i yapı mı z var. Bunun ismi A rra yL ist' tir.
A rrayL ist sı nı rl arı dinamik ol arak değ iş eb il en diz il er ol arak tanı ml anı r. Bu veri yapı sı .N E T
sı nı f kü tü ph anesinin S ystem. C o llec tio ns isim al anı nda b ul unur. İ sterseniz A rrayL ist' i
nası l kul l anac ağ ı mı z ı b ir örnekl e inc el eyel im:
using System;
using System.Col l ec tions; // A rrayL ist sı nı f nı kul l anmak için
// System.Col l ec tion isimal anı nı ekl emel iyiz ..
Consol e.W riteL ine("\n\t aL ist diz isinden 8 ve 20\' çı kartı p, 6 6 ve 4 ekl edik:");
f oreac h (int el eman in aL ist)
Consol e.W riteL ine(el eman);
}
}
Y ukarı daki örneğ imiz de önc el ikl e A rrayL ist sı nı f ı nı kul l anmak için N E T sı nı f kü tü ph anesinin
S ystem. C o llec tio ns isim al anı nı nı kul l anac ağ ı mı z ı using System.Col l ec tions; il e
b il diriyoruz . M ain f onksiyonumuz un içindeki il k satı rda, A rrayL ist aL ist= new A rrayL ist() ,
a L ist ismini verdiğ imiz A rrayL ist sı nı f ı ndan b ir nesne ol uş turuyoruz . a L ist nesnemiz i
ol uş turduğ unuz satı rdan sonraki b eş satı rda A rrayL ist sı nı f ı nı n A dd( ) metodu il e a L ist
adl ı diz imiz e el emanl arı ekl iyoruz .
D ah a sonra a L ist diz iminiz in el emanl arı nı F o rEa c h döngü sü il e tek tek ekrana
yaz dı yoruz . A rrayL ist sı nı f ı ndaki b ir nesnenin el emanl arı nı tek tek sil mek için R emo v e( )
metodunu kul l anı rı z . R emo v e( ) metodu il e istediğ imiz el emanı diz iden atab il iriz . Biz de 8
ve 20 el emanl arı nı diz iden attı k. Son ol arak diz imiz e 6 6 ve 20 el emanl arı nı ekl eyip diz inin
son h al ini ekrana yaz dı rdı k.
C# dil inde normal diz il er b il diğ iniz gib i sadec e aynı tipten veril eri tutar. A ma A rrayL ist
sı nı f ı na ait diz il erimiz h er tü rl ü nesneyi aynı diz i içinde tutab il ir. Y ani aynı diz ide int,
flo a t, ve string tipl erindeki değ iş kenl eri depol ama ş ansı mı z var. M esel a aş ağ ı daki kod
C# dil i kural l arı çerçevesinde geçerl i b ir koddur:
A rrayL ist karmaL ist= new A rrayL ist(); // karmaL ist isiml i A rrayL ist nesnesi
ol uş tural ı m.
Bu kod il e k a rma L ist isiml i A rrayL ist nesnemiz in içinde string , int, b o o l, flo a t ve c ha r
tipl erinden ol uş an veril eri aynı anda sakl arı z . A rrayL ist sı nı f ı nı n b iz e sunduğ u diğ er b ir
gü z el öz el l ik ise tek b ir komut il e A rrayL ist diz imiz in içerisindeki el emanl arı ters
çevireb il memiz dir. Ters çevirme iş l emi için R ev erse( ) metodu kul l anı l ı r. İ sterseniz
R ev erse( ) metodunu ve A rrayL ist' l erde nası l b irden f arkl ı tü rdeki el emanl arı
kul l anac ağ ı mı z ı b ir örnekl e inc el eyel im:
using System;
using System.Col l ec tions; // A rrayL ist sı nı f nı kul l anmak için
// System.Col l ec tion isimal anı nı ekl emel iyiz ..
Consol e.W riteL ine("\n ---> karmaL ist' in el emanl arı ve tü rl eri < ---");
f oreac h (ob j ec t el eman in karmaL ist)
Consol e.W riteL ine("Tü rü : {0,15} değ eri: {1,7 }",el eman.G etType(), el eman);
Y ukarı daki programda k a rma L ist isiml i A rrayL ist sı nf ı ndan b ir nesne ol uş turduktan sonra
onu değ iş ik tü rl erden veril er il e dol durduk. Bu diz inin el emanl arı nı sı ra il e f oreac h
döngü sü yardı mı yl a ekrana yaz dı rdı k. karmaL ist.R everse() satı rı nda ise diz imiz i ters
çevirdik. Son iş imiz de ise karmaL ist diz isinin el emanl arı nı ekrana tek tek yaz dı rı rken aynı
z amanda el eman.G etType( ) h er el emanı n tü rü nü b ul up yaz dı k.
M akal emiz i A rrayL ist sı nı f ı nı n temel metodl arı nı n tab l osunu vererek b itirmek isterim. Bu
tab l odaki metodl arı n iş imiz e yarac ağ ı kanaatindeyim.
Bu yaz ı mı z da öneml i veri yapı l arı ndan ol an yı ğ ı n (Stac k) veri yapı l arı na giriş yapac ağ ı z .
Y ı ğ ı n veri yapı l arı nı n çal ı ş ma mantı kl arı nı anl adı ktan sonra .N E T sı nı f kitapl ı kl arı nda
yeral an S ta c k sı nı f ı nı C# ' da nası l kul l anac ağ ı mı z ı inc el eyec eğ iz .
2. . N ET S ı nı f K ütüpha nesi Y ı ğ ı n S ı nı fı ( S ta c k )
C# veya h erh angi b ir dil de yaz ı l an yı ğ ı n veri yapı l arı nda P u sh( ), P o p( ), P eek ( ) v eya
T o p( ), C lea r( ) f onksiyonl arı ve C o u nt, öz el l iğ i temel ol arak b ul unur. Temel
f onksiyonl arı n yanı nda C lo ne( ), C o pyT o ( ), T o A rra y( ), C o nta ins( ) v e Eq u a ls( )
metodl arı .N E T' in yı ğ ı n sı nı f ı nda yeral ı r.
using System;
using System.Col l ec tions; // Stac k sı nı f ı b u isim al anı içinde b ul unur.
c l ass Y iginSinif i1
{
pub l ic static void M ain(string[] args)
{
// Stac k sı nı f ı ndan yigin nesnemiz i tanı ml ı yoruz .
Stac k yigin = new Stac k();
if (yigin.Count! =0)
{
w h il e(yeniY igin.Count>0)
{
ob j = yeniY igin.P op();
Consol e.W riteL ine("\t"+ ob j .ToString());
}
}
el se Consol e.W riteL ine("Y ı ğ ı n b oş ...! ");
}
}
Y ukarı daki programda önc e Stac k sı nı f ı ndan yig in isiml i b ir nesne ol uş turuyoruz . Sonraki
al tı satı rda yı ğ ı nı mı z a 12, 5, 23, 34, 7 0 ve 8 tamsayı l arı nı P u sh( ) metodu il e ekl iyoruz .
Ek ra na Y a z( ) ismini verdiğ imiz static f onksiyonumuz (b u f onksiyon tam ol arak optimiz e
edil miş b ir f onksiyon değ il ! ) il e yı ğ ı nı mı z da b ul unan el emanl arı ekrana yaz dı rı yoruz .
D ah a sonra yı ğ ı ndan iki tane el emanı P o p( ) metodu yardı mı yl a al ı yor ve h erb irini ekrana
yaz dı rı yoruz . P rogramı n son kı smı nda ise P eek ( ) metodunu kul l anarak yı ğ ı nı n en
ü stü ndeki el emanı n ne ol duğ unu öğ reniyoruz .
using System;
using System.Col l ec tions; // Stac k sı nı f ı b u isim al anı içinde b ul unur.
c l ass Y iginSinif i1
{
pub l ic static void M ain(string[] args)
{
// Stac k sı nı f ı ndan yigin nesnemiz i tanı ml ı yoruz .
Stac k yigin = new Stac k();
// Y ı ğ ı nı b oş al tal ı m.
yigin.Cl ear();
if (yigin.Count! =0)
{
w h il e(yeniY igin.Count>0)
{
ob j = yeniY igin.P op();
Consol e.W riteL ine("\t"+ ob j .ToString());
}
}
el se Consol e.W riteL ine("Y ı ğ ı n b oş ...! ");
}
}
Hemen ü stteki programdan önc eki programda yı ğ ı nı mı z a int tipinden nesnel er (c # ' ta
primitive tü rl er dah il h erş ey nesnedir! ) yerl eş tirmiş tik. Bu örnekte ise string sı nı f ı na ait
nesnel eri yı ğ ı nı mı z a ekl edik ve onl ar ü z erinde iş l eml er yaptı k. Y ani yı ğ ı n sı nı f ı mı z
h erh angi b ir nesneyi tutab il ec ek yetenekl er sab it. İ ster temel veri tü rl eri ol sun (int, b yte,
doub l e veya b ool ) ister kendi tanı ml adı ğ ı mı z veri tü rl eri ol sun yı ğ ı n sı nı f ı mı z a ekl eyip
çı kartab il iriz .
Bu makal ede inc el eyec eğ imiz son program aş ağ ı dadı r. Bu programl a C lo ne( ), Eq u a ls( )
ve T o A rra y( ) metodl arı nı programl arı mı z içinde ne ş ekil de kul l anac ağ ı mı z ı öğ reneb il iriz .
using System;
using System.Col l ec tions; // Stac k sı nı f ı b u isim al anı içinde b ul unur.
c l ass Y iginSinif i1
{
pub l ic static void M ain(string[] args)
{
// Stac k sı nı f ı ndan yigin nesnemiz i tanı ml ı yoruz .
Stac k yigin1 = new Stac k();
if (yigin.Count! =0)
{
w h il e(yeniY igin.Count>0)
{
ob j = yeniY igin.P op();
Consol e.W riteL ine("\t"+ ob j .ToString());
}
}
el se Consol e.W riteL ine("Y ı ğ ı n b oş ...! ");
}
}
Y az ı mı z da b il gisayar programl ama al anı nda en öneml i veri yapı l arı ndan b iri ol an yı ğ ı nl arı n
(Stac k) nası l çal ı ş tı kl arı nı ve .N E T sı nı f kü tü ph anesinde b ul unan Stac k sı nı f ı nı ve
metodl arı nı n nası l iş imiz e yarayac ak ş ekil de kul l anab il ec eğ imiz i öğ rendik. U marı m b u
yaz ı nı n siz e gerçek manada yararı ol ur.
C#' t a G ös t eric i( Point er) K u llanmak – I
G österic il er(P ointer) al t seviye programl ama için ol maz sa ol maz yapı l ardı r. G österic il er
nesnel erin b el l ekte tutul dukl arı adresl eri sakl ayan veri yapı l arı dı r. Bu makal ede C# ' ta
kul l anı mı çok f az l a gerekl i ol mayan gösteric il erin nası l kul anı l dı kl arı nı inc el eyec eğ iz . Bu
yaz ı gösteric il er h akkı nda temel b il gil ere sah ip ol duğ unuz u varsaymaktadı r.
.N E T' in al tyapı sı nda gösteric i kavramı sı kl ı kl a kul l anı l ı rken gösteric il erin açı kc a kul l anı mı
programc ı l ar için giz l enmitir. Bunun nedeni gösteric i kul l anı mı nı n programl ardaki
görü l emeyen h atal ara sı kça yol açab il mesidir. Ö z el l ikl e dil i yeni öğ renenl er için gösteric i
h atal arı içinden çı kı l maz b ir h al e gel eb il mektedir. C# ' ta gösteric il er yerine ref erans
değ iş kenl eri mevc uttur. R ef eransl ar h eap b el l ek b öl gesindeki nesnel erin b aş l angı ç
adresini tutar. A nc ak b u adresin değ erine kesinl ikl e ul aş amayı z . O ysa C ve C+ + dil l erinde
stac k b öl gesindeki değ iş kenl erin de adresl erine eriş b il memiz mü mkü ndü r. Üstel ik
değ iş kenl erin adresl erini örneğ in 0x 9 6 547 4 ş ekl inde el de etmemiz b il e mü mkü ndü r. C ve
C+ + programc ı l arı na pek yab anc ı gel meyec ektir b unl ar, anc ak programl ama dü nyası na
C# il e giren b iri için gösteric il ere neden ih tiyaç duyab il ec eğ imiz pek anl aml ı gel meyeb il ir.
Ş unu da söyel eyel im ki çok istisnai duruml ar dı ş ı nda gösteric il ere ih tiyac ı mı z ol mayac ak,
peki b u istisna duruml ar nel erdir?
Bü tü n b unl arı n yanı nda gösteric i kul l anmanı n b ir çok sı kı ntı yı da b erab erinde getirec eğ i
kesindir. Ö nc el ikl e kul l anı mı nı n z or ol ması ve kestiril mesi z or ol an h atal ara yol açab il mesi
b u sı kı ntı l arı n en b aş ı nda gel enidir. Z aten C# ' ta gösteric i kul l anac ağ ı mı z z aman kodu
u nsa fe(gü vensiz ) anah tar söz c ü ğ ü il e iş aretl ememiz gerekir. A ksi h al de program
derl enemeyec ektir. N ormal b ir metot içinde gösteric i kul l anı mı yasakl anmı ş tı r.
Ş imdi de unsaf e anah tar söz c ü ğ ü nü n kul l anı mı na örnekl er verel im.
1-) unsaf e ol arak iş aretl enen sı nı f l arı n b ü tü n metotl arı nda gösteric i kul l anab il iriz .
unsaf e c l ass Sı nı f
{
2-) N ormal b ir metot içinde h erh angi b ir b l oğ u unsaf e ol arak aş ağ ı daki gib i iş aretl eyip
dil ediğ imiz gib i gösteric i kul l anab il iriz . unsaf e b l okl arı nı n dı ş ı nda ise gösteric i
kul l anamayı z .
int N ormal M etot(int a, string str)
{
unsaf e
{
}
}
3-) N ormal b ir metodu unsaf e ol arak iş aretl eyip sadec e o metodun içinde de gösteric i
kul l anab il iriz .
4-) Bir sı nı f ı n ü ye değ iş kenl erinden b iri unsaf e ol arak iş aretl enip gösteric i ol arak
b il diril eb il ir. A nc ak b ir metot içerisinde yerel b ir gösteric i tanı ml anamaz . Y erel b ir
gösteric i tanı ml amak için unsaf e ol arak iş aretl enmiş metod yada b l ok kul l anı l ı r.
c l ass Sı nı f
{
unsaf e c h ar *ptr;
}
ptr1 ve ptr2 c h ar tü rden b ir gösteric i iken ptr3 int tü rden b ir gösteric dir. Bir gösteric ide
iki b il eş en vardı r. Bu b il eş enl erden b irinc isi adres b il eş enidir. A dres b il eş eni nesnenin
b el l ekte b ul unduğ u b aş l angı ç adresidir. İ kinc i b il eş en ise tü r b il eş enidir. Bu b il eş en ise
il gil i adresteki nesneye ul aş mak istediğ imiz de b el l ekten ne kadarl ı k b il gil i okunac ağ ı nı
sağ l ar. Ö rneğ in int tü rden b ir adresteki b il giyi okumak istediğ imiz de 4 b yte' l ı k b ir b il gi
okunac aktı r, aynı ş ekil de c h ar tü rden b ir gösteric i ise 2 b yte' l ı k b ir b il gi okunac aktı r.
& o pera tö rü
A dres operatörü ol arak b il inen b u operatör değ iş kenl erin veya nesnel erin b el l ekte
b ul undukl arı adresl eri el de etmek için kul l anı l ı r. Bu operatör h angi tü r değ iş kenl e
kul l unı l ı rsa o tü rden b ir gösteric i ü retil ir.
* o pera tö rü
İ çerik operatörü ol an *, b ir adresteki b il gil eri el de etmek için kul l anı l ı r. A ş ağ ı daki
programda b u iki operatörü n kul l anı mı na b ir örnek veril miş tir.
using System;
c l ass Cl ass1
{
unsaf e static void M ain()
{
int* ptr1;
c h ar* ptr2;
int a = 50;
ptr1 = &a;
int A dres = (int)ptr1;
Consol e.W riteL ine("{0:X }",A dres);
c h ar c h = ' A ' ;
ptr2 = &c h ;
*ptr2 = ' B' ;
Consol e.W riteL ine(c h );
}
}
Bu programı derl eyeb il mek için komut satı rı derl eyic isene programı n içinde unsaf e
b l oğ unun ol duğ unu b el irtmemiz gerekir. Bunun için komut satı rı na
c sc / u nsa fe K a yna k K o d. c s
yada
c sc -u nsa fe K a yna k K o d. c s
yaz arak programı derl eyeb il irsiniz . E ğ er V isual Studio.N E T kul l anı yorsanı z proj eye sağ
tı kl ayı p proj e öz el l ikl erine gel ip Buil d kı smı ndan "A l l ow unsaf e c ode b l oc ks" kı smı nı true
ol ac ak ş ekil de değ iş tirin.
P rogramı çal ı ş tı rdı ğ ı nı z da ekrana a değ iş keninin adresi ve B karekteri yaz ı l ac aktı r. A dres
b il gisini ekrana yaz dı rmadan önc e gösteric ide tutul an adresi normal b ir tü re nası l
dönü ş tü rdü ğ ü mü z e dikkat edin. Bunu yapmamı z ı n seb eb i Consol .W riteL ine() metodunun
gösteric i parametres al an versiyonunun ol maması dı r.
C# ' ta tü r gü venl iğ inin ne kadar öneml i ol duğ unu vurgul amak için aş ağ ı daki deyiml eri
örnek vereb il iriz .
int* ptr1;
*ptr1 = 50;
Bu deyiml eri içeren b ir program derl enemeyec ektir. Ç ü nkü ptr1 gösteric isinde h angi
adresin tutul duğ u b el l i değ il dir. Bu yü z den adresi b el l i ol mayan b el l ek b öl gesine b ir değ er
yerl eş tirmek imkansı z dı r. C ve C+ + dil l erinde b u kul l anı m tamamen geçerl idir. A ma gel in
b ir de b unun sakı nc ası na b ir göz atal ı m. ptr1 gösteric isi tanı ml andı ğ ı nda ptr1 de rastgel e
b ir adres değ eri b ul unmaktadı r. Bu adreste rastgel e b ir adres ol duğ u için o an b el l ekte
çal ı ş an kendi programı mı z daki b ir değ iş kenin adresi b il e ol ab il ir. Y ada sistemde çal ı ş an
b aş ka b ir prosesteki el emanl arı n adresl eri ol ab il ir. K aynağ ı nı b il mediğ imiz b ir adresteki
değ eri * operatörü il e değ iş tirdiğ imiz de h iç tah min edemeyec eğ imiz çal ı ş ma z amanı
h atal arı al ab il iriz . İ ş in kötü sü adresl er rastgel e ol duğ u için programı mı z ı n test aş aması nda
b u h atal ar ol uş mayab il ir. A dresl er nası l rastgel e ise h atal arı n ol uş ması da rastgel edir.
P rogramı mı z piyasada iken b öyl e b ir h atanı n f arkı na varı l ması iş mal iyetl erini ne kadar
artı rdı ğ ı nı siz tah min edin artı k. Bü tü n b u dez avantaj l ar gösteric il erin asl a gereksiz ol duğ u
anl amı na gel memel idir. Sadec e gösteric il eri kul l anı rken dah a dikkatl i davranmamı z
gerektiğ inin göstergesidir.
G österic il er arası nda tü r dönü ş ü ml eri mü mkü ndü r. Ö rneğ in int tü rden b ir gösteric i c h ar
tü rden b ir gösteric iye aş ağ ı daki gib i dönü ş tü rü l eb il ir.
c h ar* ptr1
int* ptr2;
ptr1 = (c h ar*)ptr2
A ynı ş ekil de b ir gösteric i de tamsayı tü rl erine dönü ş tü rü l eb il ir. A dresl er tam sayı
tü rü nden b irer sayı ol dukl arı için b unu yapab il memiz son derec e normal b ir durumdur. Bir
önc eki çal ı ş an programda da Consol e.W riteL ine() metodu il e ekrana yaz mak istediğ imiz
nesnenin adresini tamsayı tü rl erinden b irini çevirdiğ imiz i h atı rl ayı n. Ö rneğ in aş ağ ı daki
deyiml eri içeren b ir program derl enemeyec ektir.
c h ar* ptr1
c h ar c h = ' A ' ;
ptr1 = c h ;
G österic il erl e il gil i diğ er öneml i yapı ise v o id gösteric il erdir. void ol an gösteric il erde tü r
b il gisi sakl anmamaktadı r. void gösteric il ere h erh angi b ir tü rden gösteric i atanab il ir. void
gösteric il er dah a çok eskiden yaz ı l mı ş A P I f onksiyonl arı nda void parametre al an
f onksiyol arı programl arı mı z içerisinden çağ ı rmak için kul l anı l ı r. void gösteric il erin
kul l anı mı na aş ağ ı da b ir örnek veril miş tir.
int* ptr1;
void * x ;
x = ptr1;
sizeo f o pera tö rü
siz eof operatörü temel tü rl erin ve yapı l arı n b el l ekte ne kadar al an kapl adı kl arı nı verir.
Ö rneğ in siz eof (int) = 4, siz eof (c h ar) = 2 ' dir. siz eof operatörü nü sı nı f l ar için
kul l anamayı z anc ak tanı ml ayac ağ ı mı z yapı l ar için kul l anab il iriz .
Bu yaz ı nı n sonuna gel dik. Bir sonraki yaz ı mı z da yapı gösteric il eri tanı ml amayı sı nı f l ar il e
gösteric il er arası ndaki il iş kiyi, gösteric i aritmetiğ ini inc el eyip örnek b ir gösteric i
uygul aması yapac ağ ı z .
K aynakl ar:
JA V A ' nı n gü n geçtikçe yaygı nl aş an kul l anı m al anl arı , M ic rosof t f irması nı gerçekten gü ç
duruma dü ş ü rdü . 19 9 5 yı l ı nda JA V A uf ukta görü ndü ve geçtiğ imiz 6 yı l içerisinde kendisi
il e rekab et eden diğ er b ü tü n popü l er dil l er ü z erindeki ü stü nl ü ğ ü nü gösterdi. Baş l angı çta
M ic rosof t b u duruma direndi anc ak dah a sonra, JA V A meş h ur V isual Studio nun V isual
J+ + adı al tı nda b ir parçası ol du. JA V A ' yı çı karan Sun M ic rosystems, M ic rosf t al eyh ine
l isans anl aş ması nı ih l al ettiğ i gerekçesiyl e dava açtı ve M ic rosf t b una karş ı l ı k b ir b edel
ödemek z orunda kal dı .
Sonunda ortal ı k yatı ş tı ve M ic rosf t V isual J+ + ' ı n yeni versiyonl arı nı çı karmaya devam
etti. F akat M ic rosof t' un JA V A dil ini V isual Studio paketinin içine koyma çab ası b aş arı ya
ul aş amadı ve en sonunda b aş arı z ol du. E l b ette ki b u b aş arı sı z l ı k ta paz arl amanı n iyi
yapı l amaması nı n da etkisi ol muş tur. Sonuç ol arak M ic rosof t 19 9 8 yı l ı ndan sonra V isual
J+ + için yeni b ir versiyon çı karmadı , ve yakı n b ir gel ec ek içinde de b u tü r pl anl arı nı
askı ya al dı .
P eki, M ic rosof t ' un il gil endiğ i b u pakette önerdikl eri nel erdi?
. N ET M ima risi
Y eni b ir dil - C #
. N ET M ima risi
Herh angi b ir dil taraf ı ndan kul l anal ab il ec ek W eb Servisi denil en yeni b ir ortak servisl er
kü mesi. Bu servisl er ara kod(intermediate kod) dediğ imiz mimariden b ağ ı msı z b ir yapı
içerisinde çal ı ş tı rı l ı r. Bu ara kod dah a sonra çal ı ş ma z amanı nda CL R denil en b irim
taraf ı ndan çal ı ş tı rı l ı r, ki b u b ah sedil en CL R b irimi programl a il gil i kaynakl arı yöneten ve
programı n çal ı ş ması nı iz l eyen b ir b irimdir.
.N E T' in b irinc il amac ı gel iş tiric il er açı sı ndan W eb Servisl erini kul l anarak mimariden
b ağ ı msı z uygul amal ar gel iş tirmeyi kol ayl aş tı rmaktı r. Ö rneğ in b ir servise h em P C h em P D A
h emde M ob il c ih az l ardan eriş eb il me gib i.
W eb S erv isleri
W eb servisl erinin en gü z el yani servisin h er yerden isteneb il mesidir. K ı sac ası w eb servisi
uygul ama al anl arı na W indow s, L inux , U nix , M ac -O s gib i pl atf orml arı n yanı sra komut
satı rı ndan çal ı ş an diğ er ortaml ar b il e gireb il ir. Y ani W eb servisl eri sayesinde pl atf orm
b ağ ı msı z uygul amal ar gel iş tireb il iriz . İ nternet standartl arı nı n pl atf orm b ağ ı msı z ol ması ve
w eb servisl erininde internet ü z erinden çağ rı l ması , w eb servisl erinin h erh angi b ir iş l etim
sisteminin yada programl ama dil inin tekel inde ol maması nı sağ l amı ş tı r.
A ra K o d( İ ntermedia te C o de)
A ra kod! K ul ağ a pek h oş gel miyormu? Bu b ana b irş eyi h atı rl atı yor....h ı mmm..... JA V A ?
E vet, el b ette. M ic rosof t açı k b ir ş ekil de .N E T il e JA V A ' nı n çal ı ş ma pl atf ormundan
esinl endiğ ini kab ul etti b öyl ec e. .N E T ortamı nda, programl ar b ir ara dil ü z erinden ikil i
koda çevril ir. İ ş l etim sisteminden ve donanı mdan b ağ ı msı z ol an b u dil e M SI L (M ic rosf t
I ntermediate L anguage) denir. (Ç evirenin notu: M SI L artı k I L ol arak anı l maktadı r.) I L
kodu, JA V A pl atf ormundaki JV M de ol duğ u gib i CL R taraf ı ndan derl enip makina koduna
çevril ir. I L kodunu makine koduna çeviren derl eyic il ere ise JI T(Just I n Time) derl eyic il eri
denil mektedir.
I L kodu ş ekl inde derl enmiş b ir uygul amaya taş ı nab il en çal ı ş tı rı l ab il ir(P ortab l e
E x ec utab l es) uygul ama denir. CL S nin ş artı b ü tü n dil l erin ortak b ir noktada topl anması nı
sağ l ayac ak kural l ar ol uş turmaktı r. A nc ak b urada b ir prob l eml e karş ı l aş ı l dı , oda b ü tü n
dil l erin f arkl ı semantik yapı ya sah ip ol ması dı r, örneğ in h er dil in f arkl ı öz el l ikl eri ol ab il ir,
b az ı dil l er prosedü rel tekniğ i destekl er, b az ı l arı nesne yönel imi tekniğ ini destekl er,
b az ı l arı nda operatör yü kl eme varken b az ı l arı nda yok, ve diğ erl eri.
Bir dil in .N E T uyuml u ol ması için CL S(Common L anguage Spec if ic ation) standartl arı na
uyması gerekir. D ol ayı sı yl a b ir dil in .N E T ortamı na uyuml u ol ması için sağ l aması gereken
iki koş ul vardı r:
CL S il e uyuml ul uk
K aynak kodu I L koduna çevirec ek derl eyic i
P eki yukarı da b ah sedil en kompl ek yapı b iz e ne kaz andı rac ak? D il l er arası çal ı ş ma? Bü tü n
.N E T uyuml u dil l erde yaz ı l mı ş kodl ar ara koda çevril ec eğ i için h erh angi b ir dil de yaz ı l mı ş
b ir nesneyi b aş ka b ir dil de yaz dı ğ ı mı z programda ol uş turab il iriz . Ö rneğ in .N E T uyuml u C#
dil inde yaz ı l mı ş b ir sı nı f il e, V B programc ı sı b ir nesne ol uş turab il ir.
P eki JA V A ' nı n b u durumdaki rol ü ne? Y ada M ic rosof t JA V A yı devre dı ş ı mı b ı raktı ? Tam
ol arak değ il . JA V A nı n .N E T dil l eri arası nda ol ması dü ş ü nü l dü . JA V A kodunu I L koduna
çevirec ek derl eyic i R ational f irması (ü nl ü U M L yaz ı l ı m gel iş tirme arac ı nı gel iş tiren f irma)
taraf ı ndan h az ı rl anmaktadı r.(N ot: b u yaz ı nı n yaı l dı ğ ı tarih te JA V A derl eyic isi yeni
yaz ı l ı yordu). P eki b u eskisiyl e aynı JA V A mı ol ac ak? A sl ı na b akarsanı z h ayı r. JA V A kodl arı
artı k b yte kod yerine I L koduna çevril ec ek.Y eni JA V A , J2E E ' nin sağ l adı ğ ı R M I , JM S, JD BC,
JSP vs gib i A P I ' l erden f aydal anamayac ak.Y eni gel iş tiril en JA V A il e E JB mantı ğ ı yerini
.N E T' in dağ ı tı k nensne model ine b ı rakmı ş tı r.
C L R ( C o mmo n L a ng u a g e R u ntime)
CL R , diz il erin sı nı rl arı nı n aş ı l ması , tah sis edil meyen b el l ek al anı na ul aş l ması , b el l ekteki
gerekl i al anl arı n ü z erine yaz ı l ması gib i programl arı n çökmesine seb ep ol an gel eneksel
h atal arı n durumunu iz l er. Bu iz l eme h ı z l ı l ı ktan f edakarl ı k sağ l amak demektir. M ic rosof t b u
yönteml e perf ormansı n % 10 oranı nda dü ş ec eğ ini kab ul etmiş tir, f akat b u sisteml er
devaml ı l ı k ve gü venil irl ik açı sı ndan dah a ön pl andadı r.
. N ET S ena ryo yu S u nu yo r
. N ET ' in G elec eğ i
.N E T' in gel iş i il e b irl ikte, el ektronik uygul amal arı n al tyapı sı nı n değ iş mesi gerektiğ ini inkar
edemeyiz . Her dil , .N E T uyuml u ol ması için yapı sal b ir takı m değ iş ikl ikl er yapmal ı dı r. Java
dil ini b ir dü ş ü nü n. Hangi Java dah a terc ih edil ir siz c e, JV M il e JA V A mı yoksa .N E T il e
JA V A mı ? Bu sorunun c evab ı nı siz okurl arı ma b ı rakı yorum.
Y eni B ir Dilin Do ğ u ş u
M ic rosf t .N E T' in 27 f arkl ı dil desteğ inin ol duğ unu iddia ediyor.(Ç evirenin not: Ş u an b u
dil l rein sayı sı dah a f az l a) Bir dil i .N E T uyuml u h al e getirmek dil in varol an mimarisine yeni
yamal ar ekl emek demektir. M ic rosf t b u durumu değ erl endirerek temel ol arak .N E T
mimarisi h edef al ı narak yeni b ir dil tasarl adı . Bu dil in adı C-Sh arp yada C# . Bu dil i dah a
çok JA V A yı andı rı yor ol ması na rağ men var ol an diğ er dil l erden de gü z el öz el l ikl er al ı nı p
C# dil ine ekl enmiş gib i göz ü kü yor.
C # nedir?
G eçen iki yü z yı l içerisinde C ve C+ + dil l eri tic ari ve iş uygul amal arı gel iş tirmek için en çok
kul l anı l an dil l er ol muş tur. Bu iki dil programc ı l ara b ü yü k miktarda kontrol sağ l aması na
rağ men, ü retim açı sı ndan çok ol anak sağ l amı yordu.
Bu dil l eri V isual Basic gib i dil l erl e karş ı l aş tı rdı ğ ı mı z da aynı uygul amyı gel iş tirmenin C ve
C+ + dil l erinde dah a f az l a z aman al dı ğ ı b ir gerçektir. Y ı l l ardan b eri istenil en tek ş ey
gü çl ü l ü k ve ü retim h ı z ı nı n arası nda b ir denge kurac ak b ir dil in ol ması ydı . G eçtiğ imiz
yı l l arda b u prob l em Sun M ic rosystems taraf ı ndan anl aş ı l dı . V e diğ er dil l erin çal ı ş ma
mantı ğ ı ndan tamamen f arkl ı ol an JA V A dil ini gel iş tirdi. Bytec ode konsepti, JV M ve açı k
kaynak kod vs ve sonuç ol arak b edeva ol ması b u f arkl ı l ı kl ardan b ir kaçı dı r.
F akat unutul an b ir ş ey vardı . JA V A il e yaz ı l an kodl ar b aş ka dil l erde kul l anı l amı yordu.
Tekrar kul l anı l ab il irl ik denen b u öz el l iğ i JA V A destekl emiyordu. Böyl ec e, tekrar
kul l anı l ab il irl iğ i standartl aş tı rac ak b ir ortamı n gerekl il iğ i ortaya çı ktı . Bu ortam .N E T il e
sağ l andı , z ira .N E T il e uyuml u dil l erin sağ l aması gereken CL S standartl arı mevc uttur.
F akat dah a önc ede dediğ im gib i .N E T il e tam uyuml u çal ı ş ac ak ve diğ er dil l erin gü z el
öz el l ikl erini sağ l ayac ak yeni b ir dil e ih tiyaç vardı .
Hakkı nda konuş tuğ um b u dil C-Sh arp diye okunan C# ' tan b aş ka b irş ey değ il dir.
C# , modern, nesne yönel iml i, tip gü venl iğ ine b ü yü k önem veren, temel h esapl ama ve
h ab erl eş me gib i geniş b ir yel paz edeki uygul amal arı gel iş tirmek için .N E T pl atf ormu için
tasarl anmı ş yeni b ir dil dir.
C # v e J A V A ' nı n K a rş ı la ş tı rı lma sı
İ yi b ir dil in sağ l aması gereken ş eyl er nel erdir? Y ada programc ı l arı n gönl ü nü kaz anmak
için b ir dil yapı sı nda neyi b arı ndı rmal ı dı r? Bu sorul ar on yı l l ardan b eri dil tasarı mc ı l arı nı n
ü z erinde durduğ u tartı ş maya açı k sorul ardı r. Bü tü n programc ı l ar taraf ı ndan ittif akl a kab ul
edil miş tir ki, b u sorul arı n c evab ı nı en iyi ş ekil de veren dil JA V A ' dı r. C# , sentaks ol arak
JA V A ' ya çok b enz emektedir, anc ak derinl erine dal dı kça M ic rosof tun b u dil i tasarl amak için
çok ef or sarf ettiğ ini ve b u yeni ekl enen b u öz el l ikl er için M ic rosof t' a teş ekkü r etmemiz
gerektiğ ini anl arı z .
Ş imdi isterseniz JA V A nı n öz el l ikl erini tek tek el e al ı p b unl arı C# ' ı n il gil i öz el l ikl eriyl e
karş ı l aş tı ral ı m.
I ntermedia te L a ng u a g e( A ra dil)
JA V A ' nı n gü c ü pl atf orm b ağ ı msı z ol ması ndan kaynakl anmaktayken C# aynı z amanda
dil l er arası ndaki uyuml ul uğ uda sağ l ar. Y ani dil b ağ ı msı z l ı ğ ı . G ü z el ! . Ş imdi b unl arı b iraz
dah a açal ı m: JA V A il e yaz ı l mı ş b ir program JV M ' nin ol duğ u b ü tü n sisteml erde çal ı ş ması
söz konusu iken, C# il e yaz ı l an b ir kod diğ er .N E T uyuml u dil l er taraf ı ndan tekrar
kul l anı l ab il iyor. Ö rneğ in b ir dil de yaz ı l an sı nı f , diğ er .N E T uyuml u dil l er il e rah atl ı kl a
kul l anı l ab il ir.
B ellek Y ö netimi
Haric i kodl ar C# ve JA V A ' da b enz er ş ekil de el e al ı nmı ş tı r. JA V A dil inde import anah tar
kel imesi kul l anı l ı rken C# ta using anah tar kel imesi kul l anı l maktadı r. JA V A
paket(pac kages) kul l anı rken, C# isim uz ayl arı (namespac e) kul l anı r. F akat b unl arı n
anl aml arı aş ağ ı yukarı aynı dı r.
V eri T ipleri
Bir dil in gü c ü , dil in destekl ediğ i f arkl ı veri tü rl eri taraf ı ndan b el irl enir. V eri tipl eri
programc ı l ara gü çl ü l ü ğ ü ve esnekl iğ i sağ l ayan varl ı kl ardı r. C# , JA V A daki b ü tü n veri
tipl erini sağ l amı ş tı r, b unun yanı sı ra JA V A da ol mayan b az ı tü rl er de ekl enmiş tir, örneğ in
b az ı iş aretsiz (unsigned) veri tü rl eri JA V A da yoktur. A yrı c a C# ta kayan noktal ı (f l oating
point) b ir veri tü rü ol an 12 b yte' l ı k dec imal tü rü de mevc uttur.
C# taki A l an dü z enl eyic il eri temel ol arak JA V A dil indeki gib idir. D eğ iş tirl emeyen yada
sab it b ir değ iş ken tanı ml amak için JA V A daki f inal dan f arkl ı ol arak read onl y ve c onst
b el irl eyic il eri kul l anı l ı r. c onst ol an al an dü z enl eyic il er, il gil i değ erin I L kodunun b ir parçası
ol duğ u ve sadec e çal ı ş ma z amanı nda h esapl anac ağ ı anl amı na gel ir.
if -el se, sw itc h , w h il e, do-w h il e, f or, b reak, c ontine deyiml eri h er iki dil de aynı dı r. F akat
C# ta yeni b ir kontrol dah a vardı r. C# taki b u yeni yapı kol eksiyonl ar arası nda dol aş mak
için gerekl i ol an f or eac h yapı sı dı r.
Y ukarı daki yapı da j döngü değ iş keni ol arak adl andı rı l ı r. Bu döngü değ iş kenine h er
iterasyonda al ist diz isinin int tü rden ol an el emanı atanı r.
A ra yüz v e S ı nı f B ildirimi
JA V A daki ex tends ve impl ements anah tar söz c ü kl eri C# te yerini iki nokta iş aretine(:)
b ı rakmı ş tı r.
C# ta c atc h b l oğ undaki argü man isteğ e b ağ l ı dı r. E ğ er c atc h il e argü man b el irtil memiş se,
b u c atc h b l oğ u try b l oğ unda f ı rl atı l ac ak h erh angi b ir h atayı yakal amak için kul l anı l ı r.
Bü tü n c atc h b l oğ uda C# ta kul l anı l mayab il ir. A yrı c a C# ta th row s(çevirenin not: th row il e
karı ş tı rmayı n) anah tar söz c ü ğ ü yoktur.
A ra yüzler
K a lı tı m
Sanal metotl ar çok b içiml il iğ i gerçekl eş tirmek için kul l anı l ı r. Bunun anl amı tab an sı nı f l arı n,
tü remiş sı nı f l ara ait aş ı rı yü kl enmiş metotl arı çağ ı rab il mesidir. JA V A da b ü tü n metotl ar
sanal dı r, f akat C# ta tü remiş b ir sı nı f taki metodu tab an sı nı f il e çağ ı rab il mek için
metodun açı kc a virtual anah tar kel imesi il iş aretl enmesi gerekir. C# ta override anah tar
kel imesi b ir metodun tü reyen sı nı f ta yeniden yaz ı l ac ağ ı nı b il dirmek için gerekl idir. Sanal
ol mayan b ir metodu yeniden uygul amaya çal ı ş mak derl eme z amanı h atası na yol
açac aktı r. F akat eğ er tü remiş sı nı f taki metot new anah ar söz c ü ğ ü il e iş aretl enirse
program h ata vermeden derl enec ektir.
P ekal a, sonuç nedir? C# te yeni b ir ş ey b ul ab il diniz mi, yoksa JA V A nı n ü vey kardeş i gib i
mi duruyor? M ic rosof t b u uğ raş ı nı n karş ı l ı ğ ı nı il erde al ac akmı ? Y eni b ir dil in var ol an
uygul amal ar ü z erinde, değ iş ik pl atf orml arda h atta programc ı l ar ü z erindeki etkisi ne
ol ac ak? Bu c an al ı c ı sorul arı n c evab ı nı anc ak z aman vereb il ir. F akat b u arada b eyniniz de
b u sorul arı yavaş yavaş çöz ü n ve dü ş ü nü n. C # g erç ek ten J A V A nı n so nu mu ?
----------------------------
Bu makal e h ttp://w w w .c sh arph el p.c om/arc h ives/arc h ive86 .h tml adresindeki yaz ı dan
Tü rkçeye terc ü me edil miş tir.
C# ile Z amanlayıc ı K u llanmak ( S ys t em. T imers )
W indow s programl ama il e uğ raş anl ar Timer kontrol ü nü sı k sı k kul l anmı ş l ardı r. Bu yaz ı da
System.Timers isim al anı nda b ul unan Timer sı nı f ı il e b ir programdaki rutin ol arak
yapı l ması gereken iş l eri b el irl i b ir z aman aral ı ğ ı içinde ne ş ekil de yapab il ec eğ imiz i
öğ renec eğ iz . A nc ak al ı ş al ı gel miş ş ekil de b ir graf ik arayü z ü ol an program yerine
uygul amamı z ı komut satı rı ndan çal ı ş ac ak ş ekil de gel iş tirec eğ iz . Burdaki amac ı mı z
z amanl ayı c ı dediğ imiz timer nesnel erinin çal ı ş ma prensib ini yakı ndan görmektir.
Ş öyl e b ir konsol uygul aması yapmanı z gerektiğ ini dü ş ü nü n. Her 5 dakikada b ir, b el irl i b ir
kaynaktaki değ iş ikl ikl er kontrol edil ec ek. E ğ er kaynakta b ir değ iş ikl ik varsa kul l anı c ı ya
uyarı veril ec ek. Bunu kl asik yönteml erl e ne ş ekil de yapab il irdiniz b ir dü ş ü nü n? Y ada b en
söyl iyeyim. M uh temel en sonsuz b ir döngü içerisinde sistem saatini kontrol edip b el irl i b ir
aral ı k geçmiş ise kaynağ ı kontrol eden iş l evi çağ ı rac aktı nı z . E ğ er z amansal b ir iş l em
yapı yorsak ki b ir ol ayı b ir z aman dil imi içinde sü rekl i gerçekl eş tirmek z amana b ağ l ı b ir
ol aydı r; mutl aka sistem saatinden f aydal anmamı z gerekir. Sistem saatini makine
dü z eyinde iş l eyen b ir b irim ol arak dü ş ü neb il irsiniz . Bil gisayar b il iml erinde b ir çok
al goritma sistem saati ü z erine kurul muş tur. Z atan eğ er z amanı öl çeb il ec ek b ir b irim
ol masaydı ş u anki teknol oj ik imkanl ara kavuş mamı z mü mkü n ol amaz dı . Sonuç ol arak
z aman ne kadar değ erl iyse z amanı öl çeb il mek te o derec e öneml idir.
Bu yaz ı da b ir metodu b ir z aman dil imi içerisinde tekrar tekrar çağ ı rmayı öğ renec eğ iz .
Bunun için System.Timers isim al anı nda ki Timer isiml i sı nı f ı kul l anac ağ ı z . Timer sı nı f ı nda
b ul unan Ela psed ol ayı timer nesnesinin I nterv a l öz el l iğ i il e b el irl enen aral ı kta
çal ı ş tı rı l ac ak metodun ref eransı nı tutmaktadı r. M etodun ref eransı Timer sı nı f ı nı n içindeki
del egate(temsil c i) ve ol ay(event) veri yapı l arı il e sağ l anmaktadı r. (D el egate ve E vent veri
yapı l arı il e il gil i ayrı ntı l ı yaz ı l ar il eriki z amanl arda yayı nl anac aktı r.)
Ş imdi isterseniz Timer sı nı f ı nı n yapı c ı metotl arı nı inc el eyel im.Timer sı nı f ı nı n iki tane yapı c ı
metodu vardı r. Bu metotl ardan b irinc isi h erh angi b ir parametre al mamaktadı r. İ kinc isi ise
doub l e tü rden b ir parametre al maktadı r. D oub l e tü rden ol an b u parametre Timer
nesnesinin E l apsed ol ayı nı n ne kadar sü rede meydana gel ec eğ ini b el irtmektedir. Bu
metodun prototipi aş ağ ı daki gib idir.
Tic kSayisi mil isaniye c insindendir. Ö rneğ in h er 1 saniyede çal ı ş ması nı istediğ imiz b ir
metot için Tic kSayisi 1000 ol an b ir Timer kul l anmamı z gerekir. Saniyede on def a
çal ı ş ması nı istediğ imiz b ir metot için ise Tic kSayisi 100 ol an b ir Timer nesnesi
kul l anmal ı yı z . E ğ er yapı c ı metot h erh angi b ir parametre il e kul l anı l maz ise varsayı l an
Tic kSayisi ol an 100 il e Timer nesnesi ol uş turul ur.
Ç al ı ş ma z amanı nda timer nesnel erinin Tic kSayisini değ iş tirmek yada Tic k sayı sı nı
öğ renmek için I nterval öz el l iğ i kul l anı l ab il ir. Timer nesnel eri varsayı l an ol arak aktif
değ il l erdir. Bu yü z den Timer nesnel erinin iş l eyeb il mesi için b ool tü rden ol an E nab l ed
öz el l iğ inin true ol arak ayarl anması gerekir. Y ada Timer sı nı f ı nı n Start() metodunu
kul l anarak z amanl ayı c ı yı b aş l atmanı z gerekmektedir.
Timer sı nı f ı il e il gil i en öneml i nokta I nterval il e b el irtil en sü re dol duğ unda h angi metodu
çağ ı rac ağ ı nı nerden anl ayac ağ ı dı r. Bunun için temsil c il er ve ol ayl ar kul l anı l ı r. Timer sı nı f ı
tasarl anı rken yapı sı nda tanı ml anan event ve del egate veri tü rl eri il e b u mü mkü n
ol maktadı r. Timer sı nı f ı nı n E l apsed ol ayı b u iş e yaramaktadı r. E l apsed ol ayı na + =
operatörü il e ol ay yönetic isi yardı mı yl a(event h andl er) yeni metotl ar ekl eyeb il iriz . Timer
sı nı f ı nı n E l apsed ol ayı için E l apsedE ventHandl er isminde öz el b ir temsil c i tanı ml anmı ş tı r.
Bu temsil c i nesnesine parametre ol arak veril ec ek metodun parametreik yapı sı aş ağ ı daki
gib i ol mal ı dı r.
SaniyelikIs(object o, ElapsedEventArgs a)
E l apsedE ventA rgs sı nı f ı Timer nesnesi il e il gil i ayrı ntı l ı b il gil er tutmaktadı r. Ö rneğ in
E l apsedE ventA rgs sı nı f ı nı n Signal Time öz el l iğ i il e E l apsed ol ayı nı n meydana gel diğ i saati
ve tarih i öğ reneb il iriz . Ö rneğ imiz i verdikten sonra E l apsedE ventA rgs sı nı f ı nı dah a iyi
öğ renec eksiniz .
Timer sı nı f ı nı n diğ er b ir öneml i el emanı ise Stop() metodudur. Bu metodu çağ ı rdı ğ ı mı z
anda Timer nesnesinin E l apsed ol ayı artı k meydana gel mez . Stop() metodu yerine Timer
nesnesnin E nab l ed öz el l iğ ini f al se yapmak ta diğ er b ir çöz ü mdü r.
Timer sı nı f ı il e il gil i b u b il gil eri verikten sonra b ir örnek il e b il gil erimiz i pekiş tirel im.
Ö rneğ imiz de h er saniye de saati ekrana yaz adı rac ak b ir metot b il direc eğ iz . Bu metot b ir
Timer sayesinde h er saniye çağ rı l ac aktı r. Ö rneğ in kaynak kodu aş ağ ı daki gib idir.
using System;
using System.Timers;
class Zamanlayici
{
static void Main()
{
Timer t = new Timer(1000);
t.Elapsed += new ElapsedEventHandler(SaniyelikIs);
t.Start();
while(true)
{
}
}
Saniyel ikI s() metodunu ElapsedEventArgs sı nı f ı ndan dol ayı aş ağ ı daki gib i de
yaz ab il irdik. ElapsedEventArgs sı nı f ı nı n Signal Time öz el l iğ i E l apsed ol ayı nı n meydana
gel diğ i z amanı vermektedir.
Timer sı nı f ı nı kul l anı rken karş ı l aş ab il ec eğ imiz en b ü yü k sorunl ardan b iri E l apsed ol ayı nı n
meydana gel me aral ı ğ ı nı n ol aydan sonra çal ı ş tı rı l ac ak kodl arı n ic rası için geçen z amandan
az ol ması nda görü l ü r. Bu sorun, ikinc i E l apsed ol ayı meydana gel diğ inde b irinc i E l apsed
ol ayı na il iş kin kodl ar h al en çal ı ş ı yor durumda ol ması ndan kaynakl anı r. Ö rneğ imiz deki
Timer nesnesinin Tic k sayı sı nı 1000 yerine 100 yaptı ğ ı mı z da aynı saat değ erinin 10 def a
ekrana yaz dı rı l ması gerektiğ ini anl arı z . Ç ü nkü E l apsed ol ayı h er saniyede 10 def a
gerçekl eş ec ektir. Her 10 E l apsed ol ayı gerçekl eş tiğ ine b ir saniye geçec eğ i için ekrana aynı
saat değ eri 10 def a yaz mal ı dı r diye dü ş ü nü rü z . A ma b unun gerçekte b öyl e ol madı ğ ı nı
görü rü z . Tic k sayı sı nı 100 yaptı ğ ı mı z da programı n ekran çı ktı sı aş ağ ı daki gib i ol maktadı r.
E kran çı ktı sı nda b az ı saat değ erl erinin dah a f az l a sayı da b az ı l arı nı n ise dah a az sayı da
yaz ı l dı ğ ı nı görü yorsunuz . Bu demek ol uyorki programı n b el l ek durumuna ve iş l emc inin
yoğ unl uğ una göre E l apsed ol ayı nı n meydana gel me sayı sı değ iş mektedir. Bunu
önl emenin yol u tic k sayı sı nı n, E l apsed ol ayı ndan sonra çal ı ş ac ak metot yada metotl arı n
topl am ic ra sü resinde dah a f az l a ol ac ak ş ekil de ayarl amaktı r.
E l apsed ol ayı na b irden f az l a metotodu il iş kil endireb il iriz . Ö rneğ in E l apsed ol ayı h er
saniyede b ir meydana gel diğ inde ekrana ayrı c a "M erh ab a E l apsed ol ayı ! " yaz dı rmak için
aş ağ ı daki programı yaz ab il irsiniz .
using System;
using System.Timers;
class Zamanlayici
{
static void Main()
{
Timer t = new Timer(1000);
t.Elapsed += new ElapsedEventHandler(SaniyelikIs);
t.Elapsed += new ElapsedEventHandler(Selam);
t.Start();
while(true)
{
}
}
Bu programda E l apsed ol ayı meydana gel diğ inde il k önc e Saniyel ikI s() metodu ardı ndan
da Sel am() metodu çağ rı l ac aktı r. Bunun seb eb i ol ayl a il iş kil endiril en metotl arı n ol ay
yönetic isine ekl enme sı rası dı r. İ l k ekl enen metot il k çağ rı l ı r. Bu programı n ekran çı ktı sı
ise aş ağ ı daki gib i ol ac aktı r.
Bu yaz ı nı n sonuna gel dik. Siz e Timer sı nı f ı nı n kul l anı mı nı ve dikkat etmeniz gereken b az ı
noktal arı aktarmaya çal ı ş tı m. Y az ı il e il gil i dü ş ü nc el eriniz el ektronik posta adresime
yaz ab il irsiniz .
C#' t a G ös t eric i( Point er) K u llanmak – I I
C# ' ta gösteric il erin kul l anı mı na yönel ik il k yaz ı da gösteric il ere giriş yapmı ş tı k, C# ' ta
gösteric il erin kul l anı mı nı 3 yaz ı l ı k b ir seri h al inde anl atmayı dü ş ü ndü m. Bu yaz ı da
gösteric i aritmetiğ ini ve f ix ed anah tar söz c ü ğ ü nü n kul l anı mı nı öğ renec eğ iz .
G österic il erin adres b il esenl erine sab it tamsayi degerl eri ekl eyeb il iriz , ayni sekil de
gösteric il erin adres b il eseninden sab it b ir tamsayi degerini çikarab il iriz . A nc ak
gösteric il ere uygul anan b u topl ama ve çikarma isl eml eri b iraz f arkl idir. G österic il ere sab it
degerl erin ekl enmesi yada b ir degerin gösteric iden çikaril masi gösteric ideki tü r b il eseni il e
yakindan il gil idir. Bir gösteric inin degerini b ir artirmak gösteric inin adres b il esenini,
gösteric inin tü rü nü n içerdigi b yte sayisi kadar artirmak demektir. A yni kural çikarma
isl emi içinde geçerl idir. Ö rnegin int tü rü nden b ir gösteric i il e 1 sayisini topl amak
gösteric inin adres b il esenini 4 artirmak anl amina gel ir. Ç ü nkü int tü rü 4 b yte
b ü yü kl ü gü ndedir. A yni sekil de int tü rden b ir gösteric iden 1 sayisini çikarmak gösteric inin
adres b il esenini 4 eksil tmek anl amina gel ir. G österic il erl e yapil an b u tü r aritmetik
isl eml erin tamamina gösteric i aritmetigi denil mektedir.
G österic i aritmetigini dah a yakindan görmek için asagidaki programi yaz in ve sonuc unu
inc el eyin.
using System;
c l ass G osteric i
{
unsaf e static void M ain()
{
int* ptr1 = (int*)500;
c h ar* ptr2 = (c h ar*)500;
doub l e* ptr3 = (doub l e*)500;
b yte* ptr4 = (b yte*)500;
ptr1 + = 2;
ptr2 + = 5;
ptr3 + = 2;
ptr4 + = 6 ;
P rogrami / u nsa fe argü mani il e derl eyip çal istirdigimiz da asagidaki ekran görü ntü sü nü z
el de ederiz . P rogramda M ain() metodunun unsaf e ol arak isaretl endigine dikkat edin.
508
510
516
506
P rogramin çiktisindan da görü l dü gü ü z ere int tü rden b ir gösteric iye 2 sayisini ekl emek
gösteric inin adres b il esenini 2*4=8 kadar artirmistir. A yni sekil de c h ar tü rden b ir
gösteric iye 5 degerini ekl emek gösteric inin adres b il esenini 5*2 =10 kadar artirmistir.
Topl ama yerine çikarma isl emi yapil mis ol saydi b u sef er ayni oranda adres b il eseni
eksil timis ol ac akti.
G österic il er ü z erinde sadec e tamsayil arl a aritmetik isl eml er yapil ab il ir. G österic il er il e
asagidaki aritmetik operatörl eri kul l anab il iriz .
+ , - , -- , + + , -=, + =
void gösteric il erde h erh angi b ir tü r b il gisi ol madigi için b u tü r gösteric il er ü z erinde
aritmetik isl eml er yapil amaz . Ç ü nkü void tü rü nden b ir gösteric iye örnegin 1 ekl emek
istedigimiz de gösteric inin adres b il eseninin kaç b yte ötel enec egi b el l i degil dir.
G österic il er ü z erinde yapil ab il ec ek diger öneml i isl emde iki gösteric inin b irb irinden
çikaril masidir. G österic i tü rl eri ayni ol mak sartiyl a iki gösteric iyi b irb irinden çikarab il iriz .
A nc ak iki gösteric inin çikaril masi sonuc unda ü retil en deger b ir gösteric i tü rü degil dir. I ki
gösteric i arasindaki f ark, adres b il esenl erinin sayisal f arkinin gösteric i tü rl erinin
b ü yü kl ü gü nden kaç adet b yte miktari edec egidir. D iger b ir deyisl e adres b il esenl erinin
sayisal f arki al inip gösteric i tü rü nü n b yte miktarina göre b ir deger b el irl enir. I ki
gösteric inin f arki l ong tü rden b ir deger ü retir. I ki gösteric inin f arkina örnek verec ek
ol ursak, int tü rden 5008 adres il e int tü rden 5000 adresinin f arki (5008-5000) %
siz eof (int) tir. Y ani sonuç l ong tü rden 2 dir. A sagidaki programi yaz arak sonuc u
göreb il irsiniz .
using System;
c l ass G osteric i
{
unsaf e static void M ain()
{
int* ptr1 = (int*)500;
int* ptr2 = (int*)508;
D iger b ir il ginç nokta iki gösteric inin adres b il esenl erinin f arki gösteric i tü rl erinin
b ü yü kl ü gü nü n tam kati ol madiginda görü l ü r. Ö rnegin ptr2 gösteric isini taniml anmasini
sekl inde degistirdiginiz de b u sef er ekrana 1 yaz digini görü rsü nü z . Burdan çikarmamiz
gereken sonuç iki gösteric inin f arki adres b il esenl erinin sayisal f arkinin ol mamasidir.
D ikkat: I ki gösteric inin f arki l ong tü rden b ir deger ü retir. Bu yü z den iki gösteric inin f arki
açikc a b ir tü r dönü sü mü yapil madikça l ong tü rü nden kü çü k tü rden ol an degiskenl ere
atanamaz .
G österic il er il e kul l anil ab il ec ek diger operatörl er ise ==, < ve > gib i karsil astirma
operatörl eridir. Bu operatörl er iki gösteric inin adres b il esenini karsil astirip ture yada f al se
degeri ü retirl er. K arsil astirma operatörl eri gösteric il er için çok istisnai duruml ar disinda
anl aml i degil dir. Bu istisna duruml ardan b iri gösteric il eri kul l anarak diz i isl eml eri
yaptigimiz da görü l ü r.
f ix ed A nah t ar S özc ügü
Bil diginiz gib i C# ' ta taniml adigimiz ref erans degiskenl eri h eap b el l ek b öl gesindeki
adresl er temsil ederl er. A nc ak b iz adresl er yerine nesnenin ismini kul l aniriz . G ereksiz b il gi
topl ayic is(garb age c ol l ec tor) b el l ek optimiz asyonui açisindan h eap b el l ek b öl gesindeki
nesnel erin yerl erini h er an degistireb il ir. Bu yer degisiminden b iz im h ab erimiz ol maz ,
çü nkü nesnenin yeri degistigi anda b u nesneye ref erans ol an stac k b el l ek b öl gesindeki
degiskenin adres b il eseni de degistiril ir. D ol ayisiyl a b iz ayni ref erans il e f arkl i b el l ek
b öl gesini istegimiz disinda kul l anmis ol uruz . A nc ak b az i duruml arda gereksiz nesne
topl ayic isina b ir nesnenin adresini degistirmemesi için ikna etmek durumunda kal iriz . Bu,
öz el l ikl e sinif nesnel erinin ü ye el emanl arindan b irinin adresi il e isl em yapmamiz gerektigi
duruml arda karsimiz a çikar. Bir degiskenin adresinin b el irl enen b ir f aal iyet al ani b oyunc u
degismeden kal masi için b unu gereksiz nesne topl ayic isina b il dirmemiz gerekir. Bunun
için f ix ed anah tar söz c ü gü kul l anil ir.
Z aten f ix ed anah tar söz c ü gü nü kul l anmadan ref erans tü rü nden nesnel erin ü ye
el emanl arinin adresl erini el de etmemiz mü mkü n degil dir. Üye el emanl arinin adresl erini
el de edemedigimiz b u tü r nesnel ere managed type(yönetil en tip) denil mektedir. Buna
göre sinif l ar managed type kapsamina girmektedir.
using System;
c l ass M anagedType
{
pub l ic int x ;
pub l ic M anagedType(int x )
{
th is.x = x ;
}
}
c l ass G osteric i
{
unsaf e static void M ain()
{
M anagedType mt = new M anagedType(5);
M anagedType sinif inin x el emani deger tipi ol masina ragmen mt nesnesi ü z erinden x
degiskeninin adresi el de edil ememektedir. Ç ü nkü x degiskeninin adresi gereksiz nesne
topl ayic isi taraf indan h er an degistiril eb il ir. E ger yukaridaki kod geçerl i ol mus ol saydi x
degiskeninin adresi degistigi anda ptr1 gösteric isi nereye ait ol dugu b il inmeyen b ir adres
b il gisi tasiyor ol ac akti. x degiskeninin b ir b l ok içerisinde sab it adreste ol masini istiyorsak
asagidaki gib i f ix ed anah tar söz c ü gü nü kul l anmal iyiz .
using System;
c l ass M anagedType
{
pub l ic int x ;
pub l ic M anagedType(int x )
{
th is.x = x ;
}
}
c l ass G osteric i
{
unsaf e static void M ain()
{
M anagedType mt = new M anagedType(5);
Y ukaridaki f ix ed il e isaretl enmis b l okta x ' in adresinin degismeyec egi garanti al tina
al inmistir. Birden f az l a degiskeni f ix ed ol arak isaretl emek için asagidaki gib i b ir kul l anim
geçerl i kil inmistir.
G österic il erl e il gil i son yaz ı da, yapı gösteric il eri, gösteric il er il e diz i iş l eml eri ve
sta c k a llo c il e dinamik al an tah sisatı yapma gib i konul arı inc el eyec eğ iz .
C# ile N es ne Yönelimli Programlama I
Bu makal ede nesne yönel iml i programl ama tekniğ ine kadar kul l anı l an yaz ı l ı m
gel iş tirmedeki yakl aş ı ml ara göz atac ağ ı z . D ah a sonra nesne yönel iml i programl amanı n
temel kavraml arı ve neden b öyl e b ir tekniğ in kul l anı l dı ğ ı ü z erinde durac ağ ı z .
K imil erine göre geçtiğ imiz yü z yı l ı n en öneml i b ul uş u ol arak kab ul edil en b il gisayar
teknol oj isi, b aş döndü rü c ü b ir h ı z l a gel iş mektedir. Bil iş im sektörü ndeki değ iş iml er b az en
varol an teknol oj il ere yenil erinin ekl enmesi ş ekl inde ol ab il ir. D iğ er taraf tan b ir kı sı m
yenil ikl er vardı r ki b u al anda b ü yü k değ iş iml ere ve evriml ere yol açar. M esel a; kiş isel
b il gisayarl arı n kul l anı l maya b aş l anması veya internetin b el l i b aş l ı akademik kuruml arı n ve
askeri organiz asyonl arı n tekel inden al ı nı p tü m insanl ı ğ ı n h iz metine sunul ması gib i.
Hepimiz in b il diğ i gib i b ir b il gisayar sistemi iki ana parçadan ol uş ur. Bunl ar
donanı m(h ardw are) ve yaz ı l ı m(sof tw are). D onanı mı n yaz ı l ı m il e uyuml u çal iş ması
sonuc unda sisteml erimiz sorunsuz b ir ş ekil de b iz l ere h iz met verirl er. A yrı c a donanı mı n
amac ı mimz a uygun h iz met vermesi uygun yaz ı l ı mı n gel iş tiril ip kul l anı l ması na b agl ı dı r.
ı kinc i yakl aş ı m ise prosedü rel yakl aş ı mdı r. P rograml arda b ir çok iş in tekrar tekrar f arkl ı
değ erl eri kul l anı l arak yapı l dı ğ ı f arkedil di. M esel a h erh angi b ir programda iki tarih arası nda
ne kadar gü n ol duğ unu b ul mak b irçok kez gerek ol ab il ir. Bu durumda b aş l angı ç ve b itiş
tarih l erini al ı p aradaki gü n sayı sı nı veren b ir f onksiyon yaz ı l ab il ir ve b u f onksiyon ih tiyaç
duyul duğ u yerde uygun parametrel erl e çağ rı l ı p istenen sonuç el de edil eb il ir. P rosedü rel
yakl aş ı m P asc al ve C dil l erinde uz un yı l l ar b aş ari il e kul l anı l mı ş tı r.
N esne yönel iml i programl ama tekniğ i, diger yakl aş ı ml ara naz aran, yaz ı l ı m gel iş tiren
insanl ara b ü yü k avantaj l ar sağ l amaktadı r. Birinc isi karmaş ı k yaz ı l ı m proj el erinin
ü retil mesini ve b akı mı nı kol ayl aş tı rı yor ol ması dı r. D iğ eri ise program kodunun tekrar
kul l anı l ab il mesine (c ode-reusab il ity) ol anak sağ l aması dı r. Bu noktada program kodunun
tekrar kul l anı l ab il mesi prof esyonel yaz ı l ı m ş irketl erinin mal iyetl erini az al tmı ş tı r. D ol ayı si
il e programl arı n l isans ü c retl eri dü ş mü ş ve sektörü n sü rekl i ol arak c anl ı kal ması na ve
rekab et içinde gel iş mesine yardı mc ı ol muş tur.
N esne yönel iml i programl amada esas ol an, gerçek h ayatta varol an ol gul arı n
programl amaya aktarı l ması ndaki yeni yakl aş ı mdı r. P rosedü rel programl amada veril erimiz
ve f onksiyonl arı mı z vardı . Y ani veri ve b u veriyi iş l eyen metodl ar etraf inda dönü yordu
h erş ey.
A sl ı nda nesne yönel iml i programl amada da iki öneml i b irim veri ve veriyi iş l eyip mantı kl ı
sonuçl ar ü reten metodl ar b ul unur. A ma b urdaki f ark gerçek h ayattaki ol gul arı n da dah a
iyi göz l enip programl ama dü nyası na aktarı l ması ndadı r.
M esel a el imiz de b ir ü tü mü z ol sun. Ütü nü n markası , model i, rengi, çal ı stı ğ ı el ektrik vol taj ı ,
ne tü r kumaş l arı ü tü l eyeb il diğ i b u ü tü ye ait öz el l ikl erdir (veri). A ynı z amanda ü tü mü z ü
ı sı tab il iriz , ü tü l eme iş inde kul l anab il iriz ve soğ umaya b ı rakab il iriz . Bunl ar ise ü tü nü n
f onksiyonal arı dı r(metod). E ğ er ü tü il e il gil i b ir program yapmı ş ol sak ve nesne yönel iml i
programl ama tekniğ ini kul l ansak h emen b ir ü tü sı nı f ı (c l ass) ol uş tururduk. Bu sı nı f ta ü tü ye
ait b il gil er (veril er) ve ü tü il e yapab il ec eğ imiz iş l er(metod) b ul unurdu. O z aman nesne
yönel iml i programl ama da b ir sı nı f ta, sı nı f a ait veril er ve b u veril eri iş l eyip b ir takiı f aydal ı
sonuçl ar ü reten f onksiyonl ar/metodl ar b ul unur.
D ah ası , b iz b irtane ü tü sinif i tasarl arsak b u sı nı f tan istediğ imiz sayı da değ iş ik
ü tü l er(ob j ec t veya instanc e) yapab il iriz . A ğ agidaki ş ekil de ü tü sı nı f ı ve b u sı nı f tan
ol uş turduğ umuz nesl erin görsel ol arak anl atı mı b ul unmaktadı r.
A z önc e de değ indiğ imiz gib i, sı nı f b ir yaz ı l ı m kurgusudur ve gerçek h ayattaki h erh angi
b ir ol guyu model l eyen ve b u ol guya ait öz el l ikl eri(veri) ve davranı ş l arı (metdodl ar)
tarif l eyen yapı dı r.
c l ass Ütü
{
pub l ic int sı c akl ı k;
pub l ic string renk;
pub l ic string marka;
sı c akl ı k=15;
th is.renk=renk;
th is.marka= marka;
Y ukarı daki örnek programı mı z da önc e al tta b ul unan Ü tü sı nı f ı mı z ı inc el eyel im. Bu sı nı f ı n
sı c akl ı k, renk ve marka ol mak ü z ere ü ç adet verisi vardı r. A yrı c a Ütü sı nı f ı mı z ı n Ütü (string
renk, string marka) ş ekl inde tanı ml anmı ş yapı l andı rı c ı sı (c onstruc tor) vardı r.
Y apı l andı rı c ı l ar b ir sı nı f tan ol uş turul an nesnel erin il k değ erl erini atama ve b asl angı ç
iş l eml erini yapmak için kul l anı l ı rl ar. Ütü sı nı f ı nı mı z ı n yapı l andı rc ı sı , ol uş turul an h er ü tü
nesnesinin sı c akl ı ğ ı nı varsayı l an değ er ol arak 15 derec eye ayarl ı yor. A yrı c a paratmetre
ol arak al ı nan renk ve marka değ erl erini de atayı p, ü tü ye ait öz el l ikl eri ekrana yaz dı rı yor.
Ütü sı nı f ı na ait ol an diğ er metod ise I sı n(int derec e) ol arak tanı ml adı ğ ı mı z metoddur. Bu
metod ü tü nü n sı c akl ı ğ ı nı derec e parametresinde veril en değ er kadar artı rı p sonuc u string
tipinde geri dönderiyor.
Ü tü_ Ö rneg i sı nı f ı na geri dönersek, b urda sadec e M ain() metodunun b ul unduğ unu
görü rü z . M ain() metodu, C# dil inde h er programda b ul unması gereken z orundu b ir
metoddur. Ç ü nkü programı n çal iş tı rı l ması b uradan b aş l ar. A yrı c a h er C# programı nda
sadec e b ir tane M ain() metodu b ul unur. Ö rneğ imiz de M ain() metodundaki en öneml i
satir:
satı rı dı r. Bu satı rda Ütü sı nı f ı na ait ü tü 1 nesnemiz i ol uş turuyoruz . Y ukarı daki satı rdan da
göreb il ec eğ imiz gib i h erh angi b ir sı nı f a ait yeni nesneyi ol uş tururken genel ol arak ş u yapş
kul l anı l ı r:
N esnel erin en öneml i öz el l iğ i ref erans tipinde ol mal arı dı r. R ef erans tipl erinde b ir nesnenin
değ eri sakl anmaz . Sadec e nesnenin h af ı z adaki (h eap memory) yeri sakl anı r. Bir nesnenin
h af iz adaki yerini new operatörü geri dönderir. A ş ağ ı daki program kodu il e ref erans
tipl erine ait b ir kaç temel öz el l iğ i inc el eyel im:
using System;
c l ass Ütü
{
pub l ic int sı c akl ı k;
pub l ic string renk;
pub l ic string marka;
ı sterseniz kodumuz u inc el emeye yine Ütü sı nı f ı ndan b aş l ayal ı m. Bir önc eki örneğ e göre
sı nı f ı mı z da degiş ikl er yaptı k. Ütü sı nı f ı nı n öz el l ikl erini gösteren ayrı b ir metod yaz dı k. Bu
metod Ö z el l ikl er() isiml i ol sun. D oğ al ol arak Ütü sı nı f ı nı n yapı l andı rı c ı sı nda, sı nı f
ol uş turul duktan h emen sonra nesnenin öz el l ikl erini gösteren kı sı m kal dı rı l dı .
ş imdi ise Ütü _ Ö rnegi sı nı f ı ndaki M ain() metodu ü z erinde yoğ unl aş al ı m. Y ine, b irinc i
örnekte ol duğ u gib i, ü tü 1 nesnemiz i
il e ol uş turuyoruz . Sonra ü tü 1 nesnesinin öz el l ikl erini ekrana yaz dı rı yoruz . Bir sonraki
satı rda ise ü tü 1 nesnemiz i 50 derec e ı sı tı p sonuc u ekrana yaz ı yoruz .
satı rl arı nı yaz ı yoruz . Bir sonaki satı r programı mı z ı n en öneml i satı rı dı r. Bu satı rda ü t ü 2 =
ü t ü 1 if adesi il e ü tü 2 nesnesinin ref eransı nı ü tü 1 nesnesinin ref eransı na atı yoruz . D eğ er
tipl erinde "=" operatörü il e b ir değ iş kenin değ eri diğ erine kopyal anı r. A ma nesnel er
ref erans tipl eri ol dukl arı için, "=" operatörü b ir nesnenin ref eransı diğ erine atar. Bu
durumda ü tü 2 nesnesi artik ü tü 1' in el emanl arı nı n adresl erini içerir. Bu andan sonra
ü tü 2' nin eskiden gösterdiğ i sic akl ik, renk ve marka veril erine eriş memiz mü mkü n
değ il dir. A rtı k onl ar h af ı z ada b ir yerde ve b iz b il miyoruz . Bu veril erin h af ı z ada kapl adı kl arı
al anı .N E T F ramew ork' nun çöp topl ayı c ı sı (garb age c ol l ec tor) uygun gördü ğ ü b ir anda
temiz l eyec ektir.
ü tü 2 nesnesinin son durumda öz el l ikl erine b akac ak ol ursak gerçektende ü tü 1' i ref erans
ettiğ ini görü rü z . Y ukarı daki programı mı z ı çal ı ş tı rdı ğ ı mı z da aş ağ ı daki sonuc u el de ederiz :
Son ol arak ş u il ginç soruya c evap vermeye çal ı ş al ı m. "Bir önc eki program kodunun
sonuna aş ağ ı daki kı smı ekl ersek ne gib i b ir değ iş ikl ik ol ur?"
Y ukarı daki kodun ekl enmiş h al ini derl eyip çal ı ş tirmayı deneyel im. Sonuç aş ağ ı daki gib i
ol ac aktı r:
E vet ü tü 1 ve ü tü 2' nin son durumdaki öz el l ikl eri aynı dı r. Bu durumdan ş u sonuc a
ul aş ab il iriz : " ü tü 1 ve ü tü 2' nin h erh angi b iri il e öz el l ikl eri degiş tirirsek diğ eri de aynı
öz el l ikl ere sah ip ol ur. Ç ü nkü h er iki nesne de h af ı z ada aynı yere ref erans ediyorl ar."
Bu makal ede nesne yönel iml i programl amaya giriş yaptı k. N esne yönel iml i
programl amanı n iki temel kavramı ol an sı nı f (c l ass) ve nesne(ob j ec t)' yi inc el edik. Sonraki
makal el erde nesne yönel iml i programl amanı n diğ er öneml i öz el l ikerini b irl ikte inc el emek
dil eğ iyl e.
C#' t a G ös t eric i( Point er) K u llanmak – I I I
C# ' ta gösteric il erin kul l anı mı il e il gil i yaz ı diz isinin son b öl ü mü ol an b u yaz ı da göseric il er
il e diz i isl eml erinin nası l yapı l dı gi, stac kal l oc ı l e dinamik b el l ek tah sı satı nı n yapı l ması nı ve
son ol arak yapı (struc t) gösteric il erinin kul l anı l ı ş ı nı inc el eyec eğ iz .
Bil diğ iniz gib i diz i el emanl arı b el l ekte ardı ş ı l b ul unur. O h al de b ir diz inin el emanl arı nı el de
etmek için diz inin il k el emanı nı n adresini ve diz inin b oyutunu b il memiz yeterl idir.
System.A rray sı nı f ı diz il erinin el emanl arina gösteric il er yardimiyl a rah atl ı kl a ul asab il iriz .
Bunun için il k ol arak f ix ed il e isaretl enmis b ir b l ok içerisinde diz inin il k el emanı nı n
adresini b ir gösteric iye atamal ı yı z . A rdı ndan gösteric inin degerini b ir döngü içerisinde
b irer b irer artı rdı gı mı z da h er döngü de diz inin b ir sonraki el emanina ul aş mı ş ol uruz .
D iz il ere b u sekil de eriseb il memiz i sağ l ayan ise gösteric i aritmetiğ idir. Tab i diz il erin
el emanl arı nı n b el l ekte ardı ş ı l b ul unması da b u iş l emi b u ş ekil de yapmamı z ı sağ l ayan il k
etkendir.
Ş imdi yönetil en tü rden(managed) b ir diz inin el emanl arı na nası l eriş tiğ imiz i b ir örnek
ü z erinde inc el eyel im.
using System;
c l ass G osteric i
{
unsaf e static void M ain()
{
int[] a = {1,2,3,4};
1
2
3
4
sekl inde ekrana yaz dı rı l dı ğ ı nı görü rsü nü z . ( pro g ra mı derlerk en / u nsa fe a rg üma nı nı
k u lla nma yı u nu tma yı n). P rogramı n kritik noktası
f ix ed(int* ptr = &a[0])
satı rı il e diz inin il k el emanı nı n adresinin el de edil mesidir. Z ira diz inin diğ er el emanl arı da
sı rayl a il k el emandan itib aren h er el eman için adres değ eri 4 b yte artac ak ş ekl indedir.
D iger öneml i nokta ise f or döngü sü içindeki
*(ptr+ i)
if adesidir. Bu if ade h er döngü de ptr gösteric isinin adres b il eş eni, döngü degiş keni kadar
artı rı l ı yor, söz gel imi döngü degiş keni 1 ise ptr' nin adres b il eş eni 4 artı rı l ı yor. Bu da diz inin
ikinc i el emanı nı n b el l ekte b ul unduğ u adrestir. İ çerik operatörü il e b u adrese eriş il diğ inde
ise diz inin el emanı el de edil mis ol ur.
G österic i diz il eri il e il gil i diğ er öneml i nokta gösteric il erin indeksl eyic i gib i
kul l anı l ab il mesidir. Ö rneğ in yukarı daki örnekte b ul unan
*(ptr+ i)
if adesini
ptr[i]
ş ekl inde degiş tireb il iriz . Burdan aş ağ ı daki eş itl ikl eri çı karab il iriz .
*(ptr+ 0) == ptr[0]
*(ptr+ 1) == ptr[1]
*(ptr+ 2) == ptr[2]
*(ptr+ 3) == ptr[3]
D iz il erin isiml eri asl inda diz il erin il k el emanı nı n adresini temsil etmektedir. Ö rneğ in
aş agı daki programda b ir diz inin il k el emanı nı n adresi il e diz inin ismi int tü rden b ir
gösteric iye atanı yor. Bu iki gösteric inin adres b il eş enl eri yaz dı rı l dı gı nda sonuc un aynı
ol duğ u görü l mektedir.
using System;
c l ass G osteric i
{
unsaf e static void M ain()
{
int[] a = {1,2,3,4};
Y önetil en(managed) tipl erl e çal ı ş mak h er ne kadar kol ay ol sa da b az ı perf ormans
eksikl ikl eri vardı r. Ö rneğ in b ir System.A rray diz isinin b ir el emanı na eriş mek il e stac k
b öl gesinde ol usturac agı mı z b ir diz inin el emanı na ul aş mamı z arası nda z aman açı sı ndan
b ü yü k b ir f ark vardı r. Bu yü z den yü ksek perf ormansl ı diz il erl e çal ı ş mak için System.A rray
sı nı f ı nı n dı ş ı nda stac k tab anl ı diz il er ol uş turmamı z gerekir. Stac k tab anl ı diz il er
yönetil emeyen diz il erdir. Bu yü z den b u tü r diz il eri kul l anı rken dikkatl i ol mal ı yı z . Ç ü nkü
h er an b iz e tah sis edil meyen b ir b el l ek al anı ü z erinde isl em yapiyor ol ab il iriz . A nc ak
yönetil en diz il erde diz inin sı nı rl arı nı aş mak mü mkü n degil dir. Hatı rl arsanı z b ir diz inin
sı nı rl arı aş ı l ı nc a çal ı ş ma z amanı nda I ndexO u tO fR a ng eExc eptio n istisnai durumu
meydana gel iyordu. O ysa stac k tab anl ı diz il erde diz inin sı nı rl arı b el irl i degil dir ve tab iki
diz inin sı nı rl arı nı aş mak kı sı tl anmamı ş tı r. E ğ er diz inin sı nı rl arı aş ı l mı ş sa muh temel en b u
iş l em b ir h ata sonuc u yapı l mı ş tı r. Hiçb ir programc ı kendisine ait ol mayan b ir b el l ek
al anı nda isl em yapmamal ı dı r. A ksi h al de sonuçl arı na katl anması gerekir.
Stac k tab anl ı diz il er sta c k a llo c anah tar söz c ü ğ ü il e yapı l ı r. stac kal l oc b iz e istediğ imiz
miktarda stac k b el l ek b öl gesinden al an tah sis eder. V e tah sis edil en b u al anı n b aş l angı ç
adresini geri döndü rü r. D ol ayı sı yl a el imiz de ol an b u b asl angı ç adresi il e stac kal l oc il e b iz e
ayrı l mı ş ol an b ü tü n b el l ek b öl gel erine eriş eb il iriz . stac kal l oc anah tar söz c ü ğ ü nü n kul l anı mı
aş ağ ı daki gib idir.
! sta c k a llo c ile ta hsis edilen b ellek a la nla rı nı n a rdı ş ı l o lma sı g a ra nti a ltı na
a lı nmı ş tı r.
stac kal l oc il e al an tah sisatı yapı l ı r. A nc ak al an tah sisatı yapı l an b el l ek b öl gesi il e il gil i
h içb ir isl em yapı l maz . Y ani yukaridaki deyim il e, içinde tamamen rastgel e değ erl erin
b ul undugu 40 b yte' l ı k b ir al anı mı z ol ur. Bu al andaki değ erl erin rastgel e degerl er ol duğ unu
görmek için asagidaki programı yaz ı n.
using System;
c l ass G osteric i
{
unsaf e static void M ain()
{
int * diz i = stac kal l oc int[10];
! Y u k a rı da k i pro g ra mda b ir g ö steric i ile b ellek tek i a rdı ş ı l b ö lg elere indek sleyic i
o pera tö rü ile na sı l eriş tiğ imize dik k a t edin.
P rogramı /unsaf e argü mani il e b erab er derl eyip çal ı ş tı rdı ktan sonra aş ağ ı daki ekran
görü ntü sü nü el de etmeniz gerekir. Tab i b u değ erl er rastgel e ol dugu için siz deki görü ntü
tamamen f arkl ı ol ac aktı r. R astgel e değ erden kası t çal ı ş ma z amanı nda R andom gib i b ir
sı nı f in kul l anı l ı p rastgel e b ir sayı ü retil mesi değ il dir. Burdaki sayı l ar dah a önc e çal ı ş miş
ol an programl ardan kal an çöp değ erl erdir.
satı rı ndaki
diz i[i]
yerine
*(diz i + i)
yaz mamı z h erh angi b irş eyi değ iş tirmez di. D ah a önc e b u iki kul l anı mı n eş değ er ol duğ unu
b el irtmiş tik.
Stac k tab anl i diz il erl e il gil i b il inmesi gereken en öneml i nokta diz inin sı nı rl arı nı n aş ı l ması
il e il gil idir. D ah a önc eden de denil diğ i gib i stac k tab anl i diz il erin sı nı rl arı aş ı l dı ğ ı nda
h erh angi b ir uyarı veril mez . E l b etteki program b aş arı yl a derl enir anc ak çal ı mma
z amanı nda b iz e ait ol mayan b ir adresin içeriğ ini degiş tirmiş ol uruz ki b u da b ir
programc ı nı n b aş ina gel eb il ec ek en teh l ikel i durumdur. Ö rneğ in aş ağ idaki programda
stac kal l oc il e 10 int tü rü nden nesnel ik al an tah sis edil mektedir. Buna rağ men istediğ imiz
kadar al anı kul l anab il iyoruz .
using System;
c l ass G osteric i
{
unsaf e static void M ain()
{
int * diz i = stac kal l oc int[10];
using System;
c l ass G osteric i
{
unsaf e static void M ain()
{
Consol e.W rite("D iz i b oyutu gir: ");
uint b oyut=0;
try
{
b oyut = Convert.ToU I nt32(Consol e.R eadL ine());
}
c atc h (F ormatE x c eption e)
{
Consol e.W riteL ine(e.M essage);
}
Bu program il e çal ı ş ma z amanı nda 7 el emanl ı stac k tab anl ı b ir diz inin ol uş turul duğ unu
aş ağ ı daki ekran görü ntü sü nden göreb il irsiniz .
int,c h ar,doub l e gib i veri tü rl eri asl ı nda b irer yapı dı r. Bu konun b aş ı nda b ü tü n değ er tipl eri
il e gösteric i tanı ml ayab il ec eğ imiz i söyl emiş tik. C# temel veri tü rl erinin yanı sı ra kendi
b il dirdiğ imiz yapı l ar da değ er tü rü ndendir. O h al de b ir yapı gösteric isi tanı ml ayab il memiz
doğ al b ir durumdur. Y apı gösteric il erinin tanı ml anması temel veri tü rl erinden gösteric i
tanı ml ama il e aynı dı r. O rdaki kural l arı n tamamı yapı l ar içinde geçerl idir. F akat yapı
gösteric isi tanı ml amanı n b ir ş artı vardı r, oda yapı nı n ü ye el emanl arı nı n tamamı nı n değ er
tipi ol ma z orunl ul uğ udur. Ö rneğ in aş ağ ı daki yapı gösteric isi tanı ml aması geçersiz dir.
using System;
struc t Y api
{
int x ;
c h ar c ;
string s;
c l ass Stac kA l l oc
{
unsaf e static void M ain()
{
Y api yapi = new Y api(2,' a' ,"D eneme");
Y ukarı da ' Y api' tü rü nden gösteric inin tanı ml anamaması nı n seb eb i yapı nı n yönetil en
tü rden(managed type) b ir ü ye el emanı nı n b ul unması dı r. Bu ü ye el emanı da doğ al ol aral
string tü rü dü r. Y apı b il diriminden string tü rü nü çı karı p aş ağ ı daki gib i il gil i değ iş ikl ikl eri
yaptı ğ ı mı z da ' Y api' tü rü nden gösteric il eri tanı ml ayab il iriz .
using System;
struc t Y api
{
int x ;
c h ar c ;
pub l ic Y api(int x ,c h ar c )
{
th is.x = x ;
th is.c = c ;
}
}
c l ass Stac kA l l oc
{
unsaf e static void M ain()
{
Y api yapi = new Y api(2,' a' );
Y apı gösteric il eri ü z erinden yapı gösteric isinin adresine il iş kin nesnel erin el emanl arı na
öz el b ir operatör ol an -> o pera tö rü il e eriş eb il iriz . Ö rneğ in yukarı daki programı n M ain()
metodunu asağ ı daki gib i değ iş tirdiğ iniz de ekrana yapı nesnesinin x ve c el emanl arı
yaz dı rı l ac aktı r. T a b i Y a pi' nı n üye a la ma nla rı nı pu b lic o la ra k değ iş tirmeniz
g erek ec ek tir. Ç ünk ü o k o pera tö rü ilede o lsa a nc a k pu b lic o la n elema nla ra
u la ş a b iliriz.
Y apı nı n pub l ic ol an el emanl arı na ok operatörü yerine yapı nesnesinin içeriğ ini * operatörü
il e el de edip nokta operatörü il e de ul aş ab il iriz . Buna göre yukarı daki M ain() metodu il e
asagidaki M ain() metodu eş değ erdir.
G österic il erin en çok kul l anı l dı ğ ı diğ er b ir uygul ama al anı da karakter iş l eml eridir. Bir
yaz ı yı karekter diz isi ol arak temsil edip yaz ı l ar il e il gil i iş l eml er yapı l ab il ir. C# ' taki string
tü rü nü n al tı nda geçekl eş en ol ayl arda z aten b undan ib arettir. K arakter diz il eri il e il gil i en
öneml i nokta b ir yaz ı yı c h ar tü rden b ir gösteric iye atayab il memiz dir. K arekter diz il eri ol an
stringl erdeki h er b ir karakter b el l ekte ardı ş ı l b ul unmaktadı r. D ol ayı sı yl a yaz ı daki il k
karakterin adresini b il diğ imiz de yaz ı daki b ü tü n karakterl ere eriş eb il iriz . C# ' taki string
tü rü yönetil en tip(managed type) ol dugu için c h ar tü rden b ir gösteric iye b ir yaz ı nı n il k
karekterinin adresini atamak için f ix ed anah tar söz c ü ğ ü nü kul l anmal ı yı z . A ş ağ ı daki
programda b ir yaz ı nı n c h ar tü rden gösteric iye nası l atandı ğ ı nı ve b u gösteric i il e yaz ı daki
h er karaktere ne ş ekil de eriş il diğ ini görü yorsunuz .
using System;
Buradaki en öneml i nokta ptr[i]' nin ' \0' karakteri il e karş ı l aş tı rı l dı ğ ı yerdir. G österic il er il e
b el l ekte c h ar tü rü nü n b ü yü kl ü gü kadar il erl erken yaz ı nı n nerede sonl andı gı nı b il emeyiz .
Bunun için
c h ar* ptr = "Sef er A l gan"
deyimi il e b el l eğ e yerl estiril en ' n' karakterinden sonra nul l değ erini if ade eden ' \0'
karekter yerl eş tiril ir. Bu karektere rastl anı l dı ğ ı z aman yaz ı nı n sonuna gel miş
b ul unuyoruz .
N ot: G österic il erl e il gil i yayı nl anan b u makal e diz isi yaz mı ş ol duğ um ve yakı nda P usul a
yayı nc ı l ı ktan çı kac ak ol an C# kitab ı ndan al ı nmı ş tı r.
. N E T ' t e D inamik K ont rol O lu ş t u rma
Bu yaz ı da w indow s ve w eb uygul amal arı nda dinamik kontrol l erin nası l ol uş turul ac ağ ı nı ve
ol uş turul an dinamik kontrol l ere eriş im yönteml erini inc el eyc eğ iz . A yrı c a b u yaz ı da
dinamik kontrol ol uş turma il e il gil i kapsaml ı b ir örnek kod yeral maktadı r.
Bir çok uygul amada(öz el l ikl e oyunl arda) kontrol l erimiz in sayı sı nı tasarı m aş aması nda
b il emeyeb il iriz . Ö rneğ in h epimiz in b il diğ i mayı n tarl ası oyununda, oyun al anı b ir çok
kareden ol uş maktadı r. Üstel ik oyun al anı , kul l anı c ı nı n isteğ ine göre değ iş eb il mektedir.
E ğ er tasarı m aş aması nda b ü tü n kontrol l er f orm ü z erine yerl eş tiril ş miş ol saydı h em b u
kontrol l erin yönetimi z orl aş ac aktı h emde gereksiz yere b ir çok kod yaz ı l mı ş ol ac aktı . Buna
b enz er b ir durum w eb f orml arı il e programl ama yaparken de görü l eb il ir. Ö rneğ in b ir
anket sisteminde anketin seçenekl eri kadar Ch ec kBox kontrol ü nü dinamik ol arak w eb
f ormunun ü z erine yerl eş tireb il memiz gerekir. E ğ er b u imkanı mı z ol masaydı W eb f orml arı
çok esnek b ir programl ama model i sunmaz dı . N eyse ki M ic rosof t tasarı mc ı l arı h erş eyi
dü ş ü nmü ş ... :)
Y ukarı daki deyiml eri b ir döngü içinde yapı p ol uş turduğ umuz Button kontrol l erinin il gil i
öz el l ikl erini değ iş tirdikten sonra dama tah tası nı rah atl ı kl a ol uş turab il iriz .
Ş imdi b u yaz ı nı n en al tı nda b ul unan l inki kul l anarak proj eyi b il gisayarı nı z a yü kl eyerek
proj eyi açı n. F orm1 sı nı f ı nı n içinde b ul unan aş ağ ı daki Tah atCiz () isiml i metodu
inc el eyerek kontrol l erin dinamik ol arak nası l yaratı l dı kl arı nı inc el eyin.
private void Tah taCiz (int Boyut1,int Boyut2, int E n, int Boy)
{
int satir =0;
int sutun =0;
if (i % Boyut2 == 0)
{
satir+ + ;
sutun = 0;
}
tb = new Button();
tb .N ame = "tb " + i.ToString();
tb .Tab I ndex = i;
tb .Tex t = i.ToString();
tb .Siz e = new System.D raw ing.Siz e(E n,Boy);
tb .L oc ation = p;
tb .F l atStyl e = F l atStyl e.Standard;
tb . C lic k + = new S ystem. Ev entH a ndler( this. b u tto n1_ C lic k );
Tah taCiz () isiml i metodu b iraz inc el eyel im. Bu metot kendisine gönderil en b il gil er ı ş ı ğ ı nda
f orm ü z erine dinamik b ir dama tah tası çiz mektedir. A yrı c a iş e yarar b ir kaç iş l em dah a
yapmaktadı r. Bu metoda gönderil en Boyut1 ve Boyut2 değ iş kenl eri dama tah tası nı n
b oyutl arı nı b el irtmektedir. E n ve Boy parametrel eri ise tah tadaki h er b ir karenin enini ve
b oyunu b el irtmektedir. Bu b il gil eri parametre ol arak al mamı z istediğ imiz b oyutta dama
tah tası nı çiz eb il ec eğ imiz anl amı na gel mektedir. Z aten f orm ü z erine konul an b ir menü
yardı mı yl a dama tah tası nı n b oyutu ve karel erin en ve b oyu istenil diğ i gib i
değ iş tiril mektedir. Bu metot sadec e b utonl arı n f orm ü z erine yerl eş tiril mesinden
soruml udur. R enkA yarl a() isiml i diğ er b ir metot ise yerl eş tiril en b u b utonl arı n b ir
al goritmaya göre renkl erini ayarl amayı sağ l amaktadı r. Bu metot içinde ol uş turul an b uton
kontrol l erine b aş ka metotl ar içinde eriş eb il mek için ol uş turul an h er kontrol gl ob al
dü z eyde tanı ml anan Butonl ar isiml i b ir A rrayl ist kol eksiyonuna ekl enmektedir. Bu
metottaki diğ er öneml i b ir satı r ise ol uş turul an dama tah tası nı nı n b oyutl arı na göre f orm
nesnesinin yeniden ş ekil l endiril mesidir. Bu iş l em
th is.Cl ientSiz e = new Siz e(tb .W idth *Boyut2 ,tb .Heigh t*Boyut1);
N o t: Her b ir Button kontrol ü nü n yanyana ve al t al ta nası l yerl eş tiril diğ ini dah a iyi
anl amak için siz e tavsiyem kağ ı t ü z erine b ir dama tah tası çiz ip h er b ir karenin konumuna
il iş kin matematiksel b ir if ade b ul un. Böyl ec e h erş ey dah a açı k ol ac aktı r.
A ş ağ ı daki satı rda h er b ir b uton kontrol ü nü n Tex t öz el l iğ i döngü değ iş keni ol an i' ye
atanmaktadı r.
tb .Tex t = i.ToString();
D inamik kontrol l eri ol uş turma il e il gil i diğ er b ir öneml i nokta da kontrol l ere il iş kin
ol ayl arı n nası l çağ rı l ac ağ ı dı r. D ikkat ederseniz yukarı daki metotta ol uş turul an b ü tü n
kontrol l erin Cl ic k ol ayı na E ventHandl er temsil c isi yardı mı yl a b utton1_ Cl ic k() metodu
il iş tiril miş tir. O l uş turul an b utonl ardan h erh angi b irine tı kl adı ğ ı nı z da b u metot iş l etil ec ektir.
P eki h ani b utonun tı kl andı ğ ı nı nası l anl ayac ağ ı z . Bunun için b utton1_ Cl ic k() metodunun
b il dirimine b akal ı m.
Y ukarı daki metodun b ir parametresi ol an sender değ iş keni b u metodun h angi b utton' un
tı kl anması sonuc u iş l etil diğ ini tutmaktadı r. Biz e b u imkanı sağ l ayan el b etteki
E ventHandl er temsil c isidir(del egate).
D önü ş ü m operatörü kul l anı l arak sender nesnesi Button nesnesine dönü ş tü rü l ü mektedir.
(Bu iş l eme unb ox ing denil diğ ini de h atı rl atmak isterim)
A ş ağ ı daki ekran görü ntü sü ndeki dama tah tası nı n b içimi uygul amadaki A yarl ar
menü sü ndeki R enk sekmesi tı kl anarak ol uş turul ab il ir.
N o t: D ama tah tası b içiminde b ir f orm ol uş ması için R enk Seçimi penc eresindeki G radyan
K atsayı sı ortal anmal ı dı r. R enk ayarl ama iş l eminin nası l yapı l dı ğ ı b u yaz ı kapsamı nda
ol madı ğ ı için detayl arı nı anl atmayac ağ ı m. R enkA yarl a() isiml i metodu inc el emeniz i
tavsiye ediyorum.
W eb f orml arı il e dinamik kontrol ol uş turmak yukarı da anl attı kl arı mdan f arkl ı değ il . Y eni
b ir A SP .N E T uygul aması açarak aş ağ ı daki gib i b ir f orm tasarl ayı n.
D inamik ol arak ol uş turac ağ ı mı z kontrol l eri P age sı nı f ı na akl eyeb il ec eğ imiz gib i
P l ac eHol der kontrol ü nü de kul l anab il iriz . Ben b u iş için P l ac eHol der kontrol ü nü terc ih
ettim.
"O l uş tur" isiml i b utonun Cl ic k ol ayı na il iş kin metodunu aş ağ ı daki gib i değ iş tirip sonuc u
inc el eyel im.
P roj eyi derl eyip çal ı ş tı rı n ve Tex tBox kutusuna b ir tamsayı girip "O l uş tur" b utonuna
tı kl ayı n. İ ş l erml eri b aş arı il e yaptı ysanı z aş ağ ı daki gib i "P l ac eHol der" kontrol ü içinde 4
adet Tex tBox kontrol ü dinamik ol arak yerl eş tiril ec ektir.
N ot : Sunuc u kontrol ü ol mayan < b r> etiketinin L iteral Control ol arak tanı ml andı ğ ı na
dikkat edin.
D inamik kontrol l eri ol uş turmayı öğ rendiğ iniz e göre artı k w eb tab anl ı b ir mayı n tarl ası
oyunu yapmanı n z amanı gel di sanı rı m :) Biraz çab a il e b u oyunu rah atl ı kl a
yapab il ec eğ iniz i dü ş ü nü yorum.
Vis u al C#. N E T 2 0 0 3 ' t eki Yenilikler
Bu yaz ı da V isual StudioN E T 2003 il e b irl il kte gel en V isual C# dil inde yapı l an öneml i
değ iş ikl ikl ere ve V isual Stdio.N E T gel iş tirme ortamı nı n(I D E ) yeni öz el l ikl erine
değ inil ec ektir. Bu yeni öz el l ikl er ve değ iş ikl ikl er 3 ana b aş l ı k al tı nda inc el enec ektir :
D erl eyic i ve dil deki değ iş ikl ikl er, proj e gel iş tirme il e il gil i değ iş ikl ikl er ve V S.N E T 2003
I D E ' sindeki değ iş ikl er.
G iriş
Bil diğ iniz gib i 2001 yı l ı ndan b eri C# dil i E CM A (E uropean Computer M anuf ac turer' s
A ssoc ation) taraf ı ndan standart h al e getiril miş tir. Bu h erh angi b ir kurum veya kurul uş un
istediğ i takdirde E CM A -334 standartl arı na uymak koş ul u il e kendi C# derl eyic isini
ü reteb il ec eğ i anl amı na gel mektedir. N itekim E CM A -334 standartl arı çerçevesi içerisinde
ş u anda f arkl ı pl atf orml ar için gel iş tiril miş C# derl eyic il eri b ul unmaktadı r. Bu derl eyic il er
içerisinde en çok b il inen ve kul l anı l anı M ic rosof t' un V isual C# derl eyic isidir. M ic rosof t,
E CM A standartl arı na b ağ l ı kal mak koş ul u il e kendi derl eyic isini istediğ i ş ekil de
b içiml endireb il mektedir. Bu yaz ı da V isual C# derl eyic isine ve dil in yapı sı na 2003
versiyonu il e b irl ikte gel en yenil ikl eri inc el eyec eğ iz . A yrı c a M ic rosof t' un V isual Studio.N E T
yaz ı l ı m gel iş tirme pl atf ormu I D E ' sine yeni ekl ediğ i b ir takı m öz el l ikl eri inc el eyec eğ iz .
V isual C# 2003 versiyonunda iki ana değ iş ikl ik yapı l mı ş tı r. Bu değ ş ikl ikl er eski kodl arı n
çal ı ş maması na sağ l ayac ak nitel ikte değ il dir. Bu değ iş ikl ikl erin il ki # line ö niş lemc i
k o mu tu du r. # l ine öniş l emc i komutu eski versiyonda z aten b ul unmaktaydı , yeni
versiyonda # l ine öniş l emc i komutuna yeni b ir anl am dah a yü kl enmiş tir. Y eni kul l anı mda,
iki # l ine komutu arası nda kal an kod satı rı D eb ugger programı için b il gi sağ l amaz . Y ani
D eb ugger için b u kodl ar önemsiz dir. P rogram deb ugger il e çal ı ş tı ğ ı nda il gil i kod satı rl ara
dikkate al ı nmaz . D ikkat etmemiz gereken nokta derl eme iş l eminin normal b içimde
yapı l ması dı r. Z ira # l ine öniş l emc i komutuna yü kl enen b u anl am sadec e D eb ugger(h ata
ayı kl ayı c ı ) programı nı il gil endirmektedir. # l ine öniş l emc i komutunun b u anl amda
kul l anı l ması için " hidden" parametresinin kul l anı l ması gerekmektedir. A ş ağ ı da # l ine
öniş l emc i komutunun kul l anı l ması ve sonuçl arı nı n görü l mesi adı m adı m anl atı l maktadı r.
using System;
# line hidden
# line defa u lt
K ı rmı z yaz ı l ı satı ra b ir b reakpoint ekl edikten sonra D eb ugger il e b irl ikte programı
derl eyin. Bunun için yapmanı z gereken F 5 tuş una b asmak yada D eb ug menü sü nden Start
sekmesini seçmektir. P rogram çal ı ş tı ğ ı nda programdaki h er 3 satı rı n da ekrana
yaz dı rı l dı ğ ı nı görec eksiniz , anc ak kontrol D eb ugger programı na geçtiğ inde D eb ug
menü sü ndeki StepO ver(F 10) komutu il e program içinde satı r satı r il erl erken D egugger
programı nı n ikinc i satı rl a il gil enmediğ ini görec eksiniz .
D iğ er b ir değ iş ikl ik ise X M L yorum satı rl arı il e il gil idir. Bil diğ iniz gib i C# kodu içerisinde
X M L f ormatı nda yorum satı rl arı ekl eneb il mektedir. Bu yorum satı rl arı metotl ar, sı nı f l ar ve
diğ er tipl er h akkı nda dökü mantasyon sağ l amk için yaz ı l maktadı r. D erl eme iş l eminde
istenirse b u yorum satı rl ar C# derl eyic isi taraf ı ndan ayı kl anarak rapor h al inde sunul ab il ir.
E ski versiyonda X M L yorum satı rl arı 3 tane ters b öl ü karekterinden sonra yaz ı l ı rdı .
Ö rneğ in sı kl ı kl a gördü ğ ü mü z "summary" el ementi aş ağ ı daki gib i yaz ı l ab il ir
Y eni versiyonda X M L yorum satı rl arı /** ve */ karekterl eri arası nda da yaz ı l ab il ir h al e
getiril miş tir. Bu yeni kural a göre aş ağ ı daki yaz ı m b içiml eri il e X M L yorum satı rl arı
ol uş turul ab il ir.
/**
< summary>yorum< /summary>
*/
/**
* < summary>
* yorum< /summary>*/
Bunl arı n dı ş ı nda b ir önc eki versiyonl a yeni versiyondaki kul l anı ml arı b irl eş tirip aynı
kaynak kod içinde aş ağ ı daki gib i de kul l anab il iriz .
/**
< summary>Y orum
satiri
*/
/// < summary>
V isual C# 2003 derl eyic isinin ü rettiğ i b az ı kodl arda ve içsel mekaniz mal arda da değ iş ikl ik
ol muş tur. Bu değ iş ikl ikl erden en öneml il eri öz el l ik(property) b il diriminde ve f oreac h
döngü yapı sı nı n çal ı ş ma mantı ğ ı nda görü l mektedir.
Sı nı f l arı n b ir ü ye el emanı ol an öz el l ik b il dirimi set ve get anah tar söz c ü kl eri il e yapı l ı r. Bu
yü z den b u öz el l ikl ere genel l ikl e "setter" ve "getter" da denil mektedir. Ö z el l ik b il dirimi C#
derl eyic isi taraf ı ndan öz el metotl ara çevril ir. Bu metotl ar sı rası yl a get_ O z el l ikI smi() ve
set_ O z el l ikI smi() metotl arı dı r. D ol ayı sı yl a b ir nesne ü z erinden h erh angi b ir öz el l iğ i
çağ ı rdı ğ ı mı z da asl ı nda b ir metot çal ı ş tı rmı ş ol uyoruz . Z aten C+ + dil inde b u tü r iş l eml eri
yapmak için G et ve Set il e b aş l ayan çeş itl i metotl ar tanı ml anı rdı . C# b u iş l eml eri b iraz
dah a soyutl aş tı rarak kul l anı c ı nı n dah a rah at çal ı ş ması nı sağ l amı ş tı r.
c l ass D eneme
{
pub l ic int a
{
get
{
return 5;
}
set
{
val ue = 5;
}
}
satı rl arı ndaki d. a ; il e a öz el l iğ inin set b l oğ unun mu çal ı ş tı rı l ac ağ ı yoksa set_ a()
metodunun mu çal ı ş tı rı l ac ağ ı b el l i değ il dir. Bu tü r b ir b il dirimin derl eme h atası na yol
açması gerekir. Ç ü nkü a öz el l iğ inin b il dirimindeki set ve get b l okl arı sayesinde z aten
get_ a() ve set_ a() metot b il diriml eri yapı l mı ş tı r. V isual C# 2003 derl eyic isi il e b u sı nı f
b il dirimini içeren b ir kaynak kod derl enemeyec ektir.
N o t: A rayü z l erde b il dirimi yapı l mı ş öz el l ikl er için derl eme z amanı nda get_ O z el l ik() ve
set_ O z el l ik() gib i iki metot tanı mı yapı l maz . Bu yü z den aş ağ ı daki kodda I A rayü z
arayü z ü nden tü remiş ol an sı nı f içinde a öz el l iğ inin get ve set b l okl arı tanı ml anı rken
set_ a() ve get_ a() metotl arı kul l anı l amaz .
D erl eyic inin yapı sı ndaki diğ er b ir değ iş ikl ik f oreac h döngü sü nü n iş l etil mesi sı rası nda
görü l mektedir. Bil diğ iniz gib i f oreac h il e iteratif b ir ş ekil de tü rl ere ait diz il erin
el emanl arı na eriş memiz mü mkü n, anc ak b ü tü n tü rl er için f oreac h döngü sü nü
kul l anamayı z . Bunun için f oreac h il e kul l anı l ac ak tü rl erin b az ı metotl arı ve öz el l ikl eri
sağ l aması gerekir. Bu metotl ar ve öz el l ikl er I E numerator arayü z ü içinde b il diril miş tir.
f oreac h döngü sü nü n b itiminde C# derl eyic isi döngü de kul l anı l an tü rü n I D isposab l e
arayü z ü nü uygul ayı p uygul amadı ğ ı nı kontrol etmiyordu. f oreac h il e kul l anı l an tü r
I E numerator arayü z ü nü uygul ası n yada uygul aması n V isual C# 2003 derl eyic isi
I D isposab l e arayü z ü nü n uygul anmı ş ol up ol madı ğ ı nı kontrol eder ve b u sayede
I D isposab l e arayü ndeki D ispose() metodu çağ rı l ı r.
G öz e çarpan diğ er b ir değ iş ikl ik ise nitel ikl erin kul l anı mı nda görü l mektedir. private
el emanı ol an nitel ikl er eski versiyonda kul l anı l ab il iyordu anc ak yeni derl eyic ide sadec e
pub l ic nitel ik el emanl arı kul l anı l ab il mektedir. Ö rneğ in D eneme isiml i nitel ik sı nı f ı ve b u
sı nı f ı n private ü ye el emanı ol an O z el l ik b il diril miş ol sun. Buna göre aş ağ ı daki metot
b il dirimi yeni derl eyic i için geçersiz dir.
N ot: Y ukarı daki b il dirim V isual C# 2002 derl eyic isi için geçerl idir.
D iğ er b ir değ iş ikl ik enum sab itl erinin artı k c h ar tü rü ne dönü ş tü rü l eb il mesidir. Ö rneğ in
aş ağ ı daki programı derl eyip çal ı ş tı rdı ğ ı nı z da ekrana ' L ' karekteri yaz dı rı l ac aktı r. (L
karekterinin unic ode karş ı l ı ğ ı 7 6 ' dı r)
using System;
enum Harf l er
{
A ,B = 7 6 ,C
}
c l ass Cl ass1
{
static void M ain()
{
c h ar c = (c h ar)Sef er.B;
Consol e.W riteL ine(c );
}
}
Y ukarı da anl atı l an değ iş ikl ikl erin tamamı uygul ama perf ormansı nı artı rmak ve E CM A
standartl arı na dah a sı kı b ağ l ı l ı k amac ı yl a yapı l mı ş tı r. Bir önc eki versiyonda E CM A
standartl arı na uymayan kural l ar ve b az ı b ug' l ar yeni versiyonda dü z el til miş tir.
1- G el iş tirdiğ imiz uygul amal arı derl erken çeş itl i uyarı l ar yada h atal ar al ab il iriz . Bu yaz ı l ı m
gel iş tirmenin doğ al b ir sü rec idir. Baz ı duruml arda derl eyic inin verdiğ i uyarı l ar gerçekten
c an sı kı c ı ol ab il ir. Baz ende b u uyarı l ar programc ı nı n ol ası b ir h ataya karş ı önl em al ması
için ol ab il ir. V S.N E T 2003 ortamı nda proj e derl enirken b az ı uyarı l arı n veril memesini
sağ l ayab il iriz . K omut satı rı derl eyic isinde b u iş l em / no w a rn argü manı il e yapı l ı r. Ö rneğ in
derl eme iş l emi sı rası nda CS0050 ve CS006 0 kodl u uyarı nı n veril memesi için c sc
derl eyic isi aş ağ ı daki gib i çal ı ş tı rı l ı r.
V S.N E T kul l anarak b u uyarı engel l eme iş i proj e öz el l ikl erinden ayarl anı r. Sol ution E x pl orer
penc eresinde proj eye sağ tı kl ayı p proj e öz el l ikl eri penc eresinden "Conf iguration
P roperties" sekmesini ardı ndan "Buil d" seçeneğ ini seçin. A ş ağ ı daki ekran görü ntü sü ndeki
al ana uyarı kodl arı nı noktal ı virgü l il e b irb irinden ayrı l ac ak ş ekil de yaz ı n.
2- Y eni versiyon il e b irl iktte istersek / no stdlib argü manı nı kul l anarak msc orl ib .dl l
kü tü ph anesini programl arı mı z a ekl emeyeb il iriz . Bil diğ iniz gib i b ü tü n System isim al anı ve
b u isim al anı nda b il diril miş tü rl er msc orl ib .dl l kü tü ph anesinde b ul unmaktadı r. K omut
satı rı ndan
c sc dosya.c s /nostdl ib -
ş ekl indeki b ir derl eme il e standart kü tü ph ane ol an msc orl ib .dl l uygul amamı z a ekl enmez .
Bu iş l emi kendi System isim al anı mı z ı b il dirmek için kul l anab il iriz .
/nostdl ib + ş ekl indeki kul l anı m varsayı l an kul l anı m il e eş değ erdir, yani msc orl ib .dl l
kü tü ph anesi uygul amaya ekl enir.
V S.N E T ortamı nda b u değ iş ikl iğ i yapmak için proj e öz el l ikl erinden "Conf iguration
P roperties" sekmesini ardı ndan "A dvanc ed" seçeneğ ini seçin. Bu penc ereden "D o not use
M sc orl ib " seçeneğ ini aş ağ ı daki gib i true yapı n.
3- P roj e öz el l ikl eri penc eresinde "Common P roperties" seçeneğ indeki "Buil d E vents"
kı smı ndaki al anl arı dol durarak proj enin ol uş turul ması sı rası nda ve proj e ol uş turul duktan
sonra çal ı ş tı rı l ac ak b atc h komutl arı yaz ı l ab il ir. Ö nc eden tanı ml anmı ş b ir kaç makroyu da
kul l anmak mü mkü ndü r. "P ost-Buil d E vent Command L ine" seçeneğ i il e il gil i 3 durum
söz konusudur. Bunl ar b atc h komutl arı nı n
4- W eb ve W indow s uygul amal arı için b irden f az l a çal ı ş ma z amanı desteğ i sağ l amak
mü mkü ndü r. Ö rneğ in .N E T F ramew ork 1.0 ve .N E T F ramew ork 1.1 çal ı ş ma z amanı nı
destekl eyec ek ve b u ortaml arda çal ı ş ab il ec ek uygul ama gel iş tirmek mü mkü ndü r. Bu ayarı
yapmak için proj e öz el l ikl eri penc eresindeki "Common P roperties" sekmesindeki
"G eneral " sayf ası ndan "Supported R untimes" öz el l iğ ini değ iş tirmek gerekir. Bu öz el l iğ e
tı kl anı l dı ğ ı nda aş ağ ı daki penc ere il e karş ı l aş ı l ı r.
Bu ayar yapı l ı rken dikkat edil mesi gereken nokta .N E T F ramew ork 1.1 ' deki b az ı
öz el l ikl erin 1.0 versiyonunda b ul unmamaı sı dı r. Bu yü z den 1.1 versiyonunda gel iş tiril en
proj el erin 1.0 versiyonunda çal ı ş ab il mesi için ortak öz el l ikl erin b ul unması gerekir.
V S.N E T I D E ' si gel iş tiric i için b ü yü k kol ayl ı kl ar sağ l amaktadı r. Bu kol ayl ı kl arı n en b il ineni
ve en iş e yarayanı I D E ' nin akı l l ı ol ması dı r. I D E , dil in kural l arı na göre l egal ol an b ir çok
ol ayı b iz im için otomatik yapmaktadı r. Ö rneğ in b ir nesnenin metotl arı nı ve öz el l ikl erini ' .'
operatörü nden sonra göreb il memiz gib i. V S.N E T 2003 I D E sine h oş unuz a gidec ek yeni
akı l l ı öz el l ikl er ekl enmiş tir. Bu kı sı mda b u yeni öz el l ikl eri görec eğ iz .
1- G öz e çarpan il k değ iş ikl ik ol ayl ara yeni b ir metot ekl eme sı rası nda görü l mektedir.
V S.N E T tasarı m ekranı nda b ir kontrol e ait ol ayı iş l emek istediğ imiz de P roperties
ekranı nda il gil i ol ayı seçip metot ismini yaz ı yorduk. Y eni versiyonda b u iş l eml er kod
editörü nden de yapı l ab il mektedir. Bir ol aya + = operatörü il e b ir metot ekl emek
istediğ imiz de "TA B" tuş una b asarsak ol ayı yönetec ek temsil c i new operatörü il e ekl enir.
Tekrar "TA B" tuş una b ası l dı ğ ı nda ol ayı yönetec ek temsil c inin temsil edec eğ i metodun
prototipine uygun b ir "event h andl er" metodunun b il dirimi otomatik ol arak yapı l ı r.
2- D iğ er b ir yeni öz el l ik arayü z l erin tü retil mesi sı rası nda görü l ü r. Bil diğ iniz gib i b ir sı nı f b ir
arayü z den tü retil iyorsa arayü z de b il diril miş ol an b ü tü n öz el l ik ve metotl arı n tü reyen
sı nı f ta tanı ml anması yani uygul anması gerekir. V S.N E T I D E si tü retil en arayü z deki
el eman b il diriml erini tü reyen sı nı f ta otomatik ol arak gerçekl eş tirir. A ş ağ ı daki ekran
görü ntü sü nde b u iş l emin nası l yapı l dı ğ ı gösteril mektedir.
Tü retil ec ek arayü z ismi yaz ı l dı ktan sonra TA B tuş una b ası l ı rsa arayü z deki el eman
b il diriml eri D eneme sı nı f ı na otomatik ol arak ekl enec ektir. Bu iş l emden sonra D ispose()
metodunun b il dirimi D eneme sı nı f ı na otomatik ol arak ekl enmiş ol ac aktı r.
3- Tü retme sı rası nda yeniden yü kl eneb il ec ek(overiride) metotl ar override anah tar
söz c ü ğ ü yaz ı l dı ktan sonra otomatik ol arak gösteril ir.Ö rneğ in M etot1 ve M etot2 adı nda 2
tane sanal (virtual ) metodu ol an Temel Sı nı f ' tan tü reyen sı nı f içinde override anah tar
söz c ü ğ ü kul l anı l dı ktan sonra aş ağ ı daki ekran görü ntü sü el de edil ir.
Y ukarı daki ekranda O b j ec t sı nı f ı nı n metotl arı nı n da gösteril diğ ine dikkat edin. A yrı c a
Temel Sı nı f taki sanal ol mayan metotl arı n da gösteril mediğ ine dikkat edin.
4- V S.N E T I D E ' sinde nesnel er il e ' .' operatörü kul l anı l dı ğ ı anda nesnenin tü rü ne ait
el emanl ar l istel enir. L istel eme yapı l ı rken il k el eman h er z aman en b aş ta ol ur. Y ani
sı ral ama iş l emi el eman isiml erinin al f ab etik sı raya göre diz il mesiyl e yapı l ı r. Y eni I D E il e
b irl ikte kul l andı ğ ı nı z el emanl ar "sı k kul l anı l an el emanl ar" b öl ü mü ne ekl enerek b ir sonraki
kul l anı mda en son kul l anmı ş ol duğ unuz el emanı n seçil i ol ması sağ l anı r. E n çok
kul l andı ğ ı mı z Consol e sı nı f ı nı n W riteL ine() metodunu örnek verel im. L istede W rite()
metodu W riteL ine() metodundan önc e gel mektedir. D ol ayı sı yl a W riteL ine() metodunu
seçeb il mek için "W riteL " yaz mak gerekec ektir. O ysa yeni kul l anı mda W riteL ine()
metodunu b ir kere seçtikten sonra b ir sonraki kul l anı mda ' .' operatörü ne b ası p "W "
yaz ı l dı ğ ı anda W riteL ine() metodu seçil ec ektir.
5- D iğ er b ir yeni öz el l ik ise D eb ug iş l emi sı rası nda kul l anı l an "I mmediate W indow "
penc eresinin kul l anı mı nda görü l ü r. A rtı k "I mmediate" penc eresinde de kod editörü nde
ol duğ u gib i nesnel erin öz el l ikl erini ve metotl arı nı göreb il mekteyiz . O b j ec t tü rü nden ol an s
nesnesinin ü ye metotl arı nı n "I mmediate" penc eresinden ne ş ekil de görü l dü ğ ü aş ağ ı daki
ekran görü ntü sü nde gösteril miş tir.
N ot: "I mmediate" penc eresi il e çal ı ş ab il mek için kaynak kodda h erh angi b ir satı ra
"Breakpoint" yerl eş tirip programı "D eb ugger" il e b irl ikte derl emeniz gerekir.
S onu ç
V isual C# ve V S.N E T I D E ' sinde yapı l an değ iş ikl ikl er yukarı da anl atı l anl ar il e sı nı rl ı
değ il dir. A nc ak göz e çarpan yeni öz el l ikl er b unl ardı r diyeb il iriz . V S.N E T 2003' teki diğ er
göz e çarpan öz el l ik ise "M M I T" ve "Smart D evic e" ekl entil erinin varsayı l an ol arak
yü kl enmesidir.
C# D ilind e Ö zellikler – 1
N esne yönel iml i programl amanı n gü nü mü z de ne kadar yaygı n ol duğ unu programl ama il e
il gil enen h erkes b il mektedir. N esne Y önel iml i P rograml ama (N Y P ) yakl aş ı mı nda temel
ol an prensipl erden b irisi b il gi giz l eme (inf ormation h iding)' dir. Bu prensib i proj el erimiz de
uygul amak için C# ' in sunduğ u en öneml i araçl ardan b iri ol an sı nı f öz el l ikl eri (c l ass
properties) konusunu inc el eyec eğ iz .
Bil diğ iniz gib i, C# dil inde tasarl anmı ş b ir sı nı f ta iki temel unsur b ul unur. Birinc isi sı nı f ı n
öz el l ikl eri (f iel ds), ikinic isi ise sı nı f ı n metodl ari (meth ods)' dı r. Herh angi b ir sı nı f ı n
öz el l ikeri sı nı f ta tutul an il iş ikil i veril erl erdir. D iğ er taraf tan sı nı f ı n b iz im için değ iş ik iş l eri
yapması nı metodl arı vası tası yl a sağ l arı z . Sı nı f tasarı mı çok öneml i b ir iş ol up; deneyim,
konsantrasyon ve dikkat ister. Sı nı f ı mı z ı n öz el l ikl erini tutan veril er, program akı ş ı
sı rası nda sı nı f dı ş ı nda değ iş tiril eb il ir veya b u değ erl ere ul aş mak isteneb il ir.
Bu durumda akl a il k gel en çöz ü m sı nı f ı n veril erinin h epsinin dı ş arı dan ul aş il ab il mesini ve
değ iş tiril eb il mesine ol anak sağ l ayan pu b lic anah tari il e tanı ml amakdir. A ş ağ ı daki
programda b u tü r b ir çöz ü mü n uygun ol ab il ec eğ i dü ş ü nü l mü ş tü r:
using System;
th is.marka=marka;
th is.renk=renk;
}
oto1.model =300;
Y ukarı daki kod örneğ imiz de iki tane sı nı f b ul unmaktadı r. O tomob il sı nı f ı il e otomob il
nesnel erimiz i ol uş turab il iriz . A yrı c a b u sı nı f ı n O z el l ikl eriG oster() metodu il e h erh angi b ir
otomob il nesnemiz in öz el l ikl erini görmek için ekrarana yaz dı rı yoruz . İ kinc i sı nı f ı mı z da
(O tomob il Test) ise O tomob il sı nı f ı mı z dan nesnel er ol uş turmak ve onl arı n öz el l ikerini
çağ ı rmak için kul l anac ağ ı z . Ş imdi isterseniz M ain() f onksiyonunu inc el emeye b aş l ayal ı m.
M etodun h emen il k b aş ı nda o to 1 isiml i nesnemiz i ol uş turuyoruz . o to 1 nesnemiz in
öz el l ikl eri 2000 model , siyah ve BM W ol sun. Bir sonraki satı rda o to 1 nesnemiz in model ini
300 yapı yoruz . İ ş te b urda b ü yü k b ir h ata yapı l ı yor! Ç ü nkü 300 yı l ı nda h enü z otomob il
ü retil memiş ti. Böyl e b ir h atayı nası l önl eriz ? Ç öz ü m ol arak otomob il nesnemiz in h erh angi
b ir öz el l iğ ini değ iş tirmek için ayrı b ir metod yaz mamı z gerekir. O z aman programı z ı ş u
ş ekil de değ iş tirmemiz gerekiyor:
using System;
th is.marka=marka;
th is.renk=renk;
}
Y ukarı daki programda O tomob il sı nı f ı na M odel D egistir(int yeniM odel ) metodunu ekl edik.
Bu metod il e model i değ iş tiril ec ek nesnenin model inin ş u anda b ul unul an yı l dan sonra ve
19 00' den önc e yapı l mak istendiğ inde h ata mesaj ı veriyor ve model ini değ iş tirmiyor.
A yrı c a sı nı f içindeki model değ iş kenin tanı ml anması nda priv a te anah tarı nı da
kul l andı ğ ı mı z a dikkat ediniz . Bu ş ekil deki b ir yakl aş ı m il e h em sı nı f ı n iç iş l eyiş ini sı nı f
dı ş ı ndan sakl amı ş ol uyoruz h em de sı nı f a ait veril erin değ iş tiril mesini sı rası ndaki h atal arı
en az seviyede tutmayı sağ l ı yoruz .
F akat yukarı daki yöntemi genel de C+ + programc ı l arı kul l anı r(dı ). Biz l er C# programc ı l arı
ol arak dah a gel iş miş b ir yol a sah ib iz . Sı nı f içindeki değ erl eri değ iş tirmek ve ul aş mak için
öz el l ik (P roperty) arac ı nı kul l anı rı z . A ş ağ ı daki program ise C# ' ı n öz el l ikl eri nası l
kul l andı ğ ı na b ir örnektir:
using System;
th is.marka=marka;
th is.renk=renk;
}
set
{
if ((val ue>D ateTime.N ow .Y ear)||(val ue< 19 00) )
{
Consol e.W riteL ine("O tomob il in model i su an ki yil dan b ü yü k veya
19 00' den kü çü k ol amaz ! \n");
}
el se th is.model =val ue;
}
}
}
Ç ı ktı sı nı gördü ğ ü nü z program kodunda C# ' ı n öz el l ik tanı ml ama ve kul l anma yöntemini
kul l andı k. Ö z el l ikl er il e h erh angi b ir nesneye ait değ iş kenin değ erini öğ reneb il ir ve
değ iş tireb il iriz . Y ukarı daki örnek kodda yeral an aş ağ ı daki kı sı mda b ir öz el l ik(P roperty)
tanı ml ı yoruz . G enel l ikl e b ir öz el l iğ in ismi ü z erinde iş yaptı ğ ı değ iş kenin ismi il e aynı ol up
sadec e il k h arf i b ü yü k ol ur. A sl ı nda b u b ir z orunl ul uk değ il . Sadec e C# ' da b u b ir
gel enektir. Bu ş ekil de b ir kul l anı m b iz im kodumuz u okuyanl arı n kodu dah a kol ay
anl aması ve b iz im b aş kal arı nı n kodl arı nı dah a kol ay anl amamı z a yardı mc ı ol ur. Bir
öz el l iğ in tanı mı nda öz el l ik isminden önc e ne tü r b ir değ er dönderec ekse onun tipini
b el irtmel iyiz . Bu genel de öz el l iğ in il gil i ol duğ u değ iş kenin tipidir :-)
set
{
if ((val ue>D ateTime.N ow .Y ear)||(val ue< 19 00) )
{
Consol e.W riteL ine("O tomob il in model i su an ki yil dan b ü yü k veya
19 00' den kü çü k ol amaz ! \n");
}
el se th is.model =val ue;
}
}
}
Ö z el l ikl er içinde get ve set ol mak ü z ere iki ayrı b l ok kod ol ur. İ stersek sadec e get veya
sadec e set b l okl arı ol an öz el l ikl er de yaz ab il iriz . get b l oğ unda il gil i değ iş kenimiz in değ erini
dı ş arı ya döndeririz . set b l oğ unda ise değ iş kenimiz in değ erini değ iş tiririz . Burda gereken
kontrol l eri yapı p dah a sonra uygunsa giril en değ eri kab ul edeb il iriz . E minimki get b l oğ u
içinde dikkattiniz i değ iş keni ismi yerine v a lu e ş ekl inde çağ ı rmamı z çekmiş tir. Bu
sayede kod içinde karı ş ı kl ı k ol maz . Z aten sadec e b ir tane değ iş ken ü z erinde
çal ı ş ı yorsunuz .
Bu makal emiz de C# dil inde yeral an öz el l ik (P roperty) kavramı nı inc el edik. Bir il erl eyen
makal el erimiz de sadec e yaz ı l ab il ir (read-onl y) ve sadec e okunab il ir (w rite-onl y) öz el l ik
yaz mayı ve kul l anmayı inc el eyec eğ iz .
W inA PI F onks iyonlarının C#' t a K u llanımı
C# ve dotN E T il e b irl ikte yaz ı l ı m gel iş tirmeye yeni b ir sol uk gel miş ol sada C# il e eskiden
yaz ı l mı ş CO M komponentl erine eriş eb il mek mü mkü ndü r. D ah a önc eki iki makal ede .N E T
ve CO M il iş kisini detayl ı b ir ş ekil de inc el emiş tik. Bu makal ede .N E T' in W in 32 A P I il e nası l
entegre edil diğ i anl atı l ac aktı r. .N E T ve C# ' ı n yeni imkanl arı nı n yanı sı ra eski b ir teknol oj i
ol an CO M ve yönetil meyen(unmanaged) kodl arl a uyuml u b ir ş ekil de çal ı ş ması b el kide C#
ve .N E T' i diğ er yaz ı l ı m gel iş tirme pl atf orml arı ndan ayı ran en öneml i öz el l iktir.
Bil diğ iniz gib i C# ' ta gösteric i kul l anı mı tamamen serb esttir. Bu yü z den eskiden(.N E T
önc esi) yaz ı l mı ş ve parametre ol arak gösteric i al an CO M komponentl eri ve W indow s A P I
f onksiyonl arı C# il e sorunsuz b ir ş ekil de çal ı ş tı rı l ab il mektedir. Bu yaz ı da W in A P I
f onksiyonl arı nı n .N E T ortamı nda ne ş ekil de el e al ı ndı ğ ı inc el enec ektir.
W in32 sistem f onksiyonl arı kul l anı l dı ğ ı nda, kod CL R taraf ı ndan yönetil mekten çı kar. .N E T
ortamı nda gel iş tiril en b ir uygul amada yönetil meyen kod segmenti il e kaş ı l aş ı l ı rsa il gi kod
segmenti CL R taraf ı ndan yönetil mekten çı kar. D ol ayı sı yl a "garb age c ol l ec tion"
mekaniz ması ve .N E T' e öz gü diğ er servisl er kul l anı m dı ş ı ol ur.
CL R taraf ı ndan yönetil meyen kodl ara eriş eb il mek için C# ' ta
S ystem. R u ntime. I ntero pS erv ic es isim al anı nda b ul unan ve D l l I mprtA ttrib ute sı nı f ı nı
temsil eden DllI mpo rt nitel iğ i kul l anı l maktadı r. D l l I mport nitel iğ i il e h aric i b ir kaynakta
b ul unan metoda ref erans vermek için externa l anah tar söz c ü ğ ü kul l anı l ı r. Bir sı nı f
b il diriminin en b aş ı nda ex ternal anah tar söz c ü ğ ü ve D l l I mport nitel iğ i kul l anı l arak CL R
taraf ı ndan yönetil meyen b ir metot b il dirimi yapı l ı r. Tab i metodun gövdesi h aric i b ir
kaynakta z aten var ol duğ u için b iz im metodun gövdesini yaz mamı z ı n b ir anl amı yoktur.
A rdı ndan b u metot sı nı f ı n istenil diğ i yerinde kul l anı l ab il ir. İ sterseniz b asit b ir örnekl e
D l l I mport nitel iğ inin kul l anı mı nı gösterel im.
N o t : Bu yaz ı da C# ' ta nitel ikl erin(A ttrib utes) nası l kul l anı l dı ğ ı nı b il diğ iniz varsayı l mı ş tı r.
using System;
using System.R untime.I nteropServic es;
c l ass Cl ass1
{
[D l l I mport("user32.dl l ")]
pub l ic static ex tern int M essageBox (int tip,string mesaj ,string b asl ik,int sec enek);
P rogramı n çal ı ş ma ş ekl ini açı kl amadan önc e ekran çı ktı sı na b akal ı m :
Y ukurı daki çı ktı dan ve kaynak koddan da görü l dü ğ ü ü z ere W in A P I deki b ir f onksiyonun
çağ rı mı kl asik metot çağ rı mı ndan f arkl ı değ il dir. D eğ iş en tek ş ey metodun b il dirim
ş ekl idir.
N o t : G österil en mesaj kutusunun f arkl ı f orml arı nı görmek için M essageBox metodunun
parametrel eri il e oynayı n.
Ş imdi kı sac a yukarı daki programı n çal ı ş ma z amanı ndaki durumunu inc el eyel im. P rogram
çal ı ş tı rı l dı ğ ı nda, CL R taraf ı ndan yönetil meyen b ir metot çağ rı mı yapı l dı ğ ı nda il gil i
kaynaktan metot b el l eğ e yü kl enir ve b el l eğ e yü kl enen metodun b aş l angı ç adresi sakl anı r.
A rdı ndan b iz im parametre ol arak geçtiğ imiz değ iş kenl er D L L ' deki f onksiyona uyuml u h al e
getiril ir ve parametre ol arak geçiril ir. E ğ er b ir geri dönü ş değ eri b ekl eniyorsa
yönetil meyen kod b öl ü mü nden gel en değ er uygun .N E T tü rü ne dönü ş tü rü l erek iş l eml ere
devam edil ir. Bu iş l eml er tamamen .N E T' in al t yapı sı nı il gil endirmektedir. D ol ayı sı yl a
programc ı nı n yapac ağ ı iş sadec e metodun b il dirimini doğ ru b ir ş ekil de gerçekl eş tirmektir.
D l l I mportA ttrib ute sı nı f ı nı n b ir kaç öneml i öz el l iğ i dah a vardı r. Bunl ardan en öneml isi
h aric i kaynaktaki b ir f onksiyona takma isim vereb il memiz i sağ l ayan string tü rü nde ol an
EntryP o int öz el l iğ idir. E ntryP oint öz el l iğ ini kul l anarak M essagBox f onksiyonuna takma
isim vereb il iriz . F onksiyon çağ rı mı b u takma isim il e gerçekl eş tiril eb il mektedir. Ö rneğ in
M essageBox f onksiyonuna Teb rikM esaj iV er ş ekl inde b ir takma isim vermek için aş ağ ı daki
gib i b ir b il dirim yapı l mal ı dı r.
using System;
using System.R untime.I nteropServic es;
c l ass Cl ass1
{
[D l l I mport("user32.dl l ",E ntryP oint = "M essageBox ")]
pub l ic static ex tern int Teb rikM esaj iV er(int tip,string mesaj ,string b asl ik,int sec enek);
Ş imdi de D l l I mport nitel iğ i il e il gil i diğ er öz el l ikl ere ve öneml i noktal ara b akal ı m.
2 - D l l I mport nitel iğ i il e iş aretl enmiş metotl ar mutl aka extern anah tar söz c ü ğ ü il e
b il diril mel idir.
3 - D l l I mport nitel iğ inin E ntryP oint' in h aric inde 4 tane isiml i parametresi(named
parameter) dah a vardı r. Bunl ar : C a lling C o nv entio n, C ha rS et, Exa c tS pelling ,
P reserv eS ig v e S etL a stErro r parametrel eridir. Bu parametrel erden öneml i ol anl ar
aş ağ ı da açı kl anmı ş tı r.
5 - C ha rS et : Haric i f onksiyonun çağ rı mı nda kul l anı l ac ak karekter setini b el irl er. Bu
parametre Ch arSet numaral andı rması il e b el irtil ir. V arsayı l an ol arak C ha rS et. A u to
ş ekl indedir. Ch arSet numaral andı rması nı n diğ er semb ol l eri A nsi, U nic o de v e N o ne
ş ekl indedir.
6 - Exa c tS pelling : E ntryP oint il e b el irtil en ismin il gil i f onksiyon ismine yaz ı m b içimi
b akı mı ndan tam uyuml u ol up ol mayac ağ ı nı b el irtir. Bu öz el l ik b ool tü rü ndendir ve
varsayı l an ol arak fa lse değ erdir.
D l l I mport metodunun varsayı l an çağ rı m b içimi ol an W inapi sadec e W indow s sisteml erine
öz gü n ol duğ u için sisteml er arası taş ı nab il irl iğ in yü ksek ol ması gereken proj el erde b u
nitel iğ in kul l anı mı ndan kaçı nmak gerekir. Bu yü z den D l l I mport öz el l iğ ini kul l anmadan
önc e il gil i f onksiyonun .N E T F ramew ork içinde ol up ol madı ğ ı nı kontrol etmek gerekir.
Ö rneğ in M essageBox f onksiyonu z aten System.W indow s.F orms isim al anı nda b ul unduğ u
için A P I kul l anarak b u f onksiyondan yararl anmak mantı kl ı değ il dir. Z ira il eride
programı nı z ı n L inux ortamı nda yada diğ er f arkl ı ortaml arda da çal ı ş ması nı istiyorsanı z
programı nı z ı değ iş tirip yeniden derl emeniz gerekec ektir. O ysa .N E T F ramew ork içinde
b ul unan standart sı nı f l arı ve onl arı n metotl arı nı kul l anı rsanı z b öyl e b ir derdiniz
ol mayac aktı r.
C#' d a S ıra ( Q u eu e) S ınıf ı v e ku llanımı
Bir önc eki yaz ı mı z da genel ol arak yı ğ ı n (Stac k) veri yapı sı nı n çal ı ş ma model ine ve C# ' ta
kul l anab il ec eğ imiz yı ğ ı n sı nı f ı nı ve b u sı nı f ı n metodl arı ü z erinde durmuş tuk. Ş imdi b urada
ise, diğ er öneml i veri yapı sı ol an sı ra (q ueue) veri yapı sı nı inc el eyec eğ iz . Q ueue veri
yapı sı nı n mantı ğ ı nı anl adı ktan sonra .N E T sı nı f kitapl ı kl arı nda b ul unan Q ueue sı nı f ı nı
öğ renec eğ iz .
1. Q u eu e( sı ra ) v eri Y a pı sı nı n Ç a lı ş ma Ş ek li
Sı ral ar b il gisayar programl amada sı k sı k b aş vurul an veri yapı l arı dı r. M esel a, iş l etim
sisteminde yapı l ması gereken iş l eri b ir sı ra veri yapı sı il e tutarı z . Herh angi b ir anda yeni
b ir iş gel diğ i z aman b u iş sı raya (Q ueue) girer. Sı rası gel en iş yapı l ı r ve sonraki iş e geçil ir
gib i. Q ueue veri yapı l arı ayrı c a simul asyonl arda da sı k sı k kul l anı l ı r.
2. . N ET S ı nı f K ütüpha nesi S ı ra S ı nı fı ( Q u eu e)
C# veya h erh angi b ir dil de yaz ı l an yı ğ ı n veri yapı l arı nda Enq u eu e( ), Deq u eu e, P eek ( ),
C lea r( ) f onksiyonl arı ve C o u nt, öz el l iğ i vadı r. Bunl arı n yanı nda C lo ne( ), C o pyT o ( ),
T o A rra y( ), C o nta ins( ) v e Eq u a ls( ) metodl arı .N E T' in yı ğ ı n sı nı f ı nda yeral ı r.
using System;
using System.Col l ec tions; // Q ueue sı nı f ı b u isim al anı içinde b ul unur.
Y ukarı daki örnek programda önc e Q ueue sı nı f ı ndan sı ra isiml i b ir nesne ol uş turuyoruz .
Sonraki al tı satı rda sı ramı z a "A h met", "F erit", "Hasan", ve "Hü seyin" değ erl erini Enq u eu e
metodu il e ekl iyoruz . Deg erleri( ) ismini verdiğ imiz static f onksiyonumuz il e sı ramı z daki
el eman sayı sı nı ve el emanl arı ekrana yaz dı rı yoruz . D ah a sonra sı ramı z dan b ir tane
el emanı Deu q u e( ) metodu yardı mı yl a al ı yor ekrana yaz dı rı yoruz . P rogramı n son
kı smı nda ise P eek ( ) metodunu kul l anrak sı ranı n en ü stü ndeki el emanı n ne ol duğ unu
öğ reniyoruz ve b u el eman sı rada kal ı yor.
using System;
using System.Col l ec tions; // Q ueue sı nı f ı b u isim al anı içinde b ul unur.
if (sira.Contains(7 ))
Consol e.W riteL ine("Sı ramı z da " + sayi + " var.");
el se
Consol e.W riteL ine("Sı ramı z da " + sayi + " yok.");
Consol e.W riteL ine("\n Sı ramiz da ş u anda {0} tane el eman vardı r.", el emanSayisi);
Y ı ğ ı nda makal emiz C lo ne( ), T o A rra y( ) ve Eq u a ls( ) metodl arı nı n aynı l arı Q ueue sı nı f ı
içinde b ul ab il iriz . Siz l erin yı ğ ı n makal esindeki en son örneğ ini sı ra veri tipi için de yaz ı p
kendiniz i denemeniz i tavsiye ederim. Herkese iyi çal ı ş mal ar.
Vis u al C# ile B as it B ir N ot D ef t eri U ygu lamas ı
Bu yaz ı mı z da konu ol arak W indow s F orm’ u seçtim;çü nkü b u konuda Tü rkçe kaynak
neredeyse yok, doğ ru dü rü st b ir programı n yapı mı nı gösteren b ir yaz ı , b ir site
b ul amadı m, tab i ki Tü rkçe b ir çok makal e var sitel erde, b ende onl ardan yararl anarak ve
deneyerek b ir ş eyl er yaptı m ve ş imdi b u yaptı kl arı mı siz inl e payl aş ı yorum.
E ğ er b u yaz ı yı sonuna kadar okursanı z ve kodl arı siz de yaz arsanı z , yaz ı nı n sonuna
gel diğ iniz Basit N ot D ef teri adı nda b ir uygul amanı z ol ac ak. Ö nc e b u programdan b iraz
b ah sedel im. A dı ü stü nde b ir N ot D ef teri uygul aması anc ak b asit h em de çok b asit.
Y apab il diğ i ş eyl er: Y eni dosya yaratmak, var ol an dosyal arı açmak, dosya kaydetmek…
Böyl e b ir program yapmamı n seb eb i tab i ki metin editörl eri konusunda al ternatif
ol uş turma isteğ i f al an değ il , tek seb ep b enim il k b aş l arda çok z orl andı ğ ı m SaveF il eD ial og,
O penF il eD ial og gib i kontrol l er konusunda örnekl emel er yapmak..
L af ı dah a f az l a uz atmadan artı k uygul amaya geçel im. Ö nc e aş ağ ı daki programı V isual
Studio .N et’ in D esigner’ ı nda ol uş turun…
Ben b u resime kul l andı ğ ı m kontrol l erin isiml erini de yaz dı m ki kodl arı inc el erken z orl uk
çı kması n. Y al nı z b urada görü nmeyen 2 kontrol dah a var. Biri SaveF il eD ial og (ob j Save),
diğ eri O penF il eD ial og (ob j O pen). Bu kontrol l eri de ekl eyip adl arı nı parantez içl erindeki
gib i yaparsanı z sorun çı kmaz …
Ş imdi kodl arı mı z a geçeb il iriz . Bu b öl ü mde adı m adı m il erl eyec eğ iz . M enü l erdeki tü m
b aş l ı kl arı n ol ayl arı nı yaz ac ağ ı z .
priv a te b o o l D egisim;
2)F orm1’ in onL oad O l ayı
Bu ol ay programı mı z ı n açı l ı ş ı nda yü rü tü l en ol aydı r. Burada ob j Save ve ob j O pen için b az ı
ayarl ar yapı yoruz ve göstermesini istediğ imiz dosyal arı n uz antı l arı nı giriyoruz .
Ö nc e yukarı daki kodu b iraz inc el eyel im. Burada önc e b i if kontrol ü görü yorsunuz . Bu
kontrol ü n amac ı , K ayı t ekranı açı l dı ğ ı z aman kul l anı c ı “ O K ” dü ğ mesine tı kl ayı p
tı kl amadı ğ ı nı kontrol etmek. E ğ er “ O K ” e tı kl adı ise programı mı z b ir adet StreamW riter
ol uş turuyor. K ayitc i adı ndaki b u W riter
E nvironment.G etE nvironmentV ariab l e("mydoc uments” ) b u kod il e ayarl ı ol an Bel gel erim
kl asörü ne gidiyor otomatik ol arak. ob j Save.F il eN ame ise b iz im K ayı t E kranı n da dosyaya
verdiğ imiz ismi b iz e döndü rü yor. Son ol arak ise b u satı rda U nic ode b ir kodl ama
yaptı ğ ı mı z gösteriyoruz . Bunu yaz maz sanı z Tü rkçe karakterl eriniz in yerinde yel l er estiğ ini
görü rsü nü z .
K ayitc i.W rite(strV eri) satı rı il e gel en veriyi kaydediyor ve StreamW riter nesnesini
kapatı yor. D egisim değ erini ise true ol arak atı yor. Bunun nedeni değ iş im ol du ve b en
b unu gördü m demek. K ul l anı c ı ya h ab er vermeye gerek yok anl amı na gel ec ek.
{
D egisim = fa lse;
retu rn fa lse;
}
Y ukarı daki kodda ise tipik b ir M essageBox kul l anı mı görü yorsunuz . Buradaki metodumuz
b irde değ er döndü rü yor.Bir b ool değ eri döndü rü yor. Bu dönen değ er il e b iz az sonra
kul l anı c ı nı n çı kan mesaj kutusunda dosyayı kaydetmek isteyip istemediğ ini anl ayac ağ ı z .
M essageBox .Sh ow ("D osyanı z da b ir değ iş ikl ik ol du kaydetmek ister misiniz ?","D eğ iş ikl ik
V ar",M essageBox Buttons.Y esN o,M essageBox I c on.E x c l amation) == D ial ogR esul t.Y es)
Bu satı rı b iraz inc el emek l az ı m. Burada il k overl oad (O verl oad metodl ara parantez l er
içinde yol l anan veri demek.) mesaj kutusunda görü nec ek ol an yaz ı , ikinic isi b u mesaj
kutusunun b aş l ı ğ ı , ü çü nc ü sü mesaj kutusu ü z erinde ki “ E vet” , “ Hayı r” dü ğ mel eri ve son
ol arak mesaj kutusundaki simge. A nc ak kodl ara b akmaya devam ettiğ imiz de b ir
karş ı l aş tı rma görü yoruz (“ ==” if adesi) D ial ogR esul t.Y es , asl ı nda açı kl amaya b il e gerek
yok. E ğ er kul l anı c ı “ E vet” e tı kl adı ise demek. A sı l kodl arda b u durumda b ir “ true” if adesi
döndü rü l dü ğ ü nü göreb il irsiniz . Biz dah a sonra b unu kontrol ederek K ayitM ekaniz masi
metodumuz u çağ ı rac ağ ı z .
4) Y eni dü ğ mesi
M enü mü z deki “ Y eni” dü ğ mesine tı kl adı ğ ı mı z da ol ac ak ol ayl arı girec eğ iz . Bunun için b u
dü ğ meye D esigner’ dan çif t tı kl ayı nı z .
}
else
{
if (D egisimU yari())
{
K ayitM ekaniz masi(ob j Tex t.Tex t);
ob j Tex t.Cl ear();
D egisim = fa lse;
}
else
{
ob j Tex t.Cl ear();
D egisim = fa lse;
}
}
}
Burada önc e D egisim değ erini kontrol ediyoruz . E ğ er değ er “ f al se” ise yani değ iş im yoksa
ya b u dosya önc eden kaydedil miş tir ya da yeni açı l mı ş tı r. O z aman içeriğ inin
temiz l enmesinde b ir sorun yok.
E ğ er değ er “ true” ise b iraz karı ş ı yor ortal ı k. Ö nc e kul l anı c ı yı uyarmak için D egisimU yari()
çal ı ş tı rı l ı yor. E ğ er kul l anı c ı kayı t etmek istiyorsa, K ayitM ekaniz masi() çal ı ş tı rı l ı yor, ekran
temiz l eniyor ve D egisim değ eri f al se ol uyor.E ğ er kul l anı c ı kayı t etmek istemiyorsa içerik
temiz l eniyor ve D egisim değ eri yine f al se ol uyor. Böyl ec e yeni b ir dosya açma iş l eml erini
h al l ettik.
M etin editörü nü z il e dah a önc e var ol an b ir dosyayı açmak istersiniz diye b öyl e b ir öz el l ik
ekl edik b irde. M enü mü z de “ A ç” a çif t tı kl ayı n ve tı kl ama ol ayı na aş ağ ı daki kodl arı girin.
Bu kodl arda da önc e değ iş im var mı diye b akı yoruz . Y ani amac ı mı z kul l anı c ı nı n yaz dı ğ ı
metni yanl ı ş l ı kl a b astı ğ ı b ir dü ğ me yü z ü nden kayb etmesini engel l emek. E ğ er değ iş im
varsa ve uyarı dan “ true” değ eri dönerse kaydediyoruz , aksi h al de h erh angi b ir ş ey
yapmı yoruz .
A nc ak b urada yukarı dakinden f arkl ı kodl ar var. D osya okumak için çok f arkl ı yönteml er
var. Y az mak içinde tab i ki. M esel a StreamW riter’ ı n StreamR eader’ ı da var ve b en b urada
b unu kul l andı m. E ğ er kodl arı inc el erseniz b iraz f arkl ı ol duğ unu görec eksiniz . Ç ü nkü
b urada F il eI nf o diye de b ir ş ey var. F il eI nf o b u tü r dosya iş l emc il erine yardı mc ı ol ur.
strK aynak değ iş kenine atadı ğ ı mı z nesnemiz de StreamW riter daki gib i path gösterip
dosyamı z ı açı yoruz . Burada ob j O pen.F il eN ame’ den gel en veri, kul l anı c ı nı n açmak istediğ i
dosya.
StreamR eader nesnesini de ol uş turup strK aynak.O penTex t() il e metin dosyamı z ı
açı yoruz . Y al nı z b urada b ir noktaya dikkat çekmek istiyorum. Ben b urada açı l ac ak
dosyanı n b ir .tx t dosyası ol duğ unu b il diğ im için .O penTex t’ i kul l andı m. Y oksa b aş ka
versiyonl arı da mevc ut. Bu nesneyi de ol uş turduktan sonra ob j Tex t’ e
O kuyuc u.R eadToE nd il e b aş tan sonra tü m veriyi okuyup aktarı yoruz . D eğ iş imden
h ab erimiz ol duğ unu programa b il dirip, nesnel erimiz i kapatı yoruz …
6 ) K aydet dü ğ mesi
K ul l anı c ı çal ı ş ması nı kaydetmek istediğ i z aman b u dü ğ meye tı kl ayab il ir. Ç ok kı sa b ir kodu
var. Z aten ası l iş i yapan K ayitM ekaniz masi(), b iz sadec e onu çağ ı rac ağ ı z ş imdi.
7 ) K apat D ü ğ mesi
K ul l anı c ı programı kapatmak isteyeb il ir ve b unun için D osya menü sü ndeki K apat
dü ğ mesini kul l anab il ir. O z aman b u dü ğ meye de b ir ol ay atamamı z l az ı m. Ş imdi çif t
tı kl ayı n ve aş ağ ı daki kodl arı yaz ı n.
Bu kod çok b asit. Sadec e Cl ose() metodunu çağ ı rı yor. Bu öz el tanı ml ı b ir metodur ve o
f orm penc eresinin kapanması nı sağ l ar. Ş imdi akl ı nı z a gel eb il ir ya içeride kaydedil memiş
veri varsa h iç kontrol etmedik. O z aman b iraz sab ı r, ona da b akac ağ ı z …
}
}
else
{
Cl ose();
}
}
Burada yapı l anl ardan f arkl ı ol an h iç b ir ş ey yok. D egisim değ erini kontrol ediyoruz ve ona
göre iş l em yapı yoruz ..
9 ) Son b ir metod…
A sı l en öneml i ş eyi yapmadı k sanı yorum. Ö rneğ in kul l anı c ı programa b ir veri girdiğ inde
yani h erh angi b i yaz ı yaz dı ğ ı nda D egisim değ eri değ iş medi. O z aman b unu h al l edel im.
ob j Tex t’ in Tex tCh anged adı nda b ir ol ayı var. Ş imdi o ol ay kodl arı içine aş ağ ı daki tek
satı rl ı k kodu yaz ı yoruz .
A nc ak menü l erimiz arası nda h iç il gil enmediğ imiz b ir dü ğ me var. Hakkı nda. Bu asl ı nda en
gereksiz ş ey b el ki ama b ir programc ı nı n en çok önemsediğ i b öl ü m :). Bunun için b asit b ir
f orm yaratı nı z . Ben aş ağ ı daki f ormu ol uş turdum ve adı nı “ h akkinda” yaptı m.
Burada al tta iki tane de l ink var. Biri M ax iA SP .Com ‘ a b iri M ax iA SP .N et’ e yönl enmiş
durumda. Bunl ara tı kl andı ğ ı nda tarayı c ı mı z ı n açı l ı p sitel ere gitmemiz i sağ l ayac ak kodl arda
aş ağ ı da.
G erçekten çok uz un b ir yaz ı ol du. E ğ er h er ş ey yol unda gitti ise ş u an c anavar gib i çal ı ş an
b ir “ Basit N ot D ef teriniz ” var. Baş ka yaz ı l arda görü ş mek ü z ere.
C#' ın G elec ekt eki Ö zellikleri
Bil diğ iniz gib i C# dil i 2001 yı l ı nda M ic rosof t taraf ı ndan çı karı l an ve nesne yönel iml i
programl ama tekniğ ine % 100 destek veren b ir programl ama dil idir. C# , programc ı l ara
sunul duğ undan b eri b ir çok programc ı nı n dikkatini çekmiş tir. Bu il gide en öneml i neden
h erh al de C# dil inin kendinden önc e çı karı l mı ş ol an JA V A ve C+ + dil l erini örnek al ması dı r.
E vet C# modern çağ ı n gerektirdiğ i b ü tü n yaz ı l ı m b il eş enl erini içermekl e b erab er eski
programl ama dil l erinde b ul unan iyi öz el l ikl eri de yapı sı nda b arı ndı rmaktadı r. M ic rosof t ve
C# dil tasarı mc ı l arı h er geçen gü n yeni piyasa araş tı rmal arı yaparak dil e katab il ec ekl eri
öz el l ikl eri tartı ş maktadı rl ar. Bu amaçl a C# dil inin tasarı mc ı l arı yakı n b ir z aman içinde C#
dil ine ekl emeyi dü ş ü ndü kl eri yeni öz el l ikl eri b il dirmiş l erdir. Bu yaz ı da muh temel en
"V S.N E T f or Y ukon(V S.N E T E verett' ten sonraki versiyon)" il e b irl ikte uygul amaya
konul ac ak C# dil inin muh temel öz el l ikl erini öz etl emeye çal ı ş ac ağ ı m. Bu b il dirinin
tamamı nı C# topl ul uğ unun resmi sitesi ol an w w w .c sh arp.net adresinden okuyab il irsiniz .
C# dil ine yakı n b ir z amanda ekl enil mesi dü ş ü nü l en öz el l ikl er 4 ana b aş l ı k al tı nda
topl anmı ş tı r. Bu öz el l ikl er temel ol arak aş ağ ı daki gib idir.
2 - I terators
Bu yaz ı da yukarı da b aş l ı kl ar h al inde veril en h er b ir konuyu ayrı ntı l ı ol arak inc el eyip,
programc ı ya ne gib i f aydal ar sağ l ayab il ec eğ ini ve programl arı n perf ormansı na nası l etki
edec eğ ine değ inec eğ im.
1 - G eneric s
P rof esyonel programl amada, tü rden b ağ ı msı z al goritma gel iş tirme öneml i b ir tekniktir.
Tü rden b ağ ı msı z al goritmal ar gel iş tiric i için b ü yü k kol ayl ı kl ar sağ l amaktadı r. Söz gel imi iki
int tü rden sayı nı n topl anması nı n sağ l ayan b ir f onksiyonu yaz dı ktan sonra aynı iş l emi iki
doub l e tü rden sayı için tekrarl amak z aman kayb ı na seb ep ol ac aktı r. C+ + dil inde tü rden
b ağ ı msı z al goritma kurab il mek için ş ab l on(templ ate) f onksiyonl arı ve ş ab l on sı nı f l arı
kul l anı l maktadı r. C# , tü rden b ağ ı msı z al goritma gel iş tirmeye doğ rudan destek vermiyor
ol sada dol ayl ı yol l ardan tü rden b ağ ı msı z iş l eml er yapab il mek mü mkü ndü r. Bu iş l eml er
C# ' ta "Her ş ey b ir O b j ec t' tir" c ü ml esinin al tı nda yatan gerçekl e h al l edil mektedir. C# ' ta
h erş eyin b ir nesne ol ması ve h er nesnenin ortak b ir atası nı n ol ması ve b u atanı n da
O b j ec t sı nı f ı ol ması b u c ü ml enin al tı nda yatan gerçektir. D ol ayı sı yl a h erh angi b ir tü re ait
ref eransı O b j ec t ref erasnl arı na atayb il iriz . Y ani b ir b akı ma tü rden b ağ ı msı z b ir iş l em
gerçekl eş tirmiş ol uyoruz . Söz e gel imi O b j ec t tü rü nden b ir parametre al an b ir f onksiyonu
dil ediğ imiz b ir nesne ref eransı geçeb il iriz . Temel (b ase) sı nı f a ait ref eransl ara
tü reyen(inh erited) sı nı f ref eransl arı nı atayb il mek nesne yönel iml i programl ama tekniğ inin
sunduğ u b ir imkandı r.
C# ' ta O b j ec t ref eransl arı na istenil en tü rden ref eransl ar atanab il ir. Bu, b ü yü k b ir imkan
gib i görü nsede asl ı nda b az ı dez avantaj l arı da b erab erinde getiriyor. Ç ü nkü çal ı ş ma
z amanı nda O b j ec t tü rü ne atanmı ş ref eransl ar orj inal tü re tekrar geri dönü ş tü rü l mektedir.
K ı sac a unb ox ing ol arak b il inen b u iş l em öz el l ikl e değ er(val ue) ve ref erans(ref erenc e)
tü rl eri arası nda yapı l dı ğ ı nda önemsenec ek b ü yü kl ü kte b ir perf ormans kayb ı meydana
gel mektedir. Ç ü nkü değ er ve ref erans tü rl eri b el l eğ in f arkl ı b öl gel erinde sakl anmaktadı r.
Bu durum b ox ing ve unb ox ing iş l eml erinin çal ı ş ma z amanı nda f arkl ı b el l ek b öl gel eri
arası nda uz un sü reb il ec ek veri transf erl erine seb ep ol ur. Bu tü r b ir perf ormans kayb ı nı
b az ı veri yapı l arı için önl emek için C# dil tasarı mc ı l arı G eneric s isiml i b i kavramı n dil e
ekl enmesini öngörmü ş l erdir. Bu sayede b az ı veri yapı l arı nda öz el l ikl e .N E T sı nı f
kü yü ph anesindeki System.Col l ec tions isim al anı nda b ul unan veri yapı l arı nda epeyc e
perf ormans kaz anc ı el de edil ec ektir.
İ sterseniz b asit b ir yı ğ ı n(stac k) sı nı f ı ü z erinden "generic s" kavramı nı n sağ l ayac ağ ı yaral arı
ve b ox ing/unb ox ing iş l eml erinin etkisini inc el eyel im.
c l ass Stac k
{
private int c urrent_ index ;
private ob j ec t[] el emanl ar = new ob j ec t[100];
pub l ic ob j ec t P op()
{
.
.
return el emanl ar[c urrent_ index ];
.
.
}
}
P ush (3);
Bü tü n eksi duruml ardan kurtul mak için generic s(soysal tü r)' l erden f aydal anı l ab il ir. Soysal
tü rl er C+ + dil indeki ş ab l on sı nı f l arı nı n b il dirimi il e b enz erdir. Bu tü r sı nı f b il diriml erine
pa ra metreli tip de denil mektedir. P arametrel i tipl er aş ağ ı daki gib i b il diril ir.
c l ass Stac k
{
private int c urrent_ index ;
private V eri türü[] el emanl ar;
il e stac k sı nı f nı n h angi tü rden veril eri tutac ağ ı stac k nesnesini ol uş turac ak programc ı ya
b ı rakı l mı ş tı r. Ö rneğ in int tü rden veril eri sakl ayac ak b ir yı ğ ı n aş ağ ı daki gib i ol uş turul ur.
Y ukarı daki ş ekil de b ir yı gı n ol uş trul duğ unda Stac k sı nı f ı nuı n b il dirimindeki V eri türü
if adel eri int tü rü ol arak el e al ı nac aktı r. D ol ayı sı yl a P op() metodu il e yı ğ ı ndan b ir el eman
çı karı l ı p aş ağ ı daki gib i b aş ka b ir değ iş kene atanmak istendiğ inde tü r dönü ş tü rme
operatörü nü kul l anmaya gerek yoktur. Bu da b ox ing ve unb ox ing iş l eml erinin
gerçekl eş mediğ i anl amı na gel ir ki istediğ imiz de b uydu z aten.
Soysal tü rl eri kendi tanı ml adı ğ ı mı z sı nı f l ar içinde ol uş turab il iriz . Ö rneğ in M usteri isiml i b ir
sı nı f ı n veril erini yı ğ ı nda tutmak için yı ğ ı n sı nı f ı nı aş ağ ı daki gib i ol uş turmal ı yı z .
Bu durumda yı ğ ı na sadec e M usteri nesnel eri ekl eneb il ir. Y ani yı gı n.P ush (3) ş ekl indeki b ir
kul l anı m derl eme aş aması nda h ata verec ektir. A ynı z amanda yı ğ ı ndan çekil ec ek veril er
de M usteri tü rü ndendir. D ol ayı sı yl a tü r dönü ş ü mü uygun tü rl er arası nda ol mal ı dı r.
Y ı ğ ı n sı nı f ı yukarı da anl atı l an ş ekil de kul l anı l dı ğ ı nda yı ğ ı ndaki el emanl arı n b el irl i b ir tü rden
ol duğ u garanti al tı na al ı nı r. Böyl ec e M usteri tü rü nden nesnel eri tutan b ir yı ğ ı na "3" gib i
b ir sayı yı ekl eyemeyec eğ imiz için dah a gerçekçi programl ar yaz ı l ı r.
Stac k örneğ inde sadec e b ri tane parametre tü rü kul l andı k. Soysal tü rl erde istenil en
sayı da parametrel i tü r kul l anı l ab il ir. Ö rneğ in Hash tab l e sı nı f nı ndaki D eger ve A nah tar
ikil isi aş ağ ı daki gib i parametrel i tü r ol arak b il diril eb il ir.
Y ani b ir Hash tab l e nesnesi ol uş turul ac ağ ı z aman h er iki parametre tü rü de b el irtil mel idir.
Ö rneğ in A nah tar tü rü int ol an ve değ er tü rü M usteri sı nı f ı ol an b ir Hash tab l e nesnesi
aş ağ ı daki gib i ol uş turul ab il ir.
Hash tab l e<int, M u steri> h ash tab l e = new Hash tab l e<int, M u steri>;
N ot : P arametre sayı sı nı aral arı na virgü l koyarak dil ediğ imiz kadar artı rab il iriz .
Soysal tü rl erin saydı ğ ı mı z avantaj l arı nı n yanı nda b u h al iyl e b az ı dez avantaj l arı ve
kı sı tl amal arı da vardı r. Söz gel imi Hash tab l e sı nı f ı nı n b il dirimi içinde A nah tarTuru verisinin
b az ı el emanl arı nı b ir if ade de kul l anmak istiyoruz ; derl eyic i h angi A nah tarTuru
parametrel ei tü rü nü n h angi tü rden ol duğ unu b il mediğ i için b u durumda sadec e O b j ec t
sı nı f ı nı n ait metotl ar ve öz el l ikl er kul l anı l ab il ir. M esel a Hash tab l e sı nı f ı nı n A dd metodu
içinde anah tar parametresi il e CompareTo() metodunu kul l anmak istiyorsak CompareTo
metodunun b il diril diğ i I Comparab l e arayü z ü nü kul l anarak aş ağ ı daki gib i tü r dönü ş ü mü
yapmal ı yı z .
pub l ic c l ass Hash tab l e
{
pub l ic void A dd(A na hta rT u ru anah tar, Deg erT u ru deger)
{
sw itc h ((( I C o mpa ra b le)anah tar).CompareTo(x ))
{
}
}
}
Hash tab l e sı nı f ı nı n A dd() metodu yul arı daki ş ekil de b il diril se b il e h al a eksik noktal ar var.
M esel a A nah tarTuru parametresi eğ er gerçekten I Comparab l e arayü z ü nü uygul amı yorsa
sw itc h if adesi içinde yapı l an tü r dönü ş ü mü geçersiz ol ac aktı r ve çal ı ş ma z amanı nda h ata
ol uş ac aktı r. Ç al ı ş ma z amanı nda meydana gel eb il ec ek b u tü r h atal arı önl emek için
yapı l ab il ec ek tek ş ey A nah tarTuuru parametresinin I Comparab l e arayü z ü nü uygul uyor
ol ması nı z orl amaktı r. Bu iş l emi yapmak için A nah tarTuru parametresine çeş itl i
k ı sı tla r( c o nstra ints) getiril ir. A ş ağ ı daki Hash tab l e sı nı f ı nda A nah tarTuru parametresinin
I Comparab l e arayü z ü nü uygul aması gerektiğ i söyl enmektedir. Bu kı sı t için w here
anah tar söz c ü ğ ü kul l anı l ı r.
pub l ic c l ass Hash tab l e<A nah tarTuru, D egerTuru> w here A na hta rT u ru : I C o mpa ra b le
{
pub l ic void A dd(A na hta rT u ru anah tar, Deg erT u ru deger)
{
sw itc h (anah tar.CompareTo(x ))
{
}
}
}
D ikkat ettiyseniz uygul anan kı sı ttan sonra sw itc h if adesi içinde anah tar değ iş keni
ü z erinde tü r dönü ş ü mü iş l emi yapmaya gerek kal mamı ş tı r. Üstel ik kaynak kodun
h erh angi b ir noktası nda Hash tab l e nesnesini I Comparab l e arayü z ü nü uygul amayan b ir
A nah tarTuru parametresi il e ol uş turursak b u sef er ki h ata derl eme z amanı nda
ol uş ac aktı r.
}
}
}
2 - I t erat ors
Bir diz inin el emanl arı ü z erinde tek tek dol aş ma iş l emine iterasyon denil mektedir.
K ol eksiyon tab anl ı nesnel erin el emanl arı arası nda tek yönl ü dol aş mayı sağ l ayan f oreac h
döngü yapı sı nı n b iz im tanı ml ayac ağ ı mı z sı nı f l ar için de kul l anı l ab il mesi için sı nı f ı mı z ı n b az ı
arayü z l eri uygul uyor ol ması gerekir. f oreac h döngü sü derl eme iş l emi sı rası nda w h il e
döngü sü ne dönü ş tü rü l ü r. Bu dönü ş tü rme iş l emi için I E numerator arayü z ü ndeki
metotl ardan ve öz el l ikl erden f aydal anı l maktadı r. Bu dönü ş tü rme iş l eminin nası l
yapı l dı ğ ı na b akac ak ol ursak :
f oreac h döngü s yapı sı için gerekl i ol an arayü z l erin uygul anması öz el l ikl e ağ aç yapı sı
ş ekl indeki veri tü rl eri için ol dukça z ordur. Bu yü z den C# sı nı f l arı n f oreac h yapı sı il e nası l
kul l anı l ac ağ ı na karar vermek için yeni b ir yapı kul l anac aktı r.
Sı nı f l arda, f oreac h anah tar kel imesi b ir metot ismi gib i kul l anı l arak sı nı f ı n f oreac h
döngü sü nde nası l davranac ağ ı nı b il direb il riz . Her b ir iterasyon sonuc u geri döndü rü l ec ek
değ eri ise yield anah tar söz c ü ğ ü il e b el irtil ir. Ö rneğ in h er b ir iterasyonda f arkl ı b ir
tamsayı değ eri el de etmek için sı nı f b il dirimi aş ağ ı daki gib i yapı l ab il ir.
pub l ic c l ass Sı nı f
{
pub l ic int f oreac h ()
{
yiel d 3;
yiel d 4;
yiel d 5;
}
}
Y ukarı da b il diril en Sı nı f tü rü nden nesnel er ü z erinde f oreac h döngü sü kul l anı l dı ğ ı nda
iterasyonl arda sı rası yl a 3,4 ve 5 sayı l arı el de edil ec ektir. Buna göre aş ağ ı daki kod parçası
ekrana 345 yaz ac aktı r.
pub l ic c l ass Sı nı f
{
private int[] el emanl ar;
İ simsiz metotl ar, b ir temsil c iye il iş kin kod b l okl arı nı emsil eder. Bil diğ iniz gib i temsil c il er
yapı sı nda metot ref erasnı tutan veri yapı l arı dı r. Bir temsil c i çağ rı mı yapı l dı ğ ı nda
temsil c inin temsil ettiğ i metot çal ı ş tı rı l ı r. Ö z el l ikl e görsel arayü z l ü programl ar yaz arken
event tab anl ı programl ama tekniğ i kul l anı l ı rken temsil c il erin kul l anı mı na sı kça rastl anı r.
Ö rneğ in b ir Button nesnesine tı kl andı ğ ı nda b el irl i b ir kod kü mesinin(metot) çal ı ş tı rı l ması
için temsil c i veri yapı sı ndan f aydal anı l ı r. Söz gel imi Button nesnesinin tı kl anma ol ayı
meydana gel diğ inde Cl ic k isiml i temsil c isine yeni b ir temsil c i atanı r. N e z aman b utton
nesnesinin Cl ic k ol ayı gerçekl eş se ardı ndan h emen temsil c inin temsil ettiğ i metot çağ rı l ı r.
Buna b ir örnek verec ek ol ursak;
pub l ic F orm
{
dugme = new Button();
dugme.Cl ic k + = new E ventHandl er(O nCl ic k);
}
Y ukarı daki koddan da görü l dü ğ ü ü z ere temsil c i il e temsil c inin temsil ettiğ i metotl ar ayrı
yerl erdedir. İ simsiz metotl arl a b u iş l emi b iraz dah a b asitl eş tirmek mü mkü ndü r. Temsil c i
ol uş turul duktan sonra açı l an ve kapanan parantez l er arası na temsil c i çağ rı l dı ğ ı nda
çal ı ş tı rı l ac ak kodl ar yaz ı l ab il ir. Y ukarı daki örneğ i isimsiz metot il e yapac ak ol ursak :
pub l ic F orm
{
dugme = new Button();
dugme.Cl ic k + = new E ventHandl er(ob j ec t sender, E ventA rgs e);
{
//çal ı ş tı rı l ac ak kodl ar.
};
}
Tanı ml anan kod b l oğ undan sonra noktal ı vü rgü l ü n ekl enmiş ol duğ una dikkat edin.
Temsil c i b l oğ undaki kodl ar normal metotl ardan b iraz f arkl ı dı r. N ormal kod b l okl arı il e
b enz er öz el l ikl er taş ı r. Y ukarı daki temsil c i kod b l oğ unda, b l ok dı ş ı nda tanı ml anan
değ iş kenl ere eriş eb il mek mü mkü ndü r. A yrı c a ol ay argü manl arı nı n da(sender,e)
E ventHandl er tü rü nü n parantez l eri içinde yaz ı l dı ğ ı nı da dikkat edin. Bir önc eki versiyonda
ol ay argü manl arı nı n yerine temsil edil en metodun ismi yaz ı l mı ş tı .
P eki isimsiz metotl ar nası l çal ı ş tı rı l maktadı r? İ simsiz metot tanı mı il e karş ı l aş an derl eyic i
tekil isme sah ip b ir sı nı f içinde tekil isme sah ip b ir metot ol uş turur ve isimsiz metot
gövdesindeki kodl ara b u tekil metot içinden eriş il ir. Temsil c i nesnesi çağ rı l dı ğ ı nda,
derl eyic inin ü rettiğ i b u metot il e isimsiz metodun b l oğ undaki kodl ar çal ı ş tı rı l ı r.
K ı smi tü rl er yardı mı yl a b ir sı nı f ı n el emanl arı nı f arkl ı dosyal arda sakl amak mü mkü ndü r.
Ö rneğ in D osya1.c s ve D osya2.c s aş ağ ı daki gib i ol sun.
//D osya1.c s
//D osya2.c s
Y ukarı daki iki dosyayı aynı anda derl ediğ imiz de eğ er kı smi tü rl er kavramı ol masaydı
derl eme z amanı nda h ata al ı rdı rk. Ç ü nkü aynı isim al anı nda b irden f az l a aynı isiml i sı nı f
b il dirimi yapı l mı ş . Hal b uki kı smi tü rl er il e b u iki sı nı f b il dirimi aynı sı nı f ol arak el e al ı nı r, ve
b irl eş tiril ir. Y ani deneme isiml i sı nı f ı n M etot1() ve M etot2() adı nda iki tane metodu ol muş
ol ur.
Bir tü re ait el emanl arı tek b ir dosya içinde topl amak N esne Y önel iml i P rograml ama
açı sı ndan h er ne kadar öneml i ol sada b az en f arkl ı dosyal arl a çal ı ş mak kodl arı mı z ı n
yönetil eb il irl iğ ini artı rab il mektedir.
N o t : Bu yaz ı "M SD N M agaz ine" deki "F uture F eatures of C# " b aş l ı kl a b il diri b az al ı narak
h az ı rl anmı ş tı r.
K aynak K od u nu zu X M L ile S üs leyin
Bü yü k yaz ı l ı m proj el erinde en öneml i aktivitel erden b irisi proj e b az ı nda iyi b ir
dökü mantasyon yapmaktı r; proj e anal iz sü rec indeki dökü mantasyon genel l ikl e standart
ol an U M L diyagraml arı il e yapı l maktadı r, tab i iş in b ir de gel iş tiric iye b akan taraf ı vardı r.
P roj enin en nih ayi sonu kod yaz mak ol duğ una göre kodl arı n dökü mantasyonu da en az
anal iz sü rec indeki dökü mantasyon kadar öneml idir. Bu yaz ı da .N E T il e b irl ikte ön pl ana
çı kan X M L yorum f ormatı il e kodl arı mı z ı nası l dökü mante edeb il ec eğ imiz i inc el eyec eğ iz .
Bil diğ iniz gib i kodl arı mı z a yorum satı rı koymamı z daki en b ü yü k amaç kodl arı n b aş kası
taraf ı ndan kol ayl ı kl a anl aş ı l ab il ir h al e gel mesini sağ l amaktı r. Baz en b u iş l emi kendimiz
içinde yapmak durumunda kal ab il iriz , z ira b ir çok karmaş ı k uygul amada yaz dı ğ ı mı z
kaynak koda yı l l ar sonra b el kide ayl ar sonra b aktı ğ ı mı z da vakt-i z amanı nda nel er
dü ş ü ndü ğ ü mü z h emen akl ı mı z a gel meyeb il ir. Bu durumda en b ü yü k yardı mc ı mı z o
z amanl ar temb el l ik etmeden yaz dı ğ ı mı z yorum satı rl arı ol ac aktı r. E ğ er kendiniz e yorum
satı rı ekl eme al ı ş kanl ı ğ ı nı kaz andı rı rsanı z b unun getirisini il eride mutl aka görec eksiniz .
P eki ne kadar yorum satı rı gerekl idir? Bu sorunun c evab ı siz e ve yaz dı ğ ı nı z kodl arı n
karmaş ı kl ı ğ ı na göre değ iş ir. E ğ er ş iir gib i kod yaz ı yorum diyorsanı z b el kide b ir c ü ml el ik
yorum satı rı iş iniz i göreb il ir, yok arap saçı gib i kod yaz ı yorum diyorsanı z b el kide
yaz dı ğ ı nı z kod satı rı sayı sı ndan dah a f az l a yorum yaz mak z orunda kal ab il irsiniz .
.N E T b ir çok mesel ede ol duğ u gib i yorum ekl eme mekaniz ması nı da estetik b ir ş ekil de
çöz mü ş tü r. Ç ok değ il dah a b ir kaç yı l önc esine kadar kaynak kodl arı mı z daki yorum
satı rl arı // ve /* */karekterl eri il e b el irtil iyordu. .N E T b u eski yorum yaz ma ş ekl ini
destekl emekl e b irl ikte X M L f ormatı ndaki yorum ekl eme mekaniz ması yl a ön pl ana
çı kmaktadı r. X M L sayesinde artı k kodl arı mı z daki yoruml ar standart h al e getiril miş tir.
Böyl ec e b ir X M L yorumunda b el irl i b ir etiketi gördü ğ ü mü z de o etiketin içindeki
açı kl amanı n neyi if ade ettiğ ini anl arı z . A ynı z amanda V S.N E T kodl arı mı z daki X M L
yoruml arı nı ayrı ş tı rarak saf b ir X M L dosyası da ü reteb il mektedir. Bu sayede X M L
f ormatı ndaki yorum dosyası nı istediğ imiz sistem il e rah atl ı kl a entegre edeb il irz , söz gel imi
proj e yönetic isine X M L dosyası ndaki yorum b il gil erini HTM L f ormatı nda sunab il iriz .
X M L Y o ru m S a tı rla rı
C# ' ta X M L yorum satı rl arı " /// (3 adet sl ash karakteri) " il e b aş l ayan satı rl arda yaz ı l ı r.
Ö nc eden b el irl enmiş b ir takı m standart X M L etiketl eri vardı r, öyl eki b u etiketl er aynı
z amanda E CM A taraf ı ndan da standart ol arak kab ul edil miş tir. A nc ak X M L etiketl erini
programc ı istediğ i ş ekil de ş irketin ih tiyaçl arı na yada kendi ih tiyaçl arı na göre geniş l eteb il ir.
X M L yorum yaz madaki b el kide tek kı sı t X M L söz diz imine uyma ş artı dı r. X M L söz diz imine
göre açı l an b ü tü n etiketl er kapanmal ı dı r.
E n çok kul l anı l an önc eden tanı ml ı X M L etiketl eri < p a r a m > , < r e m a r k s> , < su m m a r y >
v e < r e t u r ns> etiketl eridir. Bu etiketl erin b az ı l arı intel l isense ve "O b j ec t Brow ser"
programı taraf ı ndan kul l anı l maktadı r. Ö rneğ in V S.N E T editörü nde b ir nesne yaratı l dı ğ ı nda
nesne tü rü ne ait yapı c ı metottaki parametrel erin kı sa açı kl aması editör penc eresinde
gösteril ir. A ynı ş ekil de kendi yaz dı ğ ı mı z sı nı f l ar içinde b u açı kl amal arı n çı kması nı
istiyorsak X M L yorum etiketl erini kul l anmamı z gerekir.
A çı kl ayı c ı ol ması açı sı ndan örnek b ir sı nı f ü z erinde X M L yoruml arı nı ve V S.N E T gib i akı l l ı
editörl erde b u yoruml arı n ne gib i etkil erinin ol duğ unu inc el eyel im.
Ş imdi yeni b ir "Cl ass L ib rary" proj esi açı p aş ağ ı daki sı nı f b il dirimini yaz ı n.
using System;
namespac e X M L Y orum
{
///< summary>
/// Ceb ir sinif i b az i öz el matematiksel isl eml eri
/// yapmak için çesitl i statik metotl ar sunar.
///< /summary>
pub l ic c l ass Ceb ir
{
/// < remarks>
/// M utl ak D eger A l ma I sl emi
///< /remarks>
///< summary>
/// P arametre ol arak gel en sayinin
/// M utl ak D egerini al ir.
///< /summary>
///< param name="D eger">M utl ak D egeri al inac ak sayi.< /param>
///< returns>P aremetre ol arak gel en sayinin mutl ak degeri.< /returns>
pub l ic static int M utl akD eger(int D eger)
{
if (D eger < 0)
return -D eger;
el se
return D eger;
}
Y ukarı daki örnek koddan görü l dü ğ ü ü z ere sı nı f ve metot b il diriml erinden önc e /// il e
b aş l ayan satı rl arda X M L f ormatı nda yoruml ar yaz ı l mı ş tı r.V S.N E T kod editörü ///
karakterinden sonra < summary>, < param name="D eger"> ve < returns> etiketl erini
otomatik ol uş turdu. < remarks> etiketini ise kendimiz yaz mal ı yı z . X M L yorum etiketl eri de
intel l isense öz el l ikl erinden f aydal anı r. O tomatik tamaml ama iş l emi etiketl er içinde
geçerl idir.
Y ukarı daki örnekte < remarks> etiketi il e sı nı f yada metod il e il gil i kı sa b ir açı kl ama
yapı l ı r. < summary> etiketi içinde dah a ayrı ntı l ı b il gi veril ir. G erekirse çeş itl i teknik b il gil er
de b u etiket içinde b el irtil ir.
Ş imdi C# derl eyic isinin X M L f ormatı ndaki yoruml arı kaynak koddan ne ş ekil de ayı rdı ğ ı nı
görmek için proj eyi derl eyel im. P roj eyi derl emeden önc e eğ er V S.N E T kul l l anı yorsanı z
P roj e öz el l ikl eri(Sol utin E x pl orer' a sağ tı kl ayarak göreb il irsiniz ) penc eresinden
"Conf iguration P roperties/Buil d" sekmesinin al tı ndaki "X M L D oc umentation F il e" kutusuna
ol uş turul ac ak X M L dosyası nı n ismini aş ağ ı daki gib i yaz mal ı sı nı z . Tab i V S.N E T editörü nü n
intel l isense öz el l ikl erinden f aydal anmak istiyorsak X M L dosyası nı n ismini ol uş turul ac ak
D L L ismiyl e aynı veril mel iyiz .
E ğ er V S.N E T gib i akı l l ı b ir editörü nü z yoksa .N E T F ramew ork il e b irl ikte ü c retsiz ol arak
dağ ı tı l an ve komut satı rı ndan çal ı ş tı rı l ab il en C# derl eyic isini kul l anarak ta X M L yorum
dosyal arı nı ol uş turab il irsiniz . Bunun için yapmanı z gereken c sc derl eyic isini komut
satı rı ndan aş ağ ı daki gib i çal ı ş tı rmaktı r.
V S.N E T yada C# komut satı rı il e ol uş turul an X M L dosyası nı n yapı sı aş ağ ı daki gib idir.
Ş imdi b irde ol uş turduğ umuz Ceb ir isiml i b ir sı nı f a f arkl ı b ir proj eden ref erans verip
metotl arı nı kul l anal ı m. Y eni b ir Consol e uygul aması açı n ve ol uş turduğ umuz Ceb ir sı nı f ı na
ait assemb l y dosyası na ref erans verin. E ğ er komut satı rı derl eyic isi il e çal ı ş ı yorsanı z "
/r:Ceb ir.dl l " parametresini ekl eyin. Tab i b u durumda X M L yoruml arı nı n etkisini
göremeyec eksiniz . Ç ü nkü X M L yoruml arı nı göstermek V S.N E T teki akı l l ı editörü n b ir
yeteneğ idir. N otepad' in yada b aş ka tex t editörl erinden b u tü r imkanl ar b ekl ememek
l az ı m!
Ceb ir sı nı f ı nı n K areA l () metodunu kul l anmak istediğ imiz de V S.N E T' teki kod editörü b iz e
K areA l () metoduna il iş kin X M L f ormatı ndaki açı kl amayı sarı kutuc uk içinde aş ağ ı daki gib i
gösterec ektir. Böyl ec e kul l anac ağ ı mı z metodun veya sı nı f ı n b il dirimine b akmamı z a gerek
kal mamı ş tı r.
A ynı durum parametrel er içinde geçerl idir. Ö rneğ in K areA l () metodunun çağ rı m
parantez ini yaz dı ğ ı mı z anda aktif parametre il e il gil i X M L açı kl aması aş ağ ı daki gib i
gösteril ir.
A ynı X M L yoruml arı V S.N E T il e entegre çal ı ş an "O b j ec t Brow ser" arayü z ü il e de aş ağ ı daki
gib i gösteril mektedir.
N ot : "O b j ec t Brow ser" penc eresine eriş mek için (Ctrl + A lt + J) tuş komb inasyonunu
kul l anab il irsiniz .
X M L yorum etiketl eri yukarı da anl atı l anl ar il e sı nı rl ı değ il dir. A ş ağ ı da kul l anı l ab il ec ek
standart etiketl er al f ab etik sı raya göre topl u b ir ş ekil de tab l o h al inde açı kl amal arı yl a
b irl ikte veril miş tir.
<c > A çı kl ama içindeki b ir b öl ü mü n "kod f ontu" ş ekl inde ol duğ unu
vurgul mak için kul l anı l ı r.
Ö rnek :
<c o de> X M L açı kl aması içinde uz un b ir kod b l oğ u örneğ i veril ec ekse diğ er
yaz ı l ardan ayı rmak için kod b l oğ u b u etiket arası nda yaz ı l ı r.
Ö rnek :
<exa mple> Bir metodun yada sı nı f ı n ne ş ekil de kul l anı l ac ağ ı nı açı kl ayan b l ok b u
etiket içinde yaz ı l ı r. < c ode> etiketinin kul l anı mı il e h emen h emen
eş değ erdedir. < c ode> etiketini veril en örneğ in aynı sı < ex ampl e>
etiketi içinde geçerl i ol duğ u ayrı c a b ir örnek vermeye gerek yoktur.
<exc epito n> Bir metodun f ı rl atab il ec eğ i istisnai duruml arl a il gil i b il gi vermek için
kul l anı l ı r. < ex c eption> etiketi "c ref " nitel iğ i il e b irl ikte kul l anı l ı r.
"c ref " nitel iğ i il e f ı rl atı l ac ak istisnai durum(ex c eption) sı nf ı nı n tü rü
b el irtil ir.
Ö rnek :
<list> HTM L kodl arı ndaki < l i> etiketine b enz er b ir amac ı vardı r. L iste
ş ekl inde b ir yapı ol uş ması gerektiğ i b il diril ir. < l isth eader> l istedeki
b aş l ı k b il gisini, < item> l istedeki h er el emanı , < term> h er
el emandaki terimi ve < desc ription> b u el eman h akkı ndaki detayl ı
b il giyi b il dirir.
Ö rnek :
<pa ra > < summary> gib i uz un açı kl ama b l okl arı nda b ir paragraf ı b el irtmek
için kul l anı l ı r.
Ö rnek :
<pa ra m> Bir metodun parametrel eri il e il gil i b il gi vermek için kul l anı l ı r.
Ö rnek :
<pa ra mref> < paramref > etiketl eri içerisine al ı nan yerde asl ı nda metodun il gil i
parametresinin ol duğ u b il diril ir. Böyl ec e ol uş ac ak X M L yorum
dosyası nı daki b u etiketi f arkl ı b ir b içimde yoruml ama ş ansı na sah ip
ol uruz .
Ö rnek :
<permissio n> Üye el emanl a il gil i gü venl ik b il gisi vermektedir. Ö rneğ in b ir metoda
yada sı nı f a kiml erin eriş ec eğ i ve ne ş ekil de eriş ec eğ i b u etiket
kul l anı l arak b el irtil eb il ir.
Ö rnek :
<rema rk s> Bir tü r h akkı nda kı sa b ir açı kl ama vermek için kul l anı l ı r.
Ö rnek :
///< remarks>
/// Ö z el c eb irsel iş l eml eri tanı ml ar.
///< /remarks>
pub l ic c l ass Ceb ir
{
....
}
<retu rns> Bir metodun geri dönü ş değ eri il gil i b il gi vermek için kul l anı l ı r.
Ö rnek :
<see> Y az ı içinde b ir b ağ l antı nı n(l ink) ol ac ağ ı nı b el irtir. "c ref " nitel iğ i il e
b irl ikte kul l anı l ı r. "c ref " nitel iğ i b ağ l antı nı n ol ac ağ ı ü ye el emanı
simgel er.
Ö rnek :
<seea lso > Y az ı içinde il gil i el emanl a yakı ndan il iş kil i ol an diğ er el emanl ara
b ağ l antı vermek için kul l anı l ı r. K ul l anı mı < see> etiketi il e aynı dı r.
Ö rnek :
<su mma ry> Üye el emanl a il gil i geniş açı kl ama yaz mak için kul l anı l an b ir
etikettir.
Ö rnek :
///< summary>
/// Ceb ir sinif i b az i öz el matematiksel isl eml eri
/// yapmak için çesitl i statik metotl ar sunar.
///< /summary>
pub l ic c l ass Ceb ir
{
...
}
Ö rnek :
Simdi siz l ere V isual C# N E T’ te b ir W indow s Control nası l yapı l ı r ve b u W indow s Control ’ ü
programl arı mı z da nası l kul l anı rı z onu gösterec eğ im. G österec eğ im örneğ i çok b asit
seçtim, b unun nedeni de yaratı c ı l ı ğ ı siz arkadasl arı ma b ı rakmayı uygun görmemdir.
Ş imdi örneğ imiz i adı m adı m inc el eyel im.
Ş imdi sorab il irsiniz b u W indow s Control ’ ü proj el erimiz de nası l kul l anac ağ ı z ? Y ine adı m
adı m anl atal ı m.
I . Y eni b ir proj e açı n veya önc eden var ol an b ir proj eyi açı n. Ben b urada
D eneme adı nda yeni b ir proj e açtı m.
N o t: E ğ er kendi Tool ’ l arı nı z ı kul l anarak b ir proj e yapı yorsanı z ve yaptı gı nı z proj eyi b aska
makinel erde çal ı ş tı rmak isterseniz kul l andı gı nı z Tool ’ l arı o makineye yukarı da b ah settigim
sekil de yü kl emeniz gerekir.
C#’ t a I nh erit anc e( M iras ) K av ramı
Bu yaz ı da inh eritanc e’ ı n programl amada ne anl ama gel diğ inden b ah sedec eğ im.
I nh eritanc e asl ı nda O j ec t O riented P rogramming! in (N esne Y önel iml i P rograml ama) ü ç
prensib inden b ir tanesidir. D iğ er iki prensip ise enc apsul ation ve pol ymorph ism’ dir.
Tab ii ki diğ er iki prensib e b u yaz ı da değ inmeyec eğ im. E n sade ş ekl iyl e: inh eritanc e
sayesinde b ir sı nı f ı n metodl arı nı kul l anan b aş ka sı nı f l ar tü retil eb il mesine yarar
diyeb il iriz . A nc ak ayrı ntı l arı na b iraz dan inec eğ im. E ğ er dah a önc e nesne tab anl ı b ir
programl ama dil i kul l andı ysanı z , (Java ve C+ + gib i) C# ’ ta inh eritanc e’ a çok çab uk
adapte ol ursunuz . A sl ı nda ş u ana kadar b ah settikl erim genel kü l tü rden ib aretti ve
eminim çoğ unuz da b unl arı b il iyordunuz . (N esne Tab anl ı P rograml ama geçmiş i
ol mayanl arı da dü ş ü nerek b öyl e b ir giriş yaptı m.)
E vet ş imdi ana kı sma yani programı n nası l yaz ı l ac ağ ı na gel iyoruz . Bunun için b asit b ir
örnek verec eğ im. D ü ş ü nü n ki student adı nda b ir sı nı f ı mı z (c l ass) ol sun. A yrı c a b ir de
teac h er adı nda b ir sı nı f ı ı mı z ol sun. Bunl arı n ortak öz el l ikl eri nedir? Tab ii ki insan
ol mal arı diyec eksiniz ve ana sı nı f ı mı z a yani person sı nı f ı na ul aş mı ş ol ac aksı nı z . Ş imdi
b asitçe öz etl ersek person sı nı f ’ ı ndan teac h er ve student adı nda iki sı nı f tü retmiş ol duk.
Sı rada b unun kodunu nası l yaz ac ağ ı mı z var. A l ı ş kanl ı kl ara devam edip adı m adı m kodu
yaz al ı m. (Bunu program yaz arken de il ke edinirseniz f aydal ı ol ac ağ ı na inanı yorum.
Ö nc e ne yapac ağ ı nı z ı adı m adı m b el irl eyin sonra b el irl edikl eriniz i adı m adı m
uygul amaya geçirin.)
using System;
using System.Windows.Forms;
namespace Miras
public Person()
}
}
using System.Windows.Forms;
namespace Miras
{
this.Name=name;
this.Age = age;
this.Gender=gender;
using System;
using System.Windows.Forms;
namespace Miras
// miras alıyor
}
public Teacher(string name,int age,string gender,string unvan)
this.Name=name;
this.Age = age;
this.Gender=gender;
this.Unvan=unvan;
I. Abstaract (soyut) sınıftan yeni bir sınıf türetilemez. Örneğimizde person sınıfı abstract sınıftır ve new
anahtar sözcüğü kullanılarak yeni nesne oluşturulmaz.
II. Abstract metodların mutlaka içleri boş olarak yaratılır ve türetildikleri sınıflarda (en az bir sınıf
türetilmek zorunda) mutlaka içleri override anahtar sözcüğü kullanılarak doldurulur.
III. Bir sınıftan miras yolu ile başka bir sınıf türetileceği zaman temel sınıf(base class) illa ki abstract
anahtar sözcüğü ile tanımlanmak zorunda değildir. (Eğer abstract metod içermiyorsa.)
N o t: Y ukarı da kodl arı nı yaz dı ğ ı m sı nı f l arı n b asit b ir kul l anı mı nı içeren M iras adı ndaki
proj eyi indirmek için b uraya tı kl ayab il irsiniz . Bu sayede kaf al arda h içb ir soru iş areti
kal ması n istiyorum. P roj eyi çal ı ş tı rdı ğ ı nı z z aman b ir w indow s f orm’ u gel ec ek. Bu f ormun
ü z erinde iki tane b uton var.
Ben C’ dil ini öğ renmeye 1 yı l önc e Üniversite’ de M S D O S ortamı nda yaptı ğ ı mı z b asit
matematiksel iş l eml erl e b aş l adı m.G erçektende h er programda al ı ş ı l a gel memiş b ir çok
komut vardı . G ü nü mü z de kul l anı l an C# dil ine göre çok gel iş memiş ol an b u dil e o kadar
ı sı nmı ş tı k ki artı k uygul amal ara yetiş emez ol duk. C çok eskiden çı kan b ir dil f akat gel iş imi
ve insanl arı n ona yetiş mesi çok h ı z l ı idi. Sı rası yl a C,C+ + ,C# b en b una 3D diyorum yani 3
dev demekl e yetiniyorum. C dil i b ir çok dil in temel i veya ü stü nde b ir dil . Hemen h emen
h er al anda kul l anı l maktadı r. M esel a Javasc ript,A c tionSc ript... E n öneml i ol an uygul ama
al anı ise W indow s ve L inux gib i gü çl ü b ir iş l etim sisteml erinin C de yaz ı l ması dı r. C dil inin
uygul ama al anl arı sadec e saydı kl arı ml a sı nı rl ı değ il dir ama b u al anl arı n h epsini b urda
l istel emem mü mkü n değ il dir.
.N E T F ramew ork, programc ı l ara aş ina ol duğ u kod dil ini kul l anma öz gü rl ü ğ ü tanı yarak b ir
devrim gerçekl eş tirdi. V e, b el l i b el irtiml ere sadı k kal ı ndı ğ ı sü rec e, f arkl ı dil l erl e yaz ı l mı ş
uygul amal arı n b irb iriyl e etkil eş eb il ec eğ inin de teminatı nı verdi.
E vet, .N E T dil l er arası etkil eş ime ol anak tanı yan, b ir çok dil e destek veren b ir pl atf orm.
Üçü nc ü parti derl eyic il er yaz ı l arak .N E T için h er an yeni b ir dil dah a yaz ı l ab il ir. A ma
h erş eyden önc e, .N E T' in b erab erinde sunduğ u dil l ere b akmak gerekiyor. Bu dil l er temel
ol arak 4 tane: C+ + , V isual Basic .N E T, C# ve J# .N E T. D ikkat edil irse b u l istede, "b en
yeniyim" diye göz kı rpan b ir tanesi var : C# . Y az ı mı z da, b u yeni dil i tanı maya çal ı ş ac ağ ı z .
C# (si ş arp) h erkesin dil e getirmiş ol duğ u gib i C+ + ve Java ‘ nı n b irl eş mesiyl e
ol uş muş tur. Henü z nası l b ir b irl eş me ş ekl i ol duğ una dair tam b ir f ikrim yok ama C#
mü kemmel b ir kü tü ph aneye sah ip. Bu kü tü ph aneye uf ak b ir göz aş inal ı ğ ı mı z ol ac ak ama
il erideki yaz ı l arı mı z da diğ er dil l erden b ü yü k b ir f arkı ol an esnek b ir yapı ya sah ip ol ması nı
inc el eyec eğ im. N edir b u esnekl ik? Y ani P rogram yaz arken "of b e b u dil in de b u öz el l iğ i
yokmuş " dediğ imiz anl ar ol muş tur. C il e de ş ü ph esiz nesnel programl ama yapab il iriz .
F akat b unu yapab il mek ol dukça z ordur. C+ + ise N esne yönel iml i programl amaya imkan
vermekten öte z aten b u paradigmaya göre tasarl anmı ş tı r ve yapı sı ndaki araçl ar
sayesinde b unu kol ayl aş tı rmı ş tı r. İ ş te C- C+ + arası ndaki f ark b u peki C# ' ı n öz el l iğ i nedir?
N esne yönel iml i programl amanı n gü nü mü z de ne kadar yaygı n ol duğ unu programl ama il e
il gil enen h erkes b il mektedir. N esne Y önel iml i P rograml ama (N Y P ) yakl aş ı mı nda temel
ol an prensipl erden b irisi b il gi giz l eme (inf ormation h iding)' dir. Bu prensib i proj el erimiz de
uygul amak için C# ' in sunduğ u en öneml i araçl ardan b iri ol an sı nı f öz el l ikl eri (c l ass
properties) konusunu inc el eyec eğ iz .
Bil diğ iniz gib i, C# dil inde tasarl anmı ş b ir sı nı f ta iki temel unsur b ul unur. Birinc isi sı nı f ı n
öz el l ikl eri (f iel ds), ikinic isi ise sı nı f ı n metodl ari (meth ods)' dı r. Herh angi b ir sı nı f ı n
öz el l ikeri sı nı f ta tutul an il iş ikil i veril erl erdir. D iğ er taraf tan sı nı f ı n b iz im için değ iş ik iş l eri
yapması nı metodl arı vası tası yl a sağ l arı z . Sı nı f tasarı mı çok öneml i b ir iş ol up; deneyim,
konsantrasyon ve dikkat ister. Sı nı f ı mı z ı n öz el l ikl erini tutan veril er, program akı ş ı
sı rası nda sı nı f dı ş ı nda değ iş tiril eb il ir veya b u değ erl ere ul aş mak istenil eb il ir.
E l b etteki C# h akkı nda b il inmesi gerekenl er b u kadarl a sı nı rl ı değ il dir. Bundan sonraki
yaz ı l arı mda h erş eyi dah a ayrı ntı l arı yl a aktarmaya çal ı ş ac ağ ı m.
.N E T İ ç in T av s iye E d ilen İ s imlend irme K onv ans iyonları – 1
İ siml endirme kavramı ,programl ama dü nyası nda kompl ex kodl arı n yaz ı l maya
b aş l anması yl a,öz el l ikl e de O O P L (N esne Y önel iml i P rograml ama D il l eri) nin gel iş mesiyl e
b ü yü k önem kaz andı . Ç ü nkü ortak ol mayan ve anl amsı z isiml er,modul l ere b öl ü nmü ş ve
çöz ü m uz ayl arı na ayrı l mı ş ,spesif ikasyonl arı h az ı rl anmı ş ,yani en öneml i b öl ü mü h al l edil miş
b ir programı n sadec e kodl ama aş aması nda çeş itl i c iddi h atal ara yol açı l ması na seb ep
ol uyordu. Bir kiş iden f az l ası nı n çal ı ş ması nı gerektiren proj el erde insanl ar b irb irl erinin
yaz dı kl arı kodu anl amı yor, h atta b ir kiş inin kendi yaz dı ğ ı programı b il e dah a sonra
b aktı ğ ı nda anl aması gü çl eş iyordu.
İ siml endirme konvansiyonl arı nı kul l anmanı n diğ er b az ı avantaj l arı ise ş unl ardı r :
o İ sim seçme iş l emi artı k mekanik ol duğ undan ü z erinde dü ş ü nmeye gerek
kal maz , h ı z l ı çal ı ş ı rsı nı z .
o Takı m çal ı ş mal arı nda aynı dil i konuş manı z ı sağ l ar.
o O rtam h az ı rl ayı c ı l arı taraf ı ndan b el irl enen notasyonu kul l anmak,ortam
taraf ı ndan otomatik ol arak koda yerl eş tirl ien kod parçal arı il e de uyuml u
ol ac ağ ı için ( ör: F orm D esigner’ ı n koda ekl entil eri ) tam uyum sağ l ar.
Bu sorunl ara b ir çöz ü m b ul mak için notasyon adı veril en standartl ar gel iş tiril di.
O rtaml arı n f arkl ı l ı ğ ı ndan dol ayı b irçok standard ortaya çı ktı . Bunl ardan b az ı l arı ş unl ardı r :
Bu isiml endirmenin getirdiğ i f aydal ar artı k modern programl ama ortaml arı nı n
gel iş tiril mesiyl e ortadan kal kmı ş tı r. Ç ü nkü ,mesel a .N et gib i b ir ortamda b ir değ iş kenin tipi
z aten kodun h er yerinde b el l idir,b undan dol ayı ismi uz atmaya gerek yoktur. Y ani,b u
notasyonun gü nü mü z de kul l anı mı artı k az al mı ş tı r.
Bu notasyonun temel inde tanı ml ayı c ı nı n tipinden çok tü rü öneml idir,yani int
mi,sh ort mu ol ması ndan çok ü ye,sı nı f ,f onksiyon ol ması na gore isiml endiril ir. E vent
isiml eri ise (O n) il e b aş l ar. Ö rnek ol arak m_ soc ket, i_ c ounter,O nCl ose b u notasyona göre
iyi isiml endiril miş tanı ml ayı c ı l ardandı r.
Üstte b el ittiğ imiz diğ er notasyonl ardan f arkl ı ol arak b u notasyonda kel imel er
arası nda al tçiz gi ( _ ) karakteri b ul unma ş artı getiril miş tir. Ö rneğ in
gl ob al _ numb er_ inc rease gü z el b ir isiml endirme iken ic antreadth is iyi değ il dir. A yrı c a b az ı
G N U derl eyic il erinde 8 ve/veya 14 h arf ten f az l ası na iz in veril mediğ inden z orunl u ol arak
b u derl eyic il erin standartl arı na h arf sı nı rl aması da getiril miş tir.
A yrı c a yine b az ı derl eyic il erde ( _ _ ) il e b aş l ayan değ erl er ayrı l mı ş tı r. Bundan
dol ayı al tçiz gi il e b aş l ayan isiml endirmel er iyi isiml endirme örneğ i değ il dirl er.
Y az ı nı n b u kı smı na kadar , varol an isiml endirme çeş itl erini iyic e anl adı ğ ı mı z ı
umuyorum. F akat h al a b enim kendi isiml endirme standardı m ol mal ı diyorsak, dikkat
etmemiz gereken b az ı noktal ar var.
Bü tü n standartl arda ortak ol ması gereken noktal arı ise ş öyl e sı ral ayab il iriz :
Tanı ml ayı c ı nı n(değ iş kenin,sı nı f ı n,metodun vb ...) amac ı doğ rul tusunda isiml er
veril mesi gerekir. M esel a okul daki öğ renc i sayı sı nı tutan b ir değ iş kene “ tamsayi”
o
ş ekl inde isim vermek yerine “ ogrenc isayisi” ş ekl inde isim vermek dah a mantı kl ı
ol ac aktı r.
Tanı ml ayı c ı nı n ismi b ü yü k ve kü çü k h arf l eriyl e okunab il ir ve anl aş ı l ı r uz unl ukta
ol mal ı dı r.
o
M ü mkü n ol duğ unc a kı sal tmal arı az al tmal ı dı r. Ç ü nkü kı sal tmal ar çoğ u z aman
teh l ikel i ol ab il mektedir. Ö rneğ in “ Ctr” “ Control ” ol arak anl aş ı l ab il ec eğ i gib i
o
ol mamal ı dı r
D ah a sonra iş kendi isiml endirme standardı mı z ı n ş artl arı nı ol uş turmaya b akı yor.
Bunun için b u yaz ı genel b ir f ikir vereb il ir. İ siml endirme teknikl eriniz i,h içb ir
tanı ml ayı c ı tipi açı kta kal mayac ak ş ekil de tasarl adı ktan sonra proj enin dah a sonra da
aynı mantı kl a gel iş tiril mesi ve isiml endirme konvansiyonunuz un kal ı c ı l ı ğ ı nı
koruyab il mesi için iyi b ir ş ekil de dökü mante etmel isiniz .
D ökü mantasyonunuz isiml endirme konvansiyonunuz l a il gil i h erş eyi içermel idir(Tip
isiml eri,ön ekl er,arka ekl er,kı sal tmal ar,ekl entil er,öz el karakterl er,vb ...) .
V e son söz ol arak , unutmayal ı m ki , b ir çok kod b ir kez yaz ı l ı r ama b inl erc e kez
okunur. Bunu göz önü ne al arak kodl amamı z ı dah a prof osyonel standartl ara taş ı yal ı m.
G eçen yaz ı mda inh eritanc e' tan b ah sederken enc apsul ation diye b ir kavramdan
b ah setmiş tik, ş imdi b u kavramı açı kl ayac ağ ı m. D ah a önc eki yaz ı mda b el irttiğ im gib i 3
O O P prensib inden b iri. Tü rkçe karş ı l ı ğ ı na gel irsek kapsü l l eme demek. A nc ak b il gisayar
terimi ol arak b iraz açarsak kapsü l l eme, yönettiğ i kod ve veriyi b irb irine b ağ l ayan ve b u
ikisini dı ş kaynakl ı karı ş tı rma ve yanl ı ş kul l anı mdan koruyan b ir mekanı z madı r. Bu sayede
veriyi dı ş ortamdan koruyan b ir amb al aj vaz if esi gördü ğ ü nü de söyl eyeb il iriz . Ş imdi
kapsü l l emeyi b il iyoruz da C# ' ta yada .N et F ramew ork' ü nde ne gib i f arkl ı l ı kl ar var
diyec eksiniz ? Ö nc el ikl e .N et F ramew ork' ü nde gel en yenil ikl erden b ah sedel im.
I . E riş im b el irteçl erinin(A c c ess M odif iers) varl ı ğ ı kapsü l l emeyi çok dah a rah at
yapab il memiz e ol anak sağ l ar. Bu sayede b ir metod veya b ir değ iş ken anah tar
söz c ü kl er(keyw ords) arac ı l ı ğ ı yl a sadec e önc eden b el irl enen sı nı rl ar dah il inde kul l anı l ab il ir.
Y ada b unl ara b el irl enen sı nı rl ar içinden ul aş ı l ab il ir. Burada b ah sedil en keyw ord' l eri
b iraz dan açı kl ayac ağ ı m. (Tab ii ki C# ' ta kul l anı l an keyw ordl eri açı kl ayac ağ ı m. V e
kul l anı ml arı nı b asitçe anl atac ağ ı m.)
I I . Ö z el l ik(P roperty) Sah al arı nı n kul l anı mı (Bunun yapı mı nı il erde C# kodu il e
gösterec eğ im.) Bu sayede .N et F ramew ork kapsü l l emeyi destekl er.
I I I . Soyut sı nı f (ab strac t c l ass) ve soyut metodl arı n(ab strac t meth ods) kul l anı mı . A sl ı nda
kal ı tı m(inh eritanc e) konusunu anl atı rken tab an sı nı f ı mı z (b ase c l ass) soyut sı nı f idi. O nun
için b u kı smı sadec e açı kl ayac ağ ı m. Ö rnek vermeyec eğ im. Ö rneğ i görmek isteyenl er
miras(inh eritanc e) konusunu anl attı ğ ı m yaz ı daki örneğ i inc el erl erse istedikl eri b il giye
ul aş ab il irl er.
E vet b u kadarl ı k giriş yeter. Ş imdi yukarı da anl attı ğ ı m 3 maddeyi enine b oyuna
tartı ş al ı m.
I . E riş im b el irteçl erinin ne iş e yaradı kl arı ndan yukarı da b ah settiğ im için b urada direkt
eriş im b el irteçl erinin nel er ol dukl arı nı yaz al ı m ve eriş im sı nı rl arı nı çiz el im. E riş im sı nı rl arı
geniş ol andan dar ol ana doğ ru b ir sı ral ama yaparsak.
• pub l ic : Bü tü n h er yerden eriş il mek istenen veril er pub l ic anah tar söz c ü ğ ü il e
b irl ikte kul l anı l ı r. Sadec e aynı proj e içerisinden değ il diğ er proj el er içerisinden de
eriş il eb il ir.
• internal : A ynı assemb l y içindeki tü m sı nı f l ar eriş eb il ir. Y ani pub l ic anah tar
söz c ü ğ ü nü n sadec e aynı proj e içinden eriş il eb il eni. (V B .N et' te ise F riend anah tar
söz c ü ğ ü ne karş ı l ı k gel ir.)
• protec ted: P rotec ted anah tar söz c ü ğ ü il e b irl ikte kul l anı l an veril ere ise sadec e b ir
al t sı nı f a kadar eriş il eb il ir.
• private: Bu ise sadec e tanı ml andı ğ ı sı nı f ta geçerl i ol an veril er için kul l anı l ı r.
A nc ak kontrol l erde(c ontrol l er) yaygı n ol an kul l anı m ş ekl i kontrol l erin dı ş arı dan eriş il mesi
istenen metodl arı nı n(aynı anda diyel im ki 3 tane kontrol ' ü n b el l i metodl arı nı n çal ı ş ması
gerekl i ol ab il ir.) pub l ic anah tar söz c ü ğ ü kul l anı l an b ir metod içinde tanı ml anması dı r.
Ş imdi b u durumun nası l yapı l dı ğ ı nı gösteren mini b ir örnek kod yaz al ı m. K odda b el irtil en
kontrol l erin dah a önc eden tanı ml anmı ş ol duğ unu dü ş ü nel im.
Y ukarı daki metod b ir renk parametresi gönderil erek çağ rı l dı ğ ı z aman yukarı da yaz an
b ü tü n (dah a önc ede private anah tar söz c ü ğ ü il e tanı ml anmı ş ol dukl arı nı kab ul etmiş tik.)
kontrol l erin rengini gönderil en renge değ iş tirmeye yarı yor. Bu sayede yukarı daki
kontrol l erin h epsinin Bac kCol or dı ş ı ndaki metodl arı dı ş dü nyadan soyutl anmı ş ol uyor.
A sl ı nda yaptı ğ ı mı z metod pub l ic anah tar söz c ü ğ ü il e tanı ml anmayı p internal anah tar
söz c ü ğ ü il e de tanı ml anab il ir. Bu b iz im metodun içindeki kontrol l ere ait Bac kCol or
metodl arı nı n dı ş dü nyadan ne kadar soyutl anması nı istediğ imiz a b ağ l ı dı r.
I I . Ö z el l ik sah al arı sı nı f l ara ait öz el (private) değ iş kenl erin aynı metodl ar gib i dı ş dü nyaya
açı l mal arı nı sağ l ı yor. Sadec e okuma amaçl ı dı ş a açı l ı m yapı l ab il diğ i gib i h em okuma-h em
yaz ma amaçl ı b ir açı l ı m da yapı l ab il ir. Teorik ol arak sadec e yaz ma amaçl ı da b ir açı l ı m
ol sa da ne kadar mantı kl ı ol ur b il mem! ! ! ! Ş imdi örnekl erimiz e geçel im.
Soyut metodl ara gel inc e b unl arı n ise soyut sı nı f l arda kul l anı l ac ağ ı ndan b ah setmiş tik.
Bunun b iz e sağ l adı ğ ı avantaj b u metodl arı n tü retil en sı nı f l arda nası l gerçekl eş tiril diğ ini
b il mek z orunda ol mamamı z dı r. A sl ı nda b unu söyl eyerek pol ymorph ism' in yararı ndan
b ah setmiş ol duk. Y ani pol ymorph ism veri soyutl aması yaparak sadec e il gil enmemiz
gereken ol ayl ar ve veril erl e il gil enmemiz e ol anak sağ l ı yor. Bu sayede tab an sı nı f ı ndan
tü retil en ve aynı metodu f arkl ı gerçekl eş tiriml erl e(impl ementation) kul l anan b irden f az l a
sı nı f a sah ip ol ab il iyoruz . E n b asit örnek ü çgen b ir çokgen, kare de b ir çokgen ve h er
ikisinin de b ir al anı mevc ut. Hemen b asitçe b ir tasl ak çı karı rsak çokgen sı nı f ı soyut tab an
sı nı f ı ve al an adı nda soyut b ir metoda sah ip. Üçgen ve kare sı nı f l arı ise tü retil en sı nı f l ar
ve al an metodunu istedikl eri b içimde gerçekl eş tiriyorl ar. (Bu iş l eml erin nası l yapı l dı ğ ı
miras konusunu anl attı ğ ı m yaz ı da mevc uttur.)
Bir de soyut öz el l ikl er(ab strac t property) var. Bunl arı n kul l anı mı ise soyut metodl ar il e
öz el l ikl erin b irl ikte kul l anı mı il e ortaya çı kmakta. Buna b ir örnek kod verirsem anl aş ı l ması
dah a kol ay ol ac aktı r. A nc ak b unl arı n kul l anı mı na çok sı k rastl amadı ğ ı mı b el irtmem
gerekir.
Sanı rı m aş ağ ı daki örnek kod parçası soyut öz el l ikl erin kul l anı mı nı dah a da netl eş tirmiş tir.
P ol ymorph ism' den b ah settik. Ş imdi ise yal anc ı pol ymorph ism' den b ah sedel im. A sl ı nda b ir
örnekl e b iraz dah a açarsam dah a net ol ur. D iyel im ki b ir karş ı l aş tı rma metodunuz var ve
h em integer h em de string veri tipl erini karş ı l aş tı rmak istiyorsunuz . Y al anc ı pol ymorph ism
sayesinde aynı isimde iki metod yaz arak b u isteğ iniz i gerçekl eş tireb il irsiniz . Bunun için
mini b ir örnek kod yaz al ı m isterseniz .
A ş ağ ı da yaz ac ağ ı m metodl arı n aynı sı nı f içinde yaz ı l dı ğ ı nı dü ş ü nel im. Ş imdi b u metodl arı
kul l anı rken metodl arı n içinde yer al dı ğ ı sı nı f tan ü retil en nesneninadi.karsil astir(
yaz dı ğ ı mı z anda kod tamaml ayı c ı sı b iz e iki seçenek sunar b iri b u metodun iki tane integer
veri tipi il e çal ı ş tı ğ ı , ikinc isi ise b u metodun iki tane string veri tipi il e çal ı ş tı ğ ı dı r. Bu
sayede b ir arab irim il e b irden f az l a metod gerçekl eş tiril miş ol ur.
A sl ı nda b ir metodun b irden f az l a gerçekl eş tirime sah ip ol ması ol ayı na overl oading denir.
D ikkat edil mesi gereken nokta overl oading il e overriding' in b irb irine karı ş tı rı l maması dı r.
U nutmayı n overl oading' te b ü tü n iş l eml er aynı sı nı f içerisinde ol uyor. O verriding' te ise tek
b ir sı nı f yerine tab an sı nı f ı il e b u sı nı f tan tü retil en sı nı f l ar iş in içine giriyor.
E vet b u yaz ı da anl atac akl arı m sona erdi. K af anı z a takı l an kı sı ml ar için mail adresimi
tekrarl ı yorum
Yeni N es il İ ş U ygu lamalarının M imarı C# v e D iğ er D iller
Ş irket yönetic il eri gel iş tiril ec ek proj e için b ir programl ama dil ini seçmek z orunda
kal dı ğ ı nda genel ikl e ş u soruyu sorar : Hangi programl ama dil i il e proj eyi en etkin ve en
h ı z l ı ş ekil de mü ş terime sunab il ec eğ im h al e getireb il irim? Bu sorunun çöz ü mü ne ul aş mak
o kadar da kol ay ol muyor maal esef . Ç öz ü me z or ul aş mada programl ama dil l erinin f az l a
ol ması nı n etkisi omakl a b erab er h er b ir programl ama dil inin sunduğ u standart
kü tü ph anenin f arkl ı ol ması nı n da etkisi ol dukça f az l adı r. Ö z el l ikl e gü nü mü z iş
uygul amal arı b irden f az l a pl atf ormu destel emek z orunda kal mı ş tı r. Buda seçil ec ek
uygul ama gel iş tirme ortamı nı n önemini açı kc a göstermektedir. U ygul amal arı n internet
ortamı na taş ı nması il e b irl ikte b ir programl ama dil inden b ekl enen öz el l ikl erde doğ al
ol arak değ iş miş tir. 19 7 0’ l i yı l l arda b ir mikroiş l emc iyi programl amak ne denl i öneml i
ol duysa 2000’ l i yı l l arda interneti programl amak o kadar öneml i ol muş tur.
İ nternet’ in iş dü nyası na giriş i il e b irl ikte gel iş tiril en uygul amal ardan b ekl enenl er de
değ iş miş tir. Bu durum doğ al ol arak uygul ama gel iş tiric il eri doğ rudan etkil emiş tir. İ nternet
ortamı nda çal ı ş an ve dağ ı tı k yapı da çal ı ş ab il en çok yönl ü b ir uygul ama gel iş tirmek eski
yönteml erl e imkansı z değ il dir anc ak inanı l maz derec ede z aman ve insan gü c ü
gerektirmektedir. Bu z orul ukl arı aş mak için gel iş en teknol oj iye ve istekl ere paral el ol arak
programl ama dil l eri de doğ al gel iş im içine girmiş tir. Bu yaz ı da son yı l l arda iş ve kiş isel
uygul ama gel iş tiric il erin adı nı sı kça duyduğ u C# programl ama dil i ve diğ er dil l erl e ol an
il iş kisi anl atı l ac aktı r. C# programl ama dil inin sunduğ u imkanl arı anl atmaya b aş l amadan
önc e programl ama dil l erinin tarih sel gel iş imine göz atmak gerekir. Z ira C# dil i yı l l ardı r
yoğ un b ir ş ekil de kul l anı l an C,C+ + ve JA V A dil l erinin temel l eri ü z erine kurul muş tur. Ş unu
da h emen b el irtel im ki, son gel iş tiril en il k gel iş tiril enden çoğ u z aman dah a iyi ol ac aktı r.
Bu yü z den eski il e yeniyi karş ı l aş tı rı rken tic ari amaçl arı b ir kenara b ı rakı p ob j ektif b ir
göz l e değ erl endirmek gerekir.
C dili v e Y a pı sa l P ro g ra mla ma
D ü ş ü ndü kl erimiz i makinel ere yaptı rma isteğ imiz in b ir sonuc u ol arak programl ama
dil l eri doğ muş tur. M akinel eri anl amak insanoğ l u için o kadar da kol ay ol mamı ş tı r. Z ira
makinel erin(b il gisayarl arı n) anl adı ğ ı dil den konuş mak insanl ar için gerçekten z or b ir iş tir.
G ü n geçtikçe makinel eri anl amak ve onl arı programl amak için yeni arayı ş l ar içine giril di.
Somutl aş tı rı l mı ş makine komutl arı sayesinde b il gisayarl arı dah a etkil i b ir ş ekil de
yönetmek mü mkü n h al e gel miş tir. Z aman il erl edikçe b il gisayarl ar sadec e b el irl i b il imsel
h esapl amal arı yapmak için kul l anı l an araç ol maktan çı kı p insanl arı n yaş aml arı nda rutin
iş l eri yapab il ec ek araç h al ine gel di. Bil gisayarl arı n insanl arı n ih tiyaçl arı na h ı z l ı b ir ş ekil de
c evap vereb il mesi için onl arı h ı z l ı b ir ş ekil de programl amak gerekiyordu. K l asik
yönteml erl e(makine komutl arı yl a) h ı z l ı çöz ü ml er ü retil emez h al e gel inc e dah a yü ksek
seviyel i programl ama dil l erine ih tiyaç duyul du. 19 80’ l i yı l l arda en çok kul l anı l an
programl ama dil i ol an “ C” b u anl amda atı l mı ş b ü yü k b ir adı mdı r. Y apı sal programl ama
model i h er ne kadar C dil inden önc e de yapı l ı yor idiyse de ası l b ü yü k gel iş mel er C dil i il e
b irl ikte ol muş tur. C gib i makine dil ine göre yü ksek seviyel i programl ama dil l eri il e b ü yü k
proj el er yapı l ab il iyordu. A rtı k uygul amal ar sadec e b il imsel çal ı ş ma arac ı ol maktan çı kı p iş
dü nyası nda kul l anı l ab il en uygul amal ar h al ine gel di. Bü tü n b u iyi gel iş mel erin yanı nda
z aman su gib i akı p gidiyordu, b una paral el ol arak proj el er b ü yü yor ve teknol oj i artan
ivmeyl e gel iş iyordu. Y avaş yavaş anl aş ı l dı ki C dil i çok b ü yü k proj el erde yetersiz
kal ı yordu. Y eni b ir programl ama model ine ih tiyaç duyul du ve C+ + dil inin temel l eri atı l dı .
Y apı sal programl ama model iyl e çok b ü yü k proj el eri kontrol al tı na al mak neredeyse
imkansı z dı r. Bu sorunun ü stesinden gel mek için yeni b ir model gerekiyordu. N ih ayet
Bj arne Stroustrup taraf ı ndan C dil i b az al ı narak yeni b ir programl ama dil i gel iş tiril di. Bu
dil in adı : C+ + ’ tı r. C+ + , C’ nin ü z erine inş aa edil diğ i için il k b aş l arda “ C w ith
Cl asses” (Sı nı f l ı C) ol arak adl andı rı l dı . P eki b u dil C’ den f arkl ı ol arak programc ı l ara ne
sunuyordu? C+ + dil inin sunduğ u en b ü yü k yenil ik nesne yönel iml i programl amayı
destekl iyor ol ması dı r. N esne yönel iml i programl ama tekniğ i gü nü mü z de de yaygı n b ir
ş ekil de kul l anı l an b ir tekniktir. Bu teknik gerçek h ayatı model l emede b ü yü k b ir b aş arı
sağ l amaktadı r. Söz gel imi b ir proj eyi parçal ara ayrı p b u parçal ar arası nda programl ama
yol u il e b ağ l antı l ar kurmak çok b asit h al e gel miş tir. N esne yönel iml i programl ama tekniğ i
proj e gel iş tirme aş aması nda b urada sayamayac ağ ı mı z b irçok kol ayl ı k sağ l amaktadı r.
C+ + dil inin diğ er b ir öz el l iğ ide C programc ı l arı na h itap etmesiydi. C dil indeki temel
kural l ar aynen C+ + dil inde de mevc uttur. Bu yü z den C+ + dil ini ve nesne yönel iml i
programl ama tekniğ ine geçiş yapmak için C dil ini iyi b il mek gerekir. D ah a doğ rusu C+ +
dil ini sadec e nesne yönel iml i programl amayı destekl iyor ş ekl inde dü ş ü nmemek gerekir.
G ü nü mü z de b irçok al t seviye iş l eml erde(h ab erl eş me, iş l etim sistemi, aygı t sü rü c ü l eri)
C+ + dil inin yoğ un b ir ş ekil de kul l anı l ması b unun b ir kanı tı dı r.
İ nterneti’ in gel iş imi b il gisayar dü nyası ndaki en öneml i il erl emel erden b iridir.
P rograml ama dü nyası nda JA V A dil inin ortaya çı kması en az internetin il erl emesi kadar
öneml idir. Ç ü nkü C ve C+ + dil l eri il e yal nı z c a b el irl i sisteml ere yönel ik uygul amal ar
gel iş tiril eb il iyordu. O ysa internet sayesinde b irçok f arkl ı sistem b irb irine b ağ l anı r h al e
gel miş tir. A rtı k sisteml erden b ağ ı msı z uygul ama gel iş tirmek gerekiyordu. D ah a doğ rusu
interneti h edef al ac ak uygul ama gel iş tirmek gerekiyordu. P rogramc ı l ar gel iş en internet
ortamı na yab anc ı kal amaz dı . Bu amaç doğ rul tusunda Sun M ic rosystems isiml i f irma
önc el eri O A K ol arak anı l an JA V A isiml i programl ama dil ini ortaya çı kardı . JA V A , dil ol arak
C+ + dil inin devamı gib i dü ş ü nü l eb il ir. A ma amaç tamamen f arkl ı dı r. Z ira Sun f irması
ortaya JA V A dil i il e b irl ikte yeni b ir uygul ama gel iş tirme model ide sunmaktaydı . Bu
programl ama model inde en b ü yü k h edef sisteml er arası taş ı nab il ir kod yaz maktı r. Y ani
b ir uygul amayı h em M ic rosof t pl atf ormunda h emde U nix ve L inux pl atf orml arı nda
çal ı ş tı rab il mek h edef l enmiş tir. Böyl ec e gel iş tiril en uygul amal ar iş l etim sistemi ve
iş l emc iden b ağ ı msı z h al e gel ec ektir.
P eki sisteml er arası b u yü ksek taş ı nab il irl ik nası l ol maktadı r? Cevab ı b asit : A ra
D il . E vet, JA V A dil inde yaz ı l mı ş kodl ar derl endiğ inde kodl ar makine komutl arı n
çevril meden “ ara kod” denil en “ b ytec ode” a çevril mektedir. Bytec ode’ a çevril en program
çal ı ş tı rı l dı ğ ı nda Java Sanal M akinesi devreye girer ve uygul amanı n çal ı ş tı rı l dı ğ ı sisteme
öz gü n makine kodunu ü retir. Bu durumda Sun f irması nı n b ir çok sistemde çal ı ş ab il ec ek
Java Sanal M akinesi ü retmesi gerekiyordu. N itekim z amanl a gü nü mü z de yaygı n kul l anı l an
b ü tü n sisteml erde sorunsuz çal ı ş ab il ec ek Java Sanal M akinel eri gel iş tiril di. Hatta ş u an
için b az ı c ep tel ef onl arı ve çeş itl i sim kartl arı nda b il e JA V A programl arı nı çal ı ş tı rab il ec ek
Java Sanal M akinel eri mevc uttur.
JA V A il e C+ + dil i h er ne kadar b irb irine çok b enz er ol sada aynı kategoride değ il dir.
E l mayl a armutu karı ş tı rmamak gerekir. E ğ er “ JA V A mı C+ + mı ” diye b ir soru sorul ursa
c evap “ h er ikisi de” ol ac aktı r. Ç ü nkü ikisininde kul l anı m amac ı f arkl ı dı r. Bir f irma b ir proj e
için h içb ir z aman b u iki dil den b irisini seçmek durumunda kal mayac aktı r. JA V A il e aynı
kef eye koyab il ec eğ imiz dil b iraz dan anl atac ağ ı m C# dil idir.
JA V A ’ nı n pl atf orm b ağ ı msı z kod ü retmedeki b aş arı sı su götü rmez b ir gerçektir. Bir
çok kurumsal dev proj ede JA V A dil inin ve J2E E pl atf ormunun ol anakl arı ndan
f aydal anı l ması b unun en öneml i göstergesidir. G ü nü mü z de b ü yü k proj el erde b irden f az l a
programl ama dil i kul l anı l ab il mektedir. A nc ak JA V A ’ nı n dil l er arası uyuml u çal ı ş maya
destek verememesi JA V A ’ nı n b ir eksikl iğ i ol arak görü l mü ş tü r. D il l er arası uyuml u çal ı ş ma
al anı nda en b ü yü k b aş arı yı M ic rosof t f irması sağ l amı ş tı r. Son döneml erde sı kl ı kl a
kul l anı l an CO M teknol oj isi b u uyuml ul uğ a b ir örnektir. CO M sayesinde f arkl ı dil l erde
yaz ı l an yaz ı l ı m parçac ı kl arı diğ er b ir uygul amada kul l anı l ab il mektedir.
C# dil ol arak C+ + ve JA V A ’ ya çok b enz emektedir. Bu yü z den C# dil ini konuş urken
.N E T pl atf ormunu göz önü nde b ul undurmal ı yı z . D il l eri sadec e b irer araç ol arak
görmemiz de f ayda var. İ sterseniz l af ı dah a f az l a uz atmadan JA V A /J2E E ve C# /.N E T’ i
karş ı l aş tı rı p b enz erl ikl erini ve f arkl ı l ı kl arı nı ortaya koyal ı m ardı ndan C# ’ ı diğ er .N E T
dil l erinden ayı ran öz el l ikl eri inc el eyip “ neden C# ” sorusuna c evap arayal ı m.
Saf C# ve JA V A dil l eri dü ş ü nü l dü ğ ü nde b irkaç nokta dı ş ı nda b u iki dil b irb irine
b enz emektedir. Bu yü z den karş ı l aş tı rma yaparken b u dil l erin kul l anı l dı kl arı pl atf orml arı da
göz önü nde b ul undurmak gerekir. İ sterseniz madde madde h er b ir öz el l iğ i iki pl atf orm
için değ erl endirel im.
1-) M ima ri : .N E T ve J2E E çal ı ş ma b içimi ol arak b irb irine çok b enz er. Her iki
pl atf ormda da uygul ama kaynak kodu ara b ir koda dönü ş tü rü l ü r. A radaki en b ü yü k f ark
b u ara kodun iş l etil mesi sı rası nda görü l ü r. .N E T’ te ara kod çal ı ş ma z amanı nda
derl endikten sonra çal ı ş tı rı l ı rken JA V A ’ da yoruml anarak çal ı ş tı rı l ı r.
4-) Diller A ra sı U yu mlu lu k : J2E E pl atf ormunda sadec e JA V A dil i kul l anı l ı rken
.N E T ortamı nda C# ,C+ + ,V B.N E T ve h atta JA V A dil i b il e kul l anı l ab il mektedir. Üstel ik f arkl ı
dil l erde yaz ı l mı ş parçac ı kl ar diğ er b ir dil de sorunsuz c a kul l anı l ab il mektedir. Bu sayede
b ü tü n programc ı l arı n .N E T pl atf ormunda rah at programl ama yapab il mesi sağ l anmı ş tı r.
.N E T uyuml u h erh angi b ir dil de gel iş tiril en b ü tü n uygul amal ar aynı ara koda
dönü ş tü rü l dü ğ ü için .N E T dil l eri arası nda b ü yü k perf ormans f arkl ı l ı kl arı meydana gel mez .
5-) W eb S erv isi K u lla nı mı : W eb Servisl eri dağ ı tı k yapı da gel iş tiril en
uygul amal arı n temel parçası ol muş tur. Ö z el l ikl e il etiş imin X M L tab anl ı ol ması w eb
servisl erinin önemini göstermektedir. Her iki dil il e w eb servisl erine eriş mek mü mkü n
ol sada C# il e b ir w eb servisini kul l anmak ol dukça kol aydı r. C# ve .N E T’ in w eb servisl erine
kol ay eriş mesi b ir avantaj ol arak görü l eb il ir.
6-) B ellek Y ö netimi : C# ’ ta aynen JA V A ’ da ol duğ u gib i kul l anı l an nesnel eri
topl ama programc ı nı n görevi değ il dir. K ul l anı l mayan gereksiz nesnel er gereksiz nesne
topl ayı c ı sı taraf ı ndan z amanı gel diğ inde b el l ekten sil inirl er. Buna rağ men C#
programc ı l arı isterse b el l eğ i kendil eri de yöneteb il ir. Y ani C# dil inde b el l ek adresl erini
tutan gösteric il er(pointer) h al a kul l anı l ab il mektedir. JA V A dil inde b u imkan yoktur. C# ’ ı
JA V A dan ayı ran en b ü yü k f ark b udur. Z ira gösteric i kul l anı mı sayesinde geriye dönü k
uyuml ul ukta sağ l anab il mektedir. Ö rneğ in parametre ol arak b ir gösteric i al an sistem
f onksiyonunu C# ’ ta kul l anmak mü mkü ndü r.
7-) V eri T ipleri : C# dil inin temel f el sef esi h erş eyin b ir nesne ol ması dı r. Temel
veri tü rl eride dah il ol mak ü z ere h erş ey b irer nesne ol arak tanı ml anı r. C# ve JA V A
sağ l adı ğ ı temel veri tü rl eri b akı mı ndan b irb irl erine çok yakı ndı r.
8-) T ek ra r K u lla nı la b ilirlik : N esne yönel iml i programl ama model inin en öneml i
öz el l iğ i gel iş tiril en sı nı f l arı n paketl enerek sonradan tekrar tekrar f arkl ı uygul amal arda
kul l anı l ab il mesidir. C# ’ ta sı nı f l ar isim al anl arı (namespac e) içerisinde paketl enerek diğ er
uygul amal ar içinde kul l anı l ab il ir. Java’ da ise sı nı f l ar “ pac kage” dediğ imiz b ir kavraml a
paketl enir. Sonuç ol arak h er iki dil de eş it oranda b u öz el l iğ i destekl emektedir. A nc ak
C# ’ ta sı nı f l arı n organiz asyonu dah a estetik b ir ş ekil de dü z enl enmektedir.
10-) T üretme v e Ç o k B iç imlilik : N esne yönel iml i programl ama model inin C+ +
dil inden b eri kul l anı l an mekaniz mal arı ol an tü retme ve çok b içiml il ik h er iki dil de de
mevc uttur. C+ + ’ tan f arkl ı ol arak C# ve Java’ da sadec e tekl i tü retme mevc uttur.
12-) S ı nı f K ütüpha nesi : V eritab anı ve dosya iş l eml eri gib i b urada
sayamayac ağ ı mı z b ir çok temel iş i yapan sı nı f l ar .N E T ve J2E E pl atf ormunda mevc uttur.
G erek b u sı nı f l arı n organiz asyonu gerekse de sı nı f l arı n kul l anı l ı ş b içimi b akı mı ndan .N E T
pl atf ormunun dah a avantaj l ı ol duğ unu söyl eyeb il iriz .
Buraya kadar söyl edikl erimden b el ki ş öyl e b ir soru iş areti doğ muş ol ab il ir : “ C# mı
JA V A mı ” sorusunu “ C# mı C+ + mı ” ş ekl inde sorsak nel er değ iş ir? Cevap : Ç ok ş ey
değ iş ir. E vet C# ’ ı n JA V A il e ol an il iş kisi C+ + il e ol an il iş kisinden tamamen f arkl ı dı r. C# il e
JA V A ’ yı anc ak saf dil ol arak karş ı l aş tı rab il iriz . Y ani dil in sentaksı ndan b ah sediyorum. Bu
iki dil in kul l anı l dı ğ ı ortam f arkl ı dı r. Birinde b ir sisteme öz gü n makine kodu ü retil irken
diğ erinde sistemden b ağ ı msı z ara b ir kod ol uş turul maktadı r. Bu durumda C+ + ve C# ’ ı b ir
b ü tü n ol arak karş ı l aş tı rmayı kiş isel ol arak doğ ru b ul muyorum. Ç ü nkü ikisi f arkl ı
kategoril erde yarı ş ı yor. E ğ er b ir gü n .N E T’ in ü rettiğ i ara koddaki komutl ar il e çal ı ş an
mikroiş l emc i gel iş tiril irse o z aman b el ki C# il e C+ + ’ ı karş ı l aş tı rab il iriz . P eki C# mı C+ + ?
Cevap : Her ikiside. E ğ er ş irketiniz I ntel iş l emc il er için b ir iş l etim sistemi gel iş tiriyorsa
el b ette C+ + ve C dil l eri seçil mel idir. Ş irketiniz dağ ı tı k yapı da çok geniş b ir çal ı ş ma ağ ı
ol an b ir uygul ama gel iş tiriyorsa o z aman C# ve .N E T’ i seçmeniz dah a doğ ru ol ac aktı r. Bu
seçim b ir proj ede h angi dil in kul l anı l ac ağ ı nı değ erl endirmek içindi. İ ş e b ir de programc ı l ar
açı sı ndan b akal ı m. Bir programc ı nı n h em C+ + h em C# h emde JA V A b il mesine gerek var
mı ? Benc e gerek var yada yok. K esin b ir c evab ı veril emez b u sorunun. D ah a doğ rusu b ir
programc ı ih tiyaç dah il inde h erh angi b ir programl ama dil ini kul l anab il mel idir. A nc ak ş unu
da unutmayal ı m ki iyi b ir programc ı çok sayı da programl ama dil i b il en demek değ il dir. İ yi
b ir programc ı .N E T pl atf ormunda ol duğ u gib i programl ama dil inden b ağ ı msı z kod
ü reteb il mel idir.
Diğ er . N ET Dilleri v e C #
D ah a önc ede dediğ im gib i .N E T pal tf ormunda b ir çok programl ama dil ini
kul l anab il iriz . Bu dil l erin en öneml il eri C# , V B.N E T, C+ + .N E T ve J# dil l eridir. Bu dil l erden
b ir tanesinin öz el b ir konumu vardı r. Tah min edec eğ iniz gib i b u dil C# ’ tı r. C# .N E T
pl atf ormu için sı f ı rdan gel iş tiril miş yeni b ir dil dir. D iğ er dil l er ise eski versiyonl arı
değ iş tiril erek .N E T’ e uyuml u h al e getiril miş tir. Ö z el l ikl e V isual Basic dil inin devamı gib i
görü nen V B.N E T dil inde b ir çok radikal değ iş ikl ik yapı l mı ş tı r. Ö rneğ in V B dil i nesne
yönel iml i programl ama tekniğ ini destekl er h al e getiril miş tir. Bu ekl entil erin çok b aş arı l ı
ol oduğ u söyl enemez . Ç ü nkü b u ş ekil deki z oraki ekl entil er dil in en b aş ta tasarl anma
amac ı na uygunl uğ unu ortadan kal kmaktadı r. Bu amaçl a M ic rosof t, h em nesne yönel iml i
programl ama tekniğ ine tam destek veren, C+ + dil inin gü çl ü öz el l ikl erinden yoksun
ol mayan ve aynı ş ekil de V isual Basic dil inin kol ayl ı ğ ı ndan esinl enerek C# dil ini çı kardı .
P eki .N E T dil l eri arası nda C# ’ ı terc ih etmemiz e neden ol ac ak b aş ka nel er var? Her
ş eyden önc e C# öğ renil mesi kol ay b ir dil dir. A z sayı da anah tar söz c ü k içermesine rağ men
b ir çok ol anağ ı programc ı nı n h iz metine sunmuş tur. C# nesne yönel iml i programl ama
dil ine tam destek verdiğ i içinde seçil eb il ir. C# ’ ta değ iş ken kavramı neredeyse kal kmı ş tı r.
Bunda b ü tü n temel veri tü rl eri de dah il ol mak ü z ere b ü tü n sı nı f l arı n O b j ec t diye
adl andı rı l an b ir sı nı f tan tü retil mesinin etkisi vardı r. C# dil i gü ç ve h ı z l ı l ı k arası ndaki
dengeye estetik b ir ş ekil de korumaktadı r. Temsil c i ve ol ayl arl a V B’ deki ol ay mantı ğ ı na
b enz er b ir model sunarken aynı z amanda gösteric il eri kul l anmaya imkan vererek C+ +
dil inin gü çl ü öz el l ikl erinden yoksun b ı rakmamı ş tı r. .N E T sı nı f kü tü ph anesinin b ü yü k b ir
kı smı C# il e gel iş tiril miş tir. Y ani b u kü tü ph aneyi en etkin b içimde C# il e kul l anab il iriz .
D ah ası C# dil i .N E T’ in çal ı ş ma mimarisi de göz önü nde b ul undurul arak sı f ı rdan tasarl andı ğ ı
için .N E T’ in b ü tü n ol anakl arı ndan en etkin b içimde C# il e f aydal anab il iriz .
C# için söyl eneb il ec ek son söz : C# , modern programl ama teknikl erine tam
destek veren, internet çağ ı nı n gerektirdiğ i tü m yaz ı l ı m b il eş enl erini gel iş tirmeye iz in
veren, h ı z l ı ve etkin b ir ş ekil de kodl ama yapı l ab il en, C+ + ve JA V A ’ nı n gü z el yönl erini al ı p
geriye dönü k uyuml ul uğ u JA V A ’ da ol duğ u gib i göz ardı etmeyen b ir programl ama dil idir.
S o nu ç
Bu makal emiz de h erh angi b ir string if adenin nası l M D 5 il e ş if rel enec eğ ini öğ renec eğ iz . Bu
sı rada w eb .c onf ig, P anel N esnesi, Stored P roc edure gib i konul ara da değ inec eğ iz .
A ş ağ ı da verdiğ im örnek, çoğ u z aman kul l andı ğ ı mı z K ayı t F ormu il e L ogin F ormundan
ol uş uyor. K ayı t ol urken, email adresi ve parol a b il gil eri sorul uyor. Bunun sonrası nda
parol a b il gisi M D 5 al goritması il e ş if rel enip veritab anı na veril er yaz ı l ı yor.
L ogin F ormumuz da ise, aynı veril er istenerek, yine parol amı z M D 5 al goritması il e
veritab anı na gönderil iyor. Y ani SQ L ' deki "Sel ec t" c ü ml esi arac ı l ı ğ ı il e kontrol ü mü z ü
yapı yoruz .
Ö rneğ imiz e geçmeden önc e örneğ imiz içerisinde kul l andı ğ ı mı z P anel nesnemiz in b az ı
öz el l ikl erini inc el eyel im.
Ş imdi de veritab anı na b ağ l anmak amaçl ı kul l andı ğ ı mı z b ağ l antı satı rı mı z ı nası l
kul l andı ğ ı mı z a b akal ı m.
K l asik A SP içerisinde veritab anı na b ağ l anmak istediğ imiz de b unu çoğ u z aman asp
dosyamı z ı n içerisine yaz ı yorduk. V eya b aş ka b ir sayf aya yaz ı p, onu kul l anac ağ ı mı z
sayf aya dah il ediyorduk. Hatı rl arsanı z b u yönteme "I nc l ude F il e" yöntemi deniyordu. Bu
durum gü venl ik açı sı ndan b irçok açı k ortaya çı kartmak il e b erab er, yetersiz de kal ı yordu.
.N et' te ise b u sı kı ntı l ar atl atı l dı . Ş imdi proj emiz il e il gil i b irçok veriyi sakl ayab il ec eğ imiz ,
gü venl i b ir dosyaya kavuş tuk. İ ş te b u dosyanı n adı w eb .c onf ig
W eb .c onf ig dosyası nı n ayrı ntı l arı nı b urada iş l eyemeyec eğ im. Sadec e veritab anı b ağ l antı
satı rı mı z ı nası l w eb .c onf ig sayf amı z a yaz mamı z gerektiğ ini ve aspx dosyamı z dan nası l
çağ ı rı l dı ğ ı nı gösterec eğ im.
F akat önc el ikl e, veritab anamı z ı n yapı sı nı , stored proc edure ve w eb .c onf ig dosyamı z ı n il gil i
kodl arı nı verel im.
T a b lo mu z:
r e g i st e r U se r
user_ id int (I D E N TI TY )
user_ email varc h ar 255
user_ passw ord b inary 16
sp _ i ns_ r e g U se r
A S
I N SE R T I N TO
registerU ser
(user_ email , user_ passw ord)
V A L U E S
(@ user_ email , @ user_ passw ord)
G O
sp _ se l _ l o g i nC h e c k
A S
SE L E CT
user_ id
F R O M
registerU ser
W HE R E
user_ email = @ uemail A N D
user_ passw ord = @ upw d
G O
W e b . c o nf i g
İ l k önc e görsel arayü z ü mü n b ul unduğ u, kiş inin kayı t ol duğ u sayf a ol an:
r e g i st e r . a sp x
< % @ P age L anguage="c # " I nh erits="registerF orm.regF orm" Src ="register.aspx .c s"% >
< h tml >
< b ody>
< asp:P anel id="register" runat="server">
< f orm id="regF orm" meth od="post" runat="server">
< tab l e c el l spac ing="0" c el l padding="3" b order="0">
< tr>
< td c ol span="2">K ayı t F ormu< /td>
< /tr>
< tr>
< td>< b >E -posta A dresiniz < /b >< /td>
< td>< asp:Tex tBox id="email A dr" runat="server"
M ax L ength ="255">< /asp:Tex tBox >< /td>
< /tr>
< tr>
< td>< b >P arol anı z < /b >< /td>
< td>< asp:Tex tBox runat="server" M ax L ength ="10" id="parol a"
Tex tM ode="P assw ord">< /asp:Tex tBox >< /td>
< /tr>
< tr>
< td al ign="righ t" c ol span="2">< asp:Button id="b tnO k"
O nCl ic k="doR egister" runat="server" tex t="F ormu G önder"/>< /td>
< /tr>
< /tab l e>
< /f orm>
< /asp:P anel >
< asp:P anel id="registerStatus" runat="server">
< asp:L ab el id="l b l I nf o" runat="server">< /asp:L ab el >
< /asp:P anel >
< /b ody>
< /h tml >
Bu sayf anı n kodl arı nı iş l eyen:
r e g i st e r . a sp x . c s
using System;
using System.I O ;
using System.W eb .U I ; //w eb tex tb ox l arı na ul aş ab il memiz için gereken c l ass
using System.Sec urity.Cryptograph y; //md5 için gerekl i c l ass
using System.Tex t; //U TF f onksiyonu için gerekl i c l ass
using System.D ata; //veritab anı iş l eml eri için gerekl i c l ass
using System.D ata.Sq l Cl ient; //veritab anı iş l eml eri için gerekl i c l ass
using System.Conf iguration; //w eb .c onf ig dosyamı z dan veri okuyab il mek amaçl ı c l ass
try
{
//parol anı z ş if rel enmesi için f onksiyona gönderiyoruz .
//ş if rel enmiş verimiz b yte h al ine gel ec eğ i için
değ iş kenimiz i
//b yte ol arak tanı ml ı yoruz .
b yte[] enc yrptedP assw ord =
md5P assw ord(tx tP arol a);
}
}
K ul l anı c ı adı , parol a veril erinin giril diğ i görsel sayf a ol an:
l o g i n. a sp x
< % @ P age L anguage="c # " I nh erits="l oginF orm.L ogin" Src ="l ogin.aspx .c s"% >
< h tml >
< b ody>
< asp:P anel id="l oginStatus" runat="server">
< asp:L ab el id="l b l I nf o" runat="server">< /asp:L ab el >
< /asp:P anel >
l o g i n. a sp x . c s
using System;
using System.I O ;
using System.W eb .U I ; //w eb tex tb ox l arı na ul aş ab il memiz için gereken c l ass
using System.Sec urity.Cryptograph y; //md5 için gerekl i c l ass
using System.Tex t; //U TF f onksiyonu için gerekl i c l ass
using System.D ata; //veritab anı iş l eml eri için gerekl i c l ass
using System.D ata.Sq l Cl ient; //veritab anı iş l eml eri için gerekl i c l ass
using System.Conf iguration; //w eb .c onf ig dosyamı z dan veri okuyab il mek amaçl ı c l ass
try
{
//E l imiz deki veril erl e çal ı ş tı rdı ğ ı mı z SP ' miz den geri b ir
kol on, b ir satı r döndü ğ ü
//için Sq l Command nesnesinin E x ec uteSc al ar()
metodunu kul l anı yoruz .
//user_ id ş uanda b iz im iş imiz e yaramı yor, f akat nası l
çekil diğ ini göstermek amac ı il e
//b u satı rı da kodumuz a ekl edim.
string user_ id = sc .E x ec uteSc al ar().ToString();
//E mail ve parol a doğ ru ise b il gil endiriyoruz .
l b l I nf o.Tex t = "Hoş gel diniz ";
}
c atc h
{
//E mail ve parol a yanl ı ş sa tekrar girmesini istiyoruz .
l b l I nf o.Tex t = "Y anl ı ş E -posta A dresi/P arol a. L ü tf en
b il gil eriniz i kontrol edip tekrar deneyiniz .";
}
c onn.Cl ose();
}
}
}
C# v e G D I + K u llanılarak Yap ılan D X B A L L O yu nu
Bu yaz ida anl atac agim oyun, b az il arinin D X Bal l , b az il arinin A l l eyw ay… diye b il digi b ir çok
ismi ol an b ir oyun.
O yunun tü m dosyal ari b urada veril meyec ktir anc ak .N E T il e yeni b ir proj e açil ip .c s
dosyal ari kopyal anirsa, oyun çal isac aktir. A yric a oyunda kul l anil an top,b l ok sekil l eri için
gerekl i ol an resiml eri de istediginiz gib i seçeb il irsiniz . Top resminin dosya adi tp.b mp,
b l okl arin dosya adi b ric k.b mp, al ttaki c ub uk resminin dosya adi ise b l k.b mp ol mak
z orundadir.' dir. O yunu normal h al iyl e çal istirmak istiyorsaniz dow nl oad edeb il irsiniz .
(Bil gisayarda .N E T ve F ramew ork 1.1 kurul u ol mak z orunda! )
P rogrami derl eyip çal istirdiginiz da oyunun ekran görü ntü sü nü n asagidaki gib i ol dugunu
görec eksiniz .
O y u n u n k a y n a k k o d u n u in d ir m e k iç in t ik la y in .
Ö nemli: Sinif l arin nel er ol dugunu uz un uz un paragraf l ar h al inde anl atmaktansa kodun
yaninda komut satirl ariyl a anl atil ac aktir.
Simdi adim adim oyunu açikl ayal im;
I l k ol arak Top.c s dosyamiz var. top sinif imiz da, en öneml i metot ol an move
metodunda topun koordinatl arina b akil ir ve koordinatl ara göre ne taraf a
o
T o p. c s:
using System;
namespac e al l eyw ay
pub l ic int X h areket=4; //topun x ' de h areket h iz ini b urada b el irl eyec egiz .
pub l ic int Y h areket=4; //topun y' de h areket h iz ini b urada b el irl eyec egiz .
pos.X = x ; //ana f ormdan gel en topun nerede b asl atil ac agi b il gisi
R ec tangl e myR ec t = new R ec tangl e(pos.X , pos.Y , tp.W idth , tp.Heigh t);
return myR ec t; //top nesnemiz in konumunu dikdörtgen ol arak b el irl ememiz e yarar.
g.D raw I mage (tp,pos.X ,pos.Y ,tp.W idth ,tp.Heigh t ); //top nesnesi ekrana
//çiz diril ir. X ,y koordinatl arindan sonra eb atl ari parametre ol arak giril ir.
Y h areket=-Y h areket;
pos.X + = X h areket;
pos.Y + = Y h areket;
pub l ic void M ove(int h ak,G rup grp,Top t,R ec tangl e r, R ec tangl e rb l ok)
//topun penc ere ic inde duvarl ara ve c ub uga c arptikça simetrik ol arak sekmesini
if (t.G etF rame().I ntersec tsW ith (rb l ok)) //eger top b l oka çarptiysa,
//top ekrandaysa,
X h areket = -X h areket;
}
if (pos.Y < 0)
Y h areket = -Y h areket;
}// yanarsa,
//top durur
X h areket = 0;
Y h areket = 0;
//h akki 1 az al t
h ak -= 1;
pos.X + = X h areket;
pos.Y + = Y h areket;
B lo k . c s:
using System;
namespac e al l eyw ay
{
pub l ic c l ass Bl ok
pub l ic P oint pos; //x ve y koordinatl arini b el irl emek için kul l anil ac ak.
static Bitmap Cub uk = nul l ; //Ç ub uk resmi için kul l anil ac ak.
int L astposX = 0; //su anda son poz isyon ol madigindan ikisi de sif irl anir.
int L astposY = 0;
Cub uk = new Bitmap("b l k.b mp"); //çub uk ekrana çiz diril ir.
R ec tangl e myR ec t = new R ec tangl e(pos.X , pos.Y , Cub uk.W idth , Cub uk.Heigh t); //top
sinif indaki isl evi görü r.
return myR ec t;
R ec tangl e destR = new R ec tangl e(pos.X , pos.Y , Cub uk.W idth , Cub uk.Heigh t); //çub uk
h areketl erinde kul l anil ac ak.
R ec tangl e src R = new R ec tangl e(0,0, Cub uk.W idth , Cub uk.Heigh t);
g.D raw I mage(Cub uk, destR , src R , G raph ic sU nit.P ix el );
L astposX = pos.X ;
L astposY = pos.Y ;
if (pos.X < = 0) //eger penc erenin en sol undaysa h areket etmeyec ek, degil se sol a dogru
h areketine devam edec ektir.
return;
pos.X -= inc ;
{ //eger penc erenin en sagindaysa h areket etmeyec ek, degil se saga dogru h areketine
devam edec ektir.
return;
pos.X + = inc ;
Bric k.c s sinif i ise patl atil ac ak b l okl ari temsil eder. Burada sadec e b asit
öz el l ikl eri tutl ur. Bl okl ari kontrol eden G rup sinif inda tü m b l okl ari ayni anda
o
kontrol edil digini görec eksiniz . G rup sinif inda tü m b l okl ari tutan b ir matris
b ul unmaktadir.
B ric k . c s:
using System;
using System.D raw ing;
namespac e al l eyw ay
pub l ic int yuksekl ik,genisl ik,b asx ,b asy; //b l okl arin öz el l ikl eri b urada tutul ur.
pub l ic b ool vurul du=f al se; //top taraf indan vurul up vurul madigi b uradan anl asil ac aktir.
th is.yuksekl ik=yuk;
th is.genisl ik=gen;
th is.b asy=starty;
th is.vurul du=f al se; //yeni yaratil digi için vurul madi oal arak isaretl enir.
G ru p. c s:
using System;
namespac e al l eyw ay
{
Bitmap b r=nul l ;
pub l ic Bric k[,] yapi; //b ric k sinif inda nesnel eri tutan matrisimiz b urada yaratil iyor.
int sut=5; //b l okl arin sü tun ve satir sayil ari b u kisimda giril ir.
int sat=8;
pub l ic G rup()
reset(); //vurul mus duurmda ol an b l okl ar varsa b unl ari da vurul madi ol arak isaretl eyen
ve il k h al ine döndü ren metod çagril ir.
{ // b u iç içe f or döngü l eri b öl ü mü nde b l okl ar tek tek dol asil arak
f or (int j =0;j < çiz diril mez ) yapil ir(ekrana görü nmez varsa ol an vurul mus>
g.D raw I mage(b r,temp.b asx ,temp.b asy,b r.W idth ,b r.Heigh t);
if (b r==nul l )
{
b r = new Bitmap("Bric k.b mp");
f or (int i=0;i< ol arak vurul madi b l okl ar dol asil arak matris>
yapi[i,j ]=new Bric k(b r.Heigh t,b r.W idth ,(i) * 6 5 + 20, (j * 35) + 50);
F orm1.c s,oyunun ana f ormudur yani ekranimiz dir. Bu f ormda esas öneml i
ol an yerl er açikl anac aktir.
o
F o rm1. c s:
using System;
namespac e al l eyw ay
private Bl ok b l ok = new Bl ok(27 5, 49 0); //al ttaki çub ugun yeri b el irl enir.
private Top top = new Top(250, 300); // topun konumu b el irl enir.
pub l ic F orm1()
I nitial iz eComponent();
/ / ç izdirilir.
protec ted override void D ispose( b ool disposing ) //b u kodl ari .net kendisi yaratir.
if ( disposing )
if (c omponents ! = nul l )
c omponents.D ispose();
}
}
///
///
th is.F ont = new System.D raw ing.F ont("Comic Sans M S", 8.25F ,
System.D raw ing.F ontStyl e.R egul ar, System.D raw ing.G raph ic sU nit.P oint,
((System.Byte)(0)));
th is.P aint + = new System.W indow s.F orms.P aintE ventHandl er(th is.F orm1_ P aint);
# endregion
[STA Th read]
private void F orm1_ P aint(ob j ec t sender, System.W indow s.F orms.P aintE ventA rgs e)
g.F il l R ec tangl e(Brush es.Bl ac k, 0, 0, th is.Cl ientR ec tangl e.W idth , Cl ientR ec tangl e.Heigh t);
private void F orm1_ K eyD ow n(ob j ec t sender, System.W indow s.F orms.K eyE ventA rgs e)
/ / ya pilir.
sw itc h (resul t)
b reak;
b reak;
def aul t:
b reak;
{ //timer ' in her tik inde to p v e b lo k la r k esisti mi? k o ntro lü ya pilir v e k esisme
v a rsa o b lo k v u ru ldu g u iç in ek ra nda n silinir.
f l ag=true;
top.M ove (Hak,th is.grup,th is.top,Cl ientR ec tangl e, b l ok.G etF rame ());
if (top.pos.Y >500)
Hak--; //ha k k i 1 a za lt
if (f orm3.D ial ogR esul t==D ial ogR esul t.O K ) // O ek ra nda tek ra r o yna ya b a silirsa ,
top.pos.X =26 5;
top.pos.Y =300;
b l ok.pos.X =27 5;
b l ok.pos.Y =49 0;
grup.reset();
timer1.Start();
top.pos.X =250;
top.pos.Y =250;
b l ok.pos.X =27 5;
b l ok.pos.Y =49 0;
I nval idate();
timer1.Start();
f l ag=true;
I nval idate();
Simdi kodunu görec eginiz iki f orm ise oyun b itinc e ve yaninc a gösteril en
f orml ar ol dugundan açikl anac ak b ir b öl ü m içermemektedirl er.
o
F o rm3. c s:
using System;
namespac e al l eyw ay
///
///
int ppuan;
///
///
//
ppuan=puan;
I nitial iz eComponent();
//
//
///
///
if ( disposing )
if (c omponents ! = nul l )
c omponents.D ispose();
///
///
th is.SuspendL ayout();
//
// l ab el 1
//
th is.l ab el 1.F ont = new System.D raw ing.F ont("Bookman O l d Styl e", 15.7 5F ,
System.D raw ing.F ontStyl e.R egul ar, System.D raw ing.G raph ic sU nit.P oint,
((System.Byte)(0)));
//
// l ab el 2
//
th is.l ab el 2.F ont = new System.D raw ing.F ont("Bookman O l d Styl e", 15.7 5F ,
System.D raw ing.F ontStyl e.R egul ar, System.D raw ing.G raph ic sU nit.P oint,
((System.Byte)(0)));
//
// O K
//
th is.O K .D ial ogR esul t = System.W indow s.F orms.D ial ogR esul t.O K ;
//
// b utton2
//
//
// l ab el 3
//
th is.l ab el 3.F ont = new System.D raw ing.F ont("Bookman O l d Styl e", 15.7 5F ,
System.D raw ing.F ontStyl e.R egul ar, System.D raw ing.G raph ic sU nit.P oint,
((System.Byte)(0)));
//
// F orm3
//
th is.F ormBorderStyl e = System.W indow s.F orms.F ormBorderStyl e.F ix edD ial og;
# endregion
{
th is.l ab el 3.Tex t = ppuan.ToString();
o Y a ninc a g ö sterilen fo rm
F o rm2. c s:
using System;
namespac e al l eyw ay
///
///
int h h ak;
///
//
//
h h ak=h ak;
I nitial iz eComponent();
//
//
///
///
if ( disposing )
if (c omponents ! = nul l )
{
c omponents.D ispose();
///
///
th is.SuspendL ayout();
//
// l ab el 2
//
th is.l ab el 2.F ont = new System.D raw ing.F ont("M ic rosof t Sans Serif ", 16 F ,
System.D raw ing.F ontStyl e.R egul ar, System.D raw ing.G raph ic sU nit.P oint,
((System.Byte)(0)));
//
// b utton1
//
th is.b utton1.F ont = new System.D raw ing.F ont("M ic rosof t Sans Serif ", 12F ,
System.D raw ing.F ontStyl e.R egul ar, System.D raw ing.G raph ic sU nit.P oint,
((System.Byte)(0)));
//
// l ab el 1
//
th is.l ab el 1.F ont = new System.D raw ing.F ont("Comic Sans M S", 16 F ,
System.D raw ing.F ontStyl e.Bol d, System.D raw ing.G raph ic sU nit.P oint,
((System.Byte)(0)));
//
// F orm2
//
th is.F ormBorderStyl e = System.W indow s.F orms.F ormBorderStyl e.F ix edD ial og;
# endregion
th is.Cl ose();
}
C# ile Yazıc ı Ç ıkt ıs ı A lma İ ş lemleri
C# il e W indow s iş uygul aması gel iş tiriyorsanı z programı nı z ı n mutl aka yaz ı c ı çı ktı sı
al ma b öl ü mü ol ac aktı r. Bu makal ede C# il e nası l yaz ı c ı çı ktı sı al ı nab il ec eğ inin
temel l eri ü z erinde durac ağ ı m.
P rintDo c u ment S ı nı fı
Bu sı nı f programl arı mı z a yaz ı c ı çı ktı sı al ma desteğ ini ekl emek için kul l anab il ec eğ imiz en
temel yapı dı r. Bu sı nı f tü rü nden b ir nesne yaratı l dı ğ ı nda çı ktı al ma il e il gil i h emen h er tü r
b il giye eriş memiz mü mkü ndü r.
ş ekl inde b ir tanı ml ama yaptı ğ ı mı z da varsayı l an yaz ı c ı (def aul t printer) il e çal ı ş ı l maktadı r.
Bir dökü manı yaz ı c ı ya göndermek için P rintD oc ument sı nı f ı nı n P r i nt ( ) metodu kul l anı l ı r.
P rint() metodu çağ rı l dı ğ ı anda P r i nt P a g e ol ayı meydana gel ir. Bu ol ayı yakal ayan kontrol
yaz ı c ı ya gönderil ec ek dökü man ü z erinde iş l eml er yaparak çı ktı nı n ş ekl ini b el irl emel idir.
Her b ir sayf a için ayrı c a P rintP age ol ayı meydana gel ec eğ i için h er b ir ol ay içinde doğ ru
sayf al arı yaz ı c ı ya göndermek için b ir takı m iş l eml er yapmak gerekec ektir. A ksi h al de h er
def ası nda b irinc i sayf ayı yaz ı c ı ya gönderme ih timal imiz vardı r. K ı sac ası P rintP age ol ayı
ol madan yaz ı c ı ya çı ktı b il gil erini gönderemeyiz . Bu yü z den il k ol arak P rintP age ol ayı nı ve
b u ol aya ait argü manl arı içeren P r i nt P a g e E v e nt A r g s sı nı f ı nı inc el eyel im.
Ö nc e P rintP age ol ayı nı n argü manl arı nı içeren P rintP ageE ventA rgs sı nı f ı nı n ü ye
el emanl arı nı inc el eyel im, ardı nda b ir konsol uygul aması ndan yaz ı c ı ya nası l b ir dökü man
gönderec eğ imiz i gösterec eğ im.
G ra phic s : Y az ı c ı ya gönderil ec ek dökü man b il gil erini b el irl eyen graf ik nesnesidir. Y az ı c ya
gönderil ec ek b il gil erin tamamı b u nesne içerisinde b el irtil ec ektir. N ot : G raph ic s sı nı f
G D I + kü tü ph anesinin en öneml i sı nı f ı dr.
C a nc el : Ç ı ktı al ma iş l eminin iptal edil ip edil emeyec eğ i il e il gil i b il gi veren b ool tü rü nden
b ir el emandı r. E ğ er değ eri true ise çı ktı al ma iş l emi iptal edil ec ektir.
M a rg inB o u nds : Y az ı c ı ya gönderil en çı ktı dökü manı nı n en ve b oyutl arı nı temsil eden
R ec ta ng le tü rü nden b ir öz el l iktir. R ec tangl e sı nı f ı da G D I + kü tü ph anesinin b ir parçası dı r.
Bu öz el l ikte yaz ı c ı ya gönderil ec ek çı ktı nı n sadec e ü z erine çiz im yapı l ab il en kı smı b el irtil ir.
Ş imdi b asit b ir örnekl e yaz ı c ı ya çı ktı gönderel im. Ö rneğ imiz de varsayı l an yaz ı c ı nı z a, sol
ü st köş esi (20,20) koordinatl arı nda eni ve b oyu 100 ol an b ir dörtgen içeren sayf ayı
gönderec eğ iz . G önderil ec ek sayf adaki dörtgeni çiz mek için tah min edec eğ iniz ü z ere
G raph ic s nesnesini kul l anac ağ ı z .
using System;
using System.D raw ing.P rinting;
using System.D raw ing;
c l ass P rinter
{
static void M ain()
{
P rintD oc ument P D = new P rintD oc ument();
P D .P rintP age + = new P rintP ageE ventHandl er(O nP rintD oc ument);
try
{
P D .P rint();
}
c atc h
{
Consol e.W riteL ine("Y az ı c ı çı ktı sı al ı namı yor...");
}
f inal l y
{
P D .D ispose();
}
}
private static void O nP rintD oc ument(ob j ec t sender, P rintP ageE ventA rgs e)
{
e.G raph ic s.D raw R ec tangl e(P ens.R ed,20,20,100,100);
}
}
Y ukarı daki programı derl eyip çal ı ş tı rdı ğ ı nı z da h iç b ir uyarı eğ er veril meden sisteminiz e b ir
yaz ı c ı b ağ l ı O nP rintD oc ument() metodunda h az ı rl anan içerik yaz ı c ı ya gönderil ec ektir.
E ğ er sisteminiz e b ağ l ı b ir yaz ı c ı yoksa doğ al ol arak c atc h b l oğ undaki kod çal ı ş ac aktı r.
Hemen diğ er b öl ü ml ere geçmeden önc e b irden f az l a sayf al ı yaz ı c ı çı ktı sı al ma iş l emine
örnek verel im. Bu örnekte b ir tex t dosyası nı n içeriğ ini yaz ı c ı ya nası l göndereb il ec eğ imiz i
inc el eyec eğ iz . Tab i b urda yaz ı nı n b irden f az l a sayf ada ol up ol madı ğ ı nı n kontrol ü nü
yapmamı z gerekir. Y az ı l arı yaz ı c ı çı ktı sı na göndermek için G raph ic s sı nı f nı n D raw String
metodunu kul l anac ağ ı z . Bu metot graf ik arayü z ü ne b el irl i b ir f ontta ve f ont b ü yü kl ü ğ ü nde
yaz ı yaz mamı z ı sağ l ar. Ö nc e örneğ i inc el eyel im ardı ndan örnek ü z erinde b iraz
konuş ac ağ ı z .
using System;
using System.I O ;
using System.D raw ing;
using System.W indow s.F orms;
using System.D raw ing.P rinting;
c l ass P rinter
{
private static StreamR eader dosyaA kimi;
try
{
P D .P rint();
}
c atc h
{
Consol e.W riteL ine("Y az ic i çiktisi al inamiyor...");
}
f inal l y
{
P D .D ispose();
}
}
pub l ic static void O nP rintD oc ument(ob j ec t sender,P rintP ageE ventA rgs e)
{
F ont f ont = new F ont("V erdana", 11) ;
f l oat yP oz isyon = 0 ; int L ineCount = 0 ;
f l oat l ef tM argin = e.M arginBounds.L ef t;
f l oat topM argin = e.M arginBounds.Top;
string l ine=nul l ;
L ineCount+ + ;
}
if (l ine = = nul l )
e.HasM oreP ages = f al se ;
el se
e.HasM oreP ages = true ;
}
}
Y ukarı daki program h erh angi b ir tex t f ormatı ndaki dosyayı yaz ı c ı ya gönderek çı ktı
al manı z ı sağ l ayac aktı r. D osyanı n içeriğ ini yaz ı c ı ya gönderirken çı ktı nı n ne ş ekil de ol ac ağ ı
tamamen programl ama yol u il e b iz im taraf ı mı z dan yapı l maktadı r. Ö rneğ in çı ktı nı n yaz ı
f ontunu G D I + kü tü ph anesinin b ir sı nı f ı ol an F ont il e yaz ı renginide yine G D I +
kü tü ph anesinin Brush es sı nı f ı nı n ü ye el emanl arı il e rah atl ı kl a değ iş tireb il iriz .
Y ukarı daki örnek uygul amada en öneml i kı sı m dosya içeriğ inin yaz ı c ı yı gönderil mesi
sı rası nda görü l ü r. D osya içeriğ inin b irden f az l a sayı da sayf a içermesi durumunda dosya
akı mı ndan b ir sayf aya sı ğ ac ak kadar satı r okunmal ı dı r. E ğ er dosya akı mı nı n sonuna
gel inmediyse H a sM o reP a g es öz el l iğ i true yapı l arak O nP rintD oc ument metodunun
yeniden çağ rı l ması gerekir. K aynak koddanda gördü ğ ü nü z ü z ere dosya akı mı ndan okunan
satı r nul l değ ereeş it ol duğ unda yani dosyanı n sonuna gel indiğ inde HasM oreP ages öz el iiğ i
f al se yapı l arak P rint() metodunun ic rası sonl andı rı l mı ş tı r.
Bir diğ er öneml i nokta ise yaz ı c ı ya gönderil ec ek h er b ir sayf ada kaç satı rı n b ul unac ağ ı nı n
b el irl enmesidir. Sayf a b aş ı na dü ş en satı r sayı sı , sayf anı n yaz ı c ı ya gönderil ec ek
b öl ü mü nü n yü ksekl iğ inin yani e. M a rg inB o u nds. H eig ht ' in çı ktı ya gönderil ec ek yaz ı ya
ait f ontun yü ksekl iğ ine b öl ü mü il e el de edil ir. Sayf a b aş ı na ü ş en satı r sayı sı el de
edil dikten sonra h erb ir sayf anı n içeriğ i w h il e döngü sü yardı mı il e h az ı rl anı r. O kunan satı r
sayı sı nu ll değ ere eş it ol mayana kadar ve okunan satı r sayı sı sayf a b aş ı na dü ş en satı r
sayı sı ol ana kadar döngü ye devam edil ir. D öngü içerisinde P rintP a g eEv entA rg s ol ay
argü manl arı nı içeren sı nı f ı n G raph ic s nesnesine Dra w S tring ( ) metodu yardı mı yl a dosya
akı mı ndan okunan satı r yaz ı l ı r. Bir sonraki satı rı n çı ktı ekranı nı n neresinden b aş l ayac ağ ı nı
tutmak için ise h er b ir satı r okunduğ unda yP oz isyon' u kul l anı l an f ont' un yü ksekl iğ i kadar
artı rı l ı r. Bü tü n b u iş l eml eri yaptı ktan sonra HasM oreP ages öz el l iğ i ayarl anı r ki sonraki
sayf al ar çı ktı ya gönderil sin. E ğ er dosya sonuna gel inmiş se artı k b ası l ac ak sayf a yok
demektir ve H a sM o reP a g es öz el l iğ i f al se ol arak b el irl enir.
using System;
using System.D raw ing.P rinting;
using System.D raw ing;
c l ass P rinter
{
static void M ain()
{
P rintD oc ument P D = new P rintD oc ument();
P D .P rintP age + = new P rintP ageE ventHandl er(O nP rintD oc ument);
private static void O nP rintD oc ument(ob j ec t sender, P rintP ageE ventA rgs e)
{
....
}
}
P rinterSettings yol u il e el de edeb il ec eğ imiz diğ er öneml i öz el l ikl er aş ağ ı da l istel enmiş tir.
C a nDu plex : b ool tü rü nden ol an b u değ iş ken yaz ı c ı nı n arkal ı önl ü çı ktı al mayı
destekl eyip destekl emediğ ini b el irtir.
C o pies: sh ort tü rü nden ol an b u değ iş ken yaz ı c ı ya gönderil ec ek dökü manı n kaç kopya
çı karı l ac ğ ı nı b el irtir. E ğ er 10 sayf al ı k b ir dökü man için b u öz el l iğ i 5 ol arak girerseniz 50
adet kağ ı dı nı z ı yaz ı c ı ya yerl eş tirmeyi unutmayı n.
C a nDu plex : b ool tü rü nden ol an b u değ iş ken yaz ı c ı nı n arkal ı önl ü çı ktı al mayı
destekl eyip destekl emediğ ini b el irtir.
Du plex : D upl ex enum sab iti tü rü nden ol an b u değ iş ken arkal ı önl ü b askı öz el l iğ ini
b el irl er. D upl ex numaral andı rması D ef aul t,Siz mpl ex ,Horiz ontal ve V ertic al ol mak ü z ere
dört tane ü yesi vardı r.
I sDefa u ltP rinter : P rinterN ame il e b el irtil en yaz ı c ı nı n b il gisayarı nı z daki varsayı l an
yaz ı c ı (def aul t printer) ol up ol madı ğ ı nı b el irtir.
I sV a lid : P rinterN ame il e b el irtil enin gerçekten sisteminiz e ait b ir yaz ı c ı ol up ol madı ğ ı nı
b el irtir.
P a perS izes : Y az ı c ı taraf ı ndan destekl enen sayf a eb atl arı nı n P a perS izeC o llec tio n
tü rü nden b ir kol eksiyon nesnesi il e geri döner. Bu kol eksiyondaki h er b ir el eman
System.D raw ing isim al anı nda b ul unan P a perS ize tü rü ndendir. P aperSiz e sı nı f nı n
W idth (sayf a eni), Heigh t(sayf a b oyu),K ind(sayf a tü rü ) gib i öz el l ikl eri b ul unmaktadı r.
P rintT o F ile : Ç ı ktı nı n h erh angi port yerine b ir dosyaya yaz dı rı l ı p yaz dı rı l mayac ağ ı nı tutan
b ool tü rü nden b ir değ iş ken. Bu değ iş ken dah a çok b iraz dan görec eğ imiz P rintD ial og
ekranı nı n görü ntü l enmesi sı rası nda değ iş tiril ip kul l anı l ı r.
P rof esyonel uygul amal arı n tamamı nda yaz ı c ı ya çı ktı göndermeden önc e kul l anı c ı ya ön
iz l eme imkanı sağ l anı r. .N E t ortamı nda program gel iş tiriyorsanı z W indow s' un standart ön
iz l eme penc eresini programl ama yol u il e görü ntü l emeniz son derec e kol aydı r. Bu ekranı n
görü ntü l enmesi için System.D raw ing isim al anı nda b ul unan P rintP rev iew Dia lo g sı nı f ı
kul l anı l ı r. Bu sı nı f il e il iş kil endiril miş P rintDo c u ment nesnesinin P rintP age ol ayı na il iş kin
metot çal ı ş tı rı l arak ön-iz l eme penc eresindeki içerik el de edil ir.
Bir P rintP review D ial og nesnesi ol uş turul duktan sonra nesnenin Do c u ment öz el l iğ ine
P rintD oc ument tü rü nden b ir nesne atanı r. V e ardı ndan P rintP review Control tü rü nden ol an
nesne ü z erinden S ho w ( ) yada S ho w Dia lo g ( ) metotl arı kul l anı l arak ön iz l eme ekranı
gösteril ir.
Ö n iz l eme çı ktı snı n görü ntü l endiğ i penc ereyi el b ette P rintD oc ument sı nı f nı n P rint()
metodunu çağ ı rmadan önc e göstermel iyiz . D ah a önc e yaptı ğ ı mı z ve dosya içeriğ ini
yaz ı c ı ya gönderen uygul manı n M ain() metodunu aş ağ ı daki gib i değ iş tirerek ön iz l eme
ekranı ndan çı ktı ya gönderil ec ek içeriğ i görü ntü l eyel im.
P rintP rev iew Dia lo g pdlg = new P rintP rev iew Dia lo g ( );
pdlg . Do c u ment = P D;
pdlg . S ho w Dia lo g ( );
try
{
P D .P rint();
}
c atc h
{
Consol e.W riteL ine("Y az ic i çiktisi al inamiyor...");
}
f inal l y
{
P D .D ispose();
}
}
P rogramı yeni h al iyl e derl eyip çal ı ş tı rdı ğ ı mı z da il k önc e öı ktı ön iz l eme ekranı aş ağ ı daki
gib i gösteril ec ektir. N ot : Ç ı ktı ya gönderil ec ek dosyanı n yol u örneğ imiz için "C:\P rint.tx t"
ş ekl inde ol mal ı dı r.
D ökü manı çı ktı ya göndermeden önc e gönderme iş l eminin h angi yaz ı c ı ayarl arı il e
yapı l ac ağ ı nı b el irl emek için genel l ikl e sayf a dü z enl eme ekranı gösteril ir. Bu ekranda kağ ı t
tipinden, yaz c ı nı n kağ ı t kaynağ ı na kadar b ir çok öz el l iğ i değ iş tirmeniz mü mkü ndü r. Bu
ekranda yapı l an b ü tü n değ iş ikl ikl er P rintD oc ument sı nı f ı nı n P rinterSettings öz el l iğ ine
aktarı l ı r. Sayf a dü z enl eme ekrana System.D raw ing isim al anı nda b ul unan
P rintS etu pDia lo g sı nı f ı il e gerçekl eş tiril ir. Bu sı nı f ı nı n kul l anı mı P rintP rev iew Dia lo g
sı nı f ı nı n kul l anı mı il e nerdeyse aynı dı r. Bu yü z den ayrı c a açı kl maya gerek duymuyorum.
Son ol arak yaz ı c ı ön iz l eme ekranı ndan önc e sayf a dü z enl eme ekranı nı n gösteril mesini
sağ l amak için uygul amamaı z ı n M ain() metodunu aş ağ ı daki gib i değ iş tirin ve çal ı ş tı rı n.
try
{
P D .P rint();
}
c atc h
{
Consol e.W riteL ine("Y az ic i çiktisi al inamiyor...");
}
f inal l y
{
P D .D ispose();
}
}
P rogramı derl eyip çal ı ş tı rdı ğ ı nı z da karş ı nı z a il k çı kac ak görü ntü aş ağ ı daki ekran ol ac aktı r.
Bu örnekl e b irl ikte yaz ı c ı çı ktı sı al ma il e il gil i temel iş l eml erin anl atı l dı ğ ı yaz ı mı z ı n sonuna
gel dik. .N E T teki yaz ı c ı çı ktı sı al ma iş l eml eri b u anl attı kl arı ml a sı nı rl ı değ il dir. A nc ak b u
yaz ı da anl atı l anl ar b u konuya çok h ı z l ı b ir giriş yapmanı z ı sağ l amı ş tı r. İ l erl eyen yaz ı l arda
görü ş mek dil eğ iyl e.
K aynakl ar :
R egul ar ex pression b ir metni dü z enl emek yada metin içerisinden b el l i kural l ara uyan al t
metinl er el de etmek için kul l andı ğ ı mı z b ir dil dir. Bir regul ar ex pression, string tipindeki
karakter topl ul uğ una uygul anı r. Sonuç ol arak sub stringl er ol uş ur yada orj inal metnin b ir
kı smı nı içeren değ iş tiril miş yeni metinl er el de edil ir.
1. ) “. ” K a ra k teri
Tek b ir karakteri temsil eder(yeni satı r karakteri h ariç).
“ CSh arp.edir” ş ekl indeki b ir desen CSh arpnedir, CSh arpN edir, CSh arpSedir, CSh arp3edir
gib i stringl eri döndü reb il ir.
2. ) “[ ] ” K a ra k terleri
Bir arrayi yada aral ı ğ ı temsil eder.
“ CSh arp[SN Y ]edir” deseni, CSh arpSedir, CSh arpN edir ve CSh arpY edir stringl erini
döndü rü r.
“ CSh arp[a-z ]edir” ş ekl indeki kul l anı m aral ı k b el irtmeye yarar.
“ CSh arp[0-9 ]edir” ş ekl indeki kı l anl ı m ise sayı sal aral ı k b el irtmeye yarar.
3. ) “? ” K a ra k teri
K endinden önc eki karakterin stringte ol ması yada ol maması nı sağ l ar.
“ CSh arpn?edir” deseni CSh arpedir yada CSh arpnedir döndü rü r.
4. ) “\” K a ra k teri
K endinden sonraki öz el karakterin stringe dah il edil mesini sağ l ar.
“ CSh arpnedir\?” deseni CSh arpnedir? Stringini döndü rü r. (E ğ er “ \” karakterini
kul l anmamı ş ol saydı k CSh arpnedi yada CSh arpnedir dönerdi.)
5. ) “* ” K a ra k teri
K endinden önc eki karakterin yada stringin h iç ol maması yada istediğ i sayı da ol ması nı
sağ l ar.
“ CSh arpnedir*” deseni, CSh arpnedi, CSh arpnedir, CSh arpnedirr, CSh arpnedirrr, ...
döndü rü r. “ CSh arp(nedir)*” deseni ise CSh arp, CSh arpnedir, CSh arpnedirnedir, ...
döndü rü r.
6. ) “{ } ” K a ra k terleri
K endinden önc e gel en karakterin b el irtil en sayı da tekrar etmesini sağ l ar.
“ C{4}Sh arpnedir” deseni, CCCCSh arpnedir stringini döndü rü r.
7. ) “^ ” K a ra k teri
Satı r b aş ı nı if ade eder.
“ ^ CSh arpnedir” deseni, satı r b aş ı nda “ CSh arpnedir” stringi varsa b unu döndü rü r.
8. ) “$ ” K a ra k teri
Satı r sonunu if ade eder.
“ CSh arpnedir$ ” deseni, satı r sonunda “ CSh arpnedir” stringi varsa b unu döndü rü r.
B a sit B ir T a rih Deseni Y a pa lı m
Ş imdi iş in pratiğ ine gel el im ve adı m adı m tarih deseni ol uş tural ı m. D ah a sonra ise
ol uş turduğ umuz b u tarih desenini b ir konsol programı nda kul l anal ı m.
Tarih desenimiz b ir string içerisindeki, G G /A A /Y Y Y Y f ormatl arı ndaki tarih l eri yakal ayac ak
yapı da ol sun.
“ (0?[1-9 ])”
// 1, 2, .., 9 , 01, 02, ..., 09 gib i yaz ı l mı ş gü nl eri tanı ml ar.
“ ([12][0-9 ])”
// 10, 11, ..., 29 gib i yaz ı l mı ş gü nl eri tanı ml ar.
“ (3[01])”
// 30, 31 gü nl erini tanı ml ar.
// G ü n tanı mı :
“ ((0?[1-9 ])|([12][0-9 ])|(3[01]))”
“ (0?[1-9 ])”
// 1, 2, .., 9 , 01, 02, .., 09 gib i yaz ı l mı ş ayl arı tanı ml ar.
“ (1[0-2])”
// 10, 11, 12 ayl arı nı tanı ml ar.
// A y Tanı mı :
“ ((0?[1-9 ])|(1[0-2]))”
B a sit B ir T est P ro g ra mı Y a za lı m
Şimdi elde ettiğimiz tarih desenini test edebileceğimiz basit bir konsol programı yazalım. Ek
bilgi olarak “?” şeklindeki bir ifadeyi desenin önüne ilave ederseniz, bir desen grubu ifade
etmiş olursunuz ve birkaç deseni aynı anda kontrol edebilirsiniz.
using System;
using System.Text.RegularExpressions;
class Test
string tarihDeseni=@"(?((0?[1-9])|([12][0-9])|(3[01]))(/)(0?[1-
9]|1[0-2])(/)([12][0-9][0-9][0-9]))";
string metin=Console.ReadLine();
MatchCollection benimMatchCollection=benimRegex.Matches(metin);
Console.WriteLine(benimMatch.Groups["tarih"]);
Console.Read();
}
B ir W e b S i t e s i n d e k i E -M a i l A d r e s l e r i n i Y a k a l a m a k ( D ü z e n li İ f a d e le r 2 )
G ene ş u sı kı c ı dü z enl i if adel er değ il mi? Bu makal ede dü z enl i if adel erin ne kadar
etkil eyic i ol duğ unu b ir örnek ü z erinde anl atmaya çal ı ş ac ağ ı m.
W eb sitel erinin b ireb ir kopyası nı kendi b il gisayarı nı z a kopyal ayan ( Tel eport gib i)
programl arı b il irsiniz . Ö nc e b ir sayf anı n kaynak kodunu indirir. İ çindeki l inkl eri ve resim
dosyal arı nı b el irl er. Sonra sı ra b u l ink ve resim dosyal arı na gel ir.
Hiç el iniz deki kaynak kodun l inkl erini nası l ayı kl ayac ağ ı nı z ı dü ş ü ndü nü z mü ?
İ ş te dü z enl i if adel er b urada gerçekten h arikal ar yaratı r.
F az l a uz atmadan örneğ imiz e geçel im...
E-M a il Y a k a la yı c ı
// A dresi A l an M etod :
private string A dresiA l ()
{
string adres="h ttp://" + tx tA dres.Tex t;
return adres;
}
Sayf anı n kaynak kodunu indirdikten sonra içindeki e-mail l inkl erini b ul up b ir diz iye atan
b ir b aş ka f onksiyon dah a yaz dı m. Ö nc el ikl er e-mail l inkini yakal ayan deseni (pattern)
açı kl amaya çal ı ş al ı m.
"mail to:" if adesinden sonra istediğ imiz if ade yani e-mail adresi gel ir. Bunu "mail "
isminde b ir grup tanı ml ayarak el de edec eğ iz .
K ı sac a, "mail to:" il e tı rnak karakterl eri arası ndaki h er if ade b iz im için mail grub una
dah il ol du.
Ş imdi E -mail adresl erini diz i ş ekl inde döndü ren metodumuz u yaz al ı m :
// Sayf anı n içindeki mail adresl erini diz i ş ekl inde döndü ren metod :
private string[] M ail A l (string kaynak)
{
l b l Stat.Tex t+ = "K aynak kod al ı ndı ... " + "M ail l er ayrı ş tı rı l ı yor... ";
// D esenimiz :
string mail D eseni=@ "(h ref =)((' )|(""))(mail to:)(?< mail >(.*))((' )|(""))";
int i=0;
// R egul ar E x pressionumuz u tanı ml ı yoruz :
R egex b enimR egex =new R egex (mail D eseni);
M atc h str=b enimR egex .M atc h (kaynak);
// O l uş turduğ umuz deseni sitenin kaynak kodunda karş ı l aş tı rı yoruz :
M atc h Col l ec tion mail Col =b enimR egex .M atc h es(kaynak);
string[] mail =new string[mail Col .Count];
// Bul unan h er e-mail adresini mail [] diz isine atı yoruz :
f oreac h (M atc h mail M atc h in mail Col )
{
mail [i]=mail M atc h .G roups["mail "].ToString();
i+ + ;
}
return mail ;
}
// Ş imdi e-mail yakal amak için b u yaz dı ğ ı mı z metodl arı b utton_ Cl ic k ol ayı il e
b irl eş tirel im :
private void b tnY akal a_ Cl ic k(ob j ec t sender, System.E ventA rgs e)
{
l b l Stat.Tex t="";
if (tx tA dres.Tex t=="")
{
M essageBox .Sh ow ("L ü tf en Bir A dres G irin ! ");
}
el se
{
// Sitenin A dresini al ı yoruz :
string adres=A dresiA l ();
// Sitenin K aynak K odunu al ı yoruz :
string kaynak=K aynakA l (adres);
// E -M ail adresl erini al ı yoruz :
if (kaynak! =nul l )
{
string[] mail =M ail A l (kaynak);
l b l Stat.Tex t+ ="İ ş l em sona erdi." + mail .L ength + " tane mail adresi
yakal andı .";
f oreac h (string yakal ananM ail in mail )
{
// Her e-mail adresi l istb ox ' a giril iyor :
l b x E mail .I tems.A dd(yakal ananM ail );
}
}
}
}
A ç ı k la ma
Baz ı sitel erde f rameset kul l anı l dı ğ ı ndan sayf ada e-mail l inki görü l se b il e programı mı z
b unl arı döndü rememekte. Bu sayf al arı n f ramel erinin l inkl eri veril erek e-mail adresl eri
el de edil eb il ir.
Y ine b az ı sitel erde l inkl er j avasc ript kodu il e eriş il diğ inden b u adresl erde programı mı z
taraf ı ndan eriş il ememektedir.
C# ile T as kb ard a Ç alış an Program Hazırlamak
Bu makal emde siz e N otif yI c on ve Contex tM enu kul l anarak b ir taskb ara yerl eş en program
nası l yapı l ı r, onu gösterec eğ im. D ah a f az l a uz atmadan h emen kodl arı mı z ı yaz maya
b aş l ayal ı m.
İ l k ol arak V isual Studio' yu açal ı m ve yeni b ir proj e yaratal ı m. Bu proj enin adı na
istediğ iniz gib i b ir isim vereb il irsiniz . P roj emiz "C# W indow s A ppl ic ation" ol mal ı dı r.
P roj emiz i yarattı ktan sonra A dd / N ew I tem diyerek yeni b ir I c on ekl eyel im. I c onumuz un
Buil d A c tion' ı mutl aka "E mb edded R esourc e" ol mal ı . D ah a sonra F orm1' ı n kod kı smı na
gec el im.
Sı nı f ı mı z ı n içine
kodl arı nı ekl eyel im. F ormumuz a iki kere tı kl ayal ı m ve aş ağ ı daki metotl arı kaynak
kodumuz a ekl eyel im.
notif yic on.Tex t = "N otif yI c on O rnegimiz "; //M ouse il e uz erine gel diğ imiz de ol usac ak
yaz ı
notif yic on.I c on = new I c on("I c on1.ic o"); //I c onumuz u b el irl edik
menu = new Contex tM enu(); //Y eni b ir Contex tM enu tanı ml adı k
notif yic on.Contex tM enu = menu; //M enumuz u notif yic onun menusu ol arak tanı ml adı k
}
E vet, ş imdi programı mı z ı çal ı stı rmaya h az ı rı z . E o z aman çal ı stı ral ı m ve sonuc u görel im.
G orduğ unuz gib i programı mı z çal ı ş tı . P rogramı kapatal ı m. O da ne! I c onumuz h al a
taskb arda duruyor. P eki b unu nası l dü z el tec eğ iz ? Hemen c evap verel im. K aynak
kodumuz un b iraz ü stl erine b akı yoruz ve ş u satı rl arı goruyoruz :
Bu satı rl arı aş ağ ı daki gib i değ iş tirdiğ imiz de progrm kapatı l dı ğ ı nda taskb ar daki ic on da
sil inec ektir.
V e b ir sorunumuz dah a var. P rogramı mı z ı açtı ğ ı mı z anda F orm1 de göz ukü yor. P eki
F orm1 göz ü kmeden sadec e I c onumuz un göz ü kmesini nası l sağ l ayac ağ ı z ? Bunun da
çoz ü mü var. Biraz dah a yukarı l ara b akı p
I nitial iz eComponent();
Bunl arı yaptı ktan sonra yapmamı z gerek b ir değ iş ikl ik dah a var. O da G oster_ Cl ic k ve
G iz l e_ Cl ic k' i su sekil de değ iş tirmek:
U marı m h erkes için f aydal ı b ir yaz ı ol mustur. Benim için kod yaz mak yaz ı yaz maktan
dah a kol ay, b unu h erkesin tatması nı isterim :)) Y eni yaz ı l arda gorusmek dil eğ iyl e
h oş çakal ı n.
" S inglet on" T as arım D es eninin( Pat t ern) C# ile G erç ekleş t irilmes i
Bil diğ iniz ü z ere gü nü mü z de yaz ı l ı m mü h endisl iğ i al anı nda en f az l a ses getiren kurgu
yaz ı l ı mı n gerçek dü nya il e ol an il iş kisinin sağ l anab il mesidir. Bu il iş ki el b ette nesne
yönel iml i programl ama tekniğ i il e sağ l anmaktadı r. N esne yönel iml i programl ama tekniğ i
b il gisayar uygul amal arı nı soyut b ir ol gudan çı kararak insanl arı n dah a kol ay
al gı l ayab il ec eğ i h al e getirmiş tir. Ö yl e görü nü yorki, makro dü z eyde gerçek h ayatı
model l eme il e b aş l ayan b u il iş ki mikro dü z eydede b ü yü k ses getirec ektir. N itekim son
yı l l arda gel iş tiril en yapay sinir ağ l arı il e makinel erin çal ı ş ma sisteml erinin gü n geçtikçe
insanl arı n veya c anl ı l arı n çal ı ş ma ş ekl ine yakl aş tı ğ ı görü l mektedir. A rtı k b il gisayarl ardan
sadec e veril en komutl arı yerine getirmek değ il , b el irl i ol ayl ar ve duruml ar karş ı sı nda b az ı
h ü kü ml ere varab il mel eride istenmektedir. Burada vurgul amak istediğ im nokta ş udur :
b iz l er yaz ı l ı m mü h endisl eri veya programc ı l ar ol arak gerçek h ayatı ne kadar iyi
model l eyeb il iyorsak o kadar b aş arı l ı sayı l ı rı z . P eki "desgin pattern" konusu nerede
devreye girmektedir? İ ş te b enimde gel mek istediğ im nokta b udur; "desgin patterns" b ir
model in tasarı mı n ustac a tasarl anması nı sağ l ayac ak çeş itl i desenl erin ol uş turul ması nı ve
b u desenl erin ih tiyaç dah il inde h erh angi b ir model in inş aası nda kul l anı l ab il mesini sağ l ar.
"D esign pattern" kavramı b ir kural l ar topl ul uğ undan z iyade b ir iş i nası l ve en gü z el ne
ş ekil de yapab il ec eğ imiz gösteren yönteml er topl ul uğ udur. Ö yl eki iyi b ir yaz ı l ı m
model l eyic isiyseniz kendi tasarı m desenl eriniz i ol uş turab il ir ve b unl arı diğ er ustal arı n
kul l anı mı na sunab il irsiniz . Tasarı m desenl eri tec rü b e il e ol uş turul an yapı l ardı r.
Baz ı l arı ol maz sa ol maz yapı l ar ol ması na rağ men b az ı l arı tamamen yaz ı l ı mı n sanatsal
yönü nü göstermek için tasarl anmı ş tı r . Ö rneğ in b u yaz ı mı n ana konusunu b el irl eyen
"Singl eton" tasarı m deseni yı l l ardan b eri b ir çok kiş i taraf ı ndan kul l anı l mı ş tı r. Siz de b u
yaz ı da b u desenin amac ı nı ve nası l uygul andı ğ ı nı öğ rendiğ iniz de eminimki proj el eriniz de
mutl aka kul l anac aksı nı z . Hemen ş unuda b el irteyimki b u tasarı m deseni siz i uz aya
götü rmeyec ektir, b u yü z den b ekl entil eriniz i b iraz dah a az al tmanı z da f ayda var.
O h al de "design pattern" yada "tasarı m deseni" ni ş u ş ekil de tanı ml ayab il iriz : Bir tasarı m
prob l emini en b asit ve en ef ektif b ir ş ekil de çöz ü me kavuş turac ak yöntemdir.
"D esign P attern" konusunda yaz ı l mı ş en gü z el ve en popü l er kaynakl ardan b iri E ric h
G amma, R ic h ard Hel m, R al ph Joh nson ve Joh n V l issides taraf ı ndan kal eme al ı nmı ş
"D es ig n P atterns : E lements of R eus ab le O b j ect-O riented S oftw are" kitab ı dı r. Bu kitapta
en popü l er tasarı m desenl eri anl atı l mı ş ve b u desenl erin çeş itl i uygul amal arı na yer
veril miş tir. "D esgin pattern" guru' l arı ol arak anı l an b u 4 kiş i "G angs O f F our(G O F )" ol arak
ta b il inmektedir. Z aten b ah si geçen kitapta anl atı l an tasarı m desenl erine de genel ol arak
G oF tasarı m desenl eri denil mektedir. Bu yaz ı il e b aş l ayan yaz ı diz isinde G O F ol arak anı l an
tasarı m desenl erini siz l ere aktarı p çeş itl i kul l anı m al anl arı nı açı kl ayac ağ ı m.
G O F tasarı m desenl eri genel ol arak 3 ana grup al tı nda inc el enir. Bu grupl ar ve h erb ir
gruptaki tasarı m desenl erinin isiml eri aş ağ ı da veril miş tir.
1 - C rea tina l P a tterns Bu desenl er b ir yada dah a f az l a nesnenin ol uş turul ması ve
yönetil mesi il e il gil idir. Ö rneğ in b u yaz ı da anl atac ağ ı m ve b ir uygul amanı n ömrü b oyunc a
b el irl i b ir nesneden sadec e b ir adet b ul unması nı garantil eyen Singl eton deseni b u grub a
girmektedir. Bu gruptaki diğ er desenl er ise
• A b strac t F ac tory
• Buil der
• F ac tory M eth od
• P rototype
ol arak b il inmektedir. Bu desenl erin b ir çoğ unu il erl eyen yaz ı l arı mda el e al ac ağ ı m.
Ş imdil ik sadec e b ir giriş yapı yoruz .
2 - B eha v io ra l P a tterns Bu gruptaki desenl erin amac ı b el irl i b ir iş i yerine getirmek için
çeş itl i sı nı f l arı n nası l b irl ikte davranab il ec eğ inin b el irl enmesidir. Bu gruptaki desenl er ise
aş ağ ı daki gib idir.
• Ch ain of responsib il ity
• Command
• I nterpreter
• I terator
• M ediator
• M emento
• O b server
• State
• Strategy
• Templ ate meth od
• V isitor
3 - S tru c tu ra l P a tterns Bu gruptaki desenl er ise çeş itl i nesnel erin b irb irl eri il e ol an
il iş kil eri temel al ı narak tasarl anmı ş tı r. Bu gruptaki tasarı m desenl eri ise ş unl ardı r:
• A dapter
• Bridge
• Composite
• D ec orator
• F açade
• F l yw eigh t
• P rox y
Bu giriş b il gisinden sonra ş imdi nesnel erin yaratı l ması il e il gil i grup ol an "Creatinal
P atterns" grub unda b ul unan "Singl eton" desenini açı kl amaya b aş al ayab il iriz .
P eki b u iş l emi nası l yapac ağ ı z .? N ası l ol ac akta b ir sı nı f tan sadec e ve sadec e b ir nesne
yaratı l ması garanti al tı na al ı nac ak? A sl ı nda b iraz dü ş ü nü rseniz c evab ı nı h emen
b ul ab il irsiniz ! Ç öz ü m gerçekten de b asit : statik ü ye el emanl arı nı kul l anarak.
Singl eton tasarı m desenine geçmeden önc e sı nı f l ar ve nesnel er il e il gil i temel b il gil erimiz i
h atı rl ayal ı m. Hatı rl ayac ağ ı nı z ü z ere b ir sı nı f tan yeni b ir nesne ol uş turmak için yapı c ı
metot(c onstruc tor) kul l anı l ı r. Y apı c ı metotl ar C# dil inde new anah tar söz c ü ğ ü kul l anı l arak
aş ağ ı daki gib i çağ rı l ab il mektedir.
S ı nı f nesne = new S ı nı f( );
Bu ş ekil de yeni b ir nesne ol uş turmak için new anah tar söz c ü ğ ü nü n temsil ettiğ i
yapı c ı metoduna dı ş arı dan eriş imin ol ması gerekir. Y ani yapı c ı metodun pub l ic ol arak
b il diril miş ol ması gerekir. A nc ak "Singl eton" desenine göre b el irl i b ir anda sadec e b ir
nesne ol ab il ec eğ i için new anah tar söz c ü ğ ü nü n il gil i sı nı f için yasakl anması gerekir yani
yapı c ı metodun protec ted yada private ol arak b il diril mesi gerekir. E ğ er b ir metodun
varsayı l an yapı c ı metodu(def aul t c onstruc tor- parametresiz yapı c ı metot) pub l ic ol arak
b il diril memiş se il gil i sı nı f tü rü nden h erh angi b ir nesnenin sı nı f ı n dı ş ı nda tanı ml anması
mü mkü n değ il dir. A nc ak b iz im isteğ imiz yal nı z c a b ir nesnenin yaratı l ması ol duğ una göre
il gil i sı nı f ı n içinde b ir yerde nesnenin ol uş turul ması gerekir. Bunu el b ette statik b ir
öz el l ik(property) yada statik b ir metotl a yapac ağ ı z . Bu statik metot sı nı f ı n kendi içinde
yaratı l an nesneyi geri dönü ş değ eri ol arak b iz e gönderec ektir. P eki b u nesne nerde ve ne
z aman yaratı l ac aktı r? Bu nesne statik metodun yada öz el l iğ in içinde yaratı l ı p yine sı nı f ı n
private ol an el emanı na atanı r. Tekil ol arak yaratı l an b u nesne h er istendiğ inde eğ er nesne
z aten yaratı l mı ş sa b u private ol an el emanı n ref erası na geri dönmek yada nesneyi yaratı p
b u private değ iş kene atamak gerekmektedir. Sanı rı m b u deseni nası l
uygul ayab il ec eğ imiz i kaf anı z da b iraz c anl andı rdı nı z . O h al de dah a f az l a uz atmadan
desenimiz i uygul amaya geçirel im.
Y ukarı daki sı nı f örneğ inde Singl etonD eseni sı nı f ı b el l eğ e yü kl endiğ i anda statik ol an
Singl etonD eseni nesnesi yaratı l ac aktı r. Bu nesne yaratı l ı ş ı nı n new anah tar söz c ü ğ ü il e
yapı l dı ğ ı na dikkat edin. E ğ er siz M ain() gib i b ir metodun içinden b u nesneyi yaratmaya
kal ksaydı nı z derl eme aş aması nda h ata al ı rdı nı z . Ç ü nkü pub l ic ol an h erh angi b ir yapı c ı
metot b ul unmamaktadı r. A yrı c a
Siz M ain() gib i b ir metodun içinden yaratı l an b u nesneye
ş ekl inde eriş meniz mü mkü ndü r. Böyl ec e yukarı daki deyimi h er kul l andı ğ ı nı z da siz e geri
dönen nesne, sı nf ı ı n b el l eğ e il k yü kl endiğ inde yaratı l an nesne ol duğ u garanti al tı na
al ı nmı ş ol du. D ikkat etminiz gereken diğ er b ir nokta ise nesneyi geri döndü ren öz el l iğ in
yal nı z c a get b l oğ unun ol ması dı r. Böyl ec e b ir kez yaratı l an nesne h aric i b ir kaynak
taraf ı ndan h iç b ir ş ekil de değ iş tiril emeyec ektir.
Y ukarı daki Singl etonD eseni sı nı f ı nı aş ağ ı daki gib i de yaz mamı z mü mkü ndü r.
D ikkat ederseniz iki sı nı f ı n tek f arkı ol uş turul an nesneye eriş me b içimidir. İ l k versiyonda
nesneye öz el l ik ü z erinden eriş il irken ikinc i versiyonda metot ü z erinden eriş il mektedir.
D eğ iş meyen tek nokta ise h er iki eriş im arac ı nı n da statik ol ması dı r.
yada
ş ekl inde istediğ imiz de nesne z aten yaratı l mı ş durumda ol maktadı r. O ysa b u sı nı f ı dah a
ef ektif b ir h al e getirerek yaratı l ac ak nesnenin anc ak b iz onu istediğ imiz de yaratı l ması nı
sağ l ayab il iriz . Bu durumu uygul ayan Singl eton deseninin 3 versiyonunu ol arak aş ağ ı da
göreb il irsiniz .
if (nesne == nul l )
Herş eye rağ men yukarı daki 3 versiyonda b az ı duruml ar için tek b ir nesnenin ol uş ması nı
garanti etmemiş ol ab il irz . E ğ er çok kanal l ı (mul ti-th read) b ir uygul ama gel iş tiriyoı rsanı z
f arkl ı kanal l arı n aynı nesneyi tekrar yaratması ol ası dı r. A nc ak eğ er çok kanal l ı
çal ı ş mı yorsanı z (çoğ unl ukl a tek th read il e çal ı ş ı rı z ) yukarı daki sade ama öz ol an 3
versiyondan b irini kul l anab il irsiniz . A ma eğ er çok kanal l ı programl ama model i söz konusu
ise ne yaz ı kki f arkl ı kanal l arı n aynı nesneden tekrar yaratması nı engel emek için ekstra
kontrol l er yapmanı z gerekmektedir. N e yaz ı kki diyorum çü nkü b u yapac ağ ı mı z kontrol
perf ormansı b ü yü k öl çü de dü ş ü rmektedir.
O h al de çok kanal l ı uygul amal arda kul l anab il ec eğ imiz Singl eton desenini yaz al ı m.
return nesne;
}
}
Y ukarı daki desendeki pü f nokta l oc k anah tar söz c ü ğ ü nü n kul l anı mı dı r.E ğ er nesne il k def a
yaratı l c aksa yani dah a önc eden nesne nul l değ ere sah ipse l oc k anah tar söz c ü ğ ü il e
iş aretl enen b l ok kitl enerek b aş ka kanal l arı n b u b l oğ a eriş mesi engel l enir.
Böyl ec e kil itl eme iş l emi b ittiğ inde nesne yaratı l mı ş ol ac ağ ı için, kil idin kal kması nı
b ekl eyen diğ er kanal l oc k b l oğ una girmiş ol sa b il e b u b l oktaki ikinc i if kontrol ü nesnenin
yeniden ol uş turul ması nı engel l eyec ektir. Böyl ec e çok kanal l ı uygul amal ar içinde tek b ir
nesnenin ol uş ması nı ve b u nesneye eriş imi garanti al tı na al an Singl eton desenini
tasarl amı ş ol duk.
Son ol arak l oc k anah tar söz c ü ğ ü nü kul l anmadan çok kanal l ı uygul amal ar içinde tek b ir
nesneyi garanti al tı na al ac ak deseni yaz al ı m. A ş ağ ı da Singl eton desenin 5. versiyonu
b ul unmaktadı r.
Bu versiyonun b irinc i versiyondan tek f arkı yapı c ı metodunda statik ol ması dı r. C# dil inde
statik yapı c ı metotl ar b ir uygul ama domeninde anc ak ve anc ak b ir nesne yaratı l dı ğ ı nda
yada statik b ir ü ye el eman ref erans edil diğ inde b ir def aya mah sus ol mak ü z ere çal ı ş tı rı l ı r.
Y ani yukarı daki versiyonda f arkl ı kanal l arı n(th read) b irden f az l a Singl etonD eseni nesnesi
yaratması imkansı z dı r. Ç ü nkü static ü ye el emanl ar anc ak ve anc ak b ir def a çal ı ş tı rı l ı r.
Son versyion b asit ve kul l anı ş l ı görü nmesine rağ men kul l anı mı nı n b az ı sakı nc al arı vardı r.
Ö rneğ in N esne Ö z el l iğ i dı ş ı nda h erh angi b ir statik ü ye el emanı nı z var ise ve il k ol arak b u
statik ü ye el emanı nı kul l anı yorsanı z siz istemedğ iniz h al de Singl etonD eseni nesnesi
yaratı l ac aktı r. Z ira yukarı da da dediğ imz gib i b ir statik yapı c ı metot h erh angi b ir statik
ü ye el emanı kul l anı l dı ğ ı anda çal ı ş tı rı l ı r. D iğ er b ir sakı nc al ı durumda b irb irini çağ ı ran
statik yapı c ı metotl arı n çağ rı l ması sı rası nda çel iş kil erin ol uş ab il ec eğ idir. Ö rneğ in h er
static yapı c ı metot anc ak ve anc ak b ir def a çal ı ş tı rı l ı r dedik. E ğ er çal ı ş tı rı l an b ir static
metot diğ er b ir statik metodu çağ ı rı yor ve b u statik metotta il kini çağ ı rı yorsa b ir çel iş ki
ol ac aktı r.
K ı sac ası eğ er kodunuz un çel iş ki yaratmayac ağ ı ndan eminseniz 5. deseni kul l anmanı z
doğ ru ol ac aktı r. E ğ er çok kanal l ı uygul ama gel iş tiriyorsanı z 4. versiyonu, çok kanal l ı
uygul ama gel iş tirmiyorsanı z da 3. versiyonu kul l anmanı z tavsiye edil mektedir.
Singl eton deseni konul u makal enin sonuna gel miş b ul unmaktayı z . E ğ er il eride b ir gü n
yukarı daki desenl erin b irini kul l anma ih tiyac ı h issederseniz h angi deseni ne amaçl a
kul l andı ğ ı nı z ı b iz iml e payl aş ı rsanı z seviniriz .
Bir diğ er "Creational P atterns" deseni ol an "A b strac t F ac tory" desenini anl atac ağ ı m yaz ı da
görü ş mek ü z ere.
X P S t ilind e K ont roller ile Ç alış ma
Bu yaz ı mı z da W indow s F orm kontrol l erinin veya nesnel erinin W indow s X P stil i
görü nü ml erini nası l el de edeb il ec eğ imiz i görec eğ iz .
M ic rosof t F ramew ork v1.1’ de b u öz el l ik h enü z pratik b ir ş ekil de yok. Bu yü z den yol umuz
b iraz uz un.
E l de edec eğ imiz b u görü nü m W indow s X p’ den önc eki iş l etim sisteminde h al iyl e
görü nmeyec ek, o iş l etim sisteminin def aul t h al iyl e görü nec ektir(mesel a b utonl ar önc eki
iş l etim sisteml erinde gri renkl i görü nü yordu).
Herh angi b ir karı ş ı kl ı k çı kmaması için yönergel eri b erab er takib edel im.
A ynı penc erede T empla tes al anı nda W indo w s A pplic a tio n seçil i ol sun.
A ynı penc erede L o c a tio n al anı nda mevc ut yol un sonundaki kl asör isminide X P S tyle
yapı n.
B u tto n, ra dio B u tto n, ve c hec k B o x nesenel erinin P ro perties penc eresinde F la t S tyle
kı smı nı S ystem yapı n.
M enü den F il e/Save A l l tı kl ayı n ve M enuden Buil d/Buil d Sol utin tı kl ayı n.
E l imiz de mevc ut b ir görü nü m ol uş tu, P roj eyi b u h al iyl e çal ı ş tı rı rsanı z (D eb ug/Start),
A çı l an penc erede T empla tes kı smı nda X M L F ile(h erh angi b ir .c s dosyası da ol ab il ir)
seçin.
“ [P roj e A dı ].ex e.manif est” yaz ı m b içiminde X P S tyle. exe. ma nifest yaz ı n.
O l uş turduğ umuz X P S tyle. exe. ma nifest adl ı dosyayı açı n ve içine aş ağ ı daki kodl arı
yapı ş tı rı n.
< assemb l y x ml ns="urn:sc h emas-mic rosof t-c om:asm.v1" manif estV ersion="1.0">
< desc ription>.N E T c ontrol depl oyment tool < /desc ription>< dependenc y>
< assemb l yI dentity type="w in32" name="M ic rosof t.W indow s.Common-Control s"
version="6 .0.0.0" proc essorA rc h itec ture="X 86 " pub l ic K eyToken="6 59 5b 6 4144c c f 1df "
l anguage="*" />
Bu kodda < E x ec utab l e N ame> kı smı na P roj emiz in adı ol an X P Styl e yaz ı n
Y eni h al : name="M ic rosof t.W inw eb .X P Styl e" ş ekl inde ol ac ak.
M enü den F il e/Save A l l tı kl ayı n ve M enuden Buil d/Buil d Sol utin tı kl ayı n.
Ç al ı ş ma esnası nda f aydal anmak içi b u dosyayı b in\deb ug kl asörü ne de kopyal ayab il irsiniz
A ç ı l a n p e n c e r e d e O b j \D e b u g k l a s ö r ü n e u l a ş ı n .
G örü nen dosyal ardan X P Styl e.ex e.manif est dosyası nı seçip O pen b utonuna tı kl ayı n.
A çı l an Custom R esourc e Type penc eresinde R esourc e Type al anı na “ R T_ M A N I F E ST” yaz ı n
ve O key b utonuna tı kl ayı n.
X P Styl e.ex e(101-D ata) dosyası açı l dı . Bu dosyadayken P roperties penc eresinden I D
al anı nı n 101 ol an değ erini 1 yapı n
M enü den F il e/Save A l l tı kl ayı n ve M enuden Buil d/Buil d Sol utin tı kl ayı n.
Bu dosyayı kapatı n.
Bu yaz ı da b ir sayı nı n yaz ı ya nası l çevireb il ec eğ imiz h akkı nda b ir yol gösterec eğ im, dil
ol arak C# kul l anı l ac aktı r. Ö nc el ikl e b el irteyim ki programl ama ve C# konusunda çok
yeniyim. Hemen h emen tü m b il dikl erimi b u siteye b orçl uyum.
A ş ağ ı daki kodda b ul unan O ku f onksiyonu kendisine string ol arak gönderil en tam sayı yı
yaz ı ya çevirmektedir. K odun çal ı ş ma mantı ğ ı ş öyl edir.
oku f onksiyonuna gönderil en string b aş ı na "0" ekl emek suretiyl e önc e 15 h aneye
tamaml anı r, sonra yeni string 3 erl i kü mel er h al inde 5 eş it parçaya b öl ü nü r ve h er b ir
ü çl ü kü me tek tek
rakam diz isine yü kl enir. Böyl ec e 5 el emanl ı rakam diz isinin h er b ir el emanı nda 3
karakterl i b ir string yü kl ü ol ur.
1.A ş ama
sayı mı z 32313234 ol sun. il k ol arak sayı mı z ı n h ane sayı sı nı b aş ı na 0 ekl emek sureti il e 15
e çı karı rı z .
Böyl ec e yeni stringimiz 000000032313234 ş ekl ini al ı r.
2.A ş ama
1. kü me : 000
2. kü me : 000
3. kü me : 032
4. kü me : 313
5. kü me : 234
3.aş ama
rakam[0] = "000"
rakam[5] = "234"
ol ur
ol ur.
4.aş ama
10 el emanl ı yü z l er, onl ar, b irl er string diz il eri tanı ml anı r ve i çl eri dol durul ur.
örn:
yuz l er.SetV al ue("ikiyuz ",2);
onl ar.SetV al ue("otuz ",3);
b irl er.SetV al ue("dört",4);
yani yuz l er[2]+ onl ar[3]+ b irl er[4] = ikiyü z otuz dört ol ur.
otuz dört
ü çyü z onuç
ikiyü z otuz dört
ü el de edersiniz
5.A ş ama
h ane isiml i 5 l i array tanı ml anı r ve el emanl arı tril yon, mil yar, mil yon, b in ve sonunc usu
da b oş ol ac ak ş ekil de ayarl anı r. aynı döngü içerisinde h er b ir kü menin sonuna ekl enir
{
sonuc = sonuc +
h ane[i];
Burada ayarl anması gereken durum eğ er b ir kü menin b ü tü n el emanl arı sı f ı rsa (yukarı daki
gib i) h anenin göz ü kmemesi gerekir. Y ani
000 = yuz l er[0]+ onl ar[0]+ b irl er[0]+ h ane[0] dersek sonuç tril yon ol ur b u durumda
if (rakam[0].ToString()! = "000")
if (rakam[1].ToString()! = "000")
if (rakam[2].ToString()! = "000")
if (rakam[3].ToString()! = "000")
yani rakam[0] (tril yon kü mesi) "000" değ il se h ane[0] = "tril yon" ol sun demel iyiz .
Y anl ı z b ir sorun dah a var. eğ er sayı 1000 ise f onksiyon b iz e h akl ı ol arak "b irb in" i
döndü rü r. Bir mil yar var, Bir M il yon var ama b ir b in ve b ir yü z yok. Ben b u sorunu
BirSorunu isiml i f onksiyonl a h al l ettim.
using System;
{
pub l ic c l ass SayiO kuma
{
h ane.SetV al ue("",0);
h ane.SetV al ue("",1);
h ane.SetV al ue("",2);
h ane.SetV al ue("",3);
h ane.SetV al ue("",4);
/* il k ol arak b u arrayı n el emanl arı nı b oş ol arak ayarl ı yoruz eğ er kü me el emanl arı
000 değ il se tril yon,mil yar,mil yon b in değ erl eri il e dol duruyoruz
*/
try
{
c atc h (E x c eption ex )
{
return ex .M essage.ToString();
if (rakam[0].ToString()! = "000")
h ane.SetV al ue("tril yon ",0);
if (rakam[1].ToString()! = "000")
h ane.SetV al ue("mil yar ",1);
if (rakam[2].ToString()! = "000")
h ane.SetV al ue("mil yon ",2);
if (rakam[3].ToString()! = "000")
h ane.SetV al ue("b in ",3);
return sonuc ;
string c oz um = "";
if (sorun == "b irb in ")
c oz um = "b in ";
el se
c oz um = sorun;
return c oz um;
}
}
Herkese kol ay gel sin. Bu arada dil eyene D L L i göndereb il irim. İ yi çal ı ş mal ar.
C#’ t a T ems ilc i ( D elegat e) v e O lay( E v ent ) K u llanımı
Bu yaz ı mda siz l ere C# ’ ta del egate(del ege veya el çi) ve event(ol ay) kavraml arı ndan
b ah sedec eğ im ve el b ette b unl arı kul l anmanı n yararl arı nı anl atac ağ ı m. K uş kusuz .N et
F ramew ork il e b irl ikte gel en en b ü yü k yenil ikl erden b iri del ege ve event kul l anı mı dı r. Bu
yanı il e .N et F ramew ork diğ er uygul ama gel iş tirme ortaml arı nı n b ir kı smı ndan dah a ü stü n
nitel ikl ere sah ip ol maktadı r. Ş imdi del ege nedir b iraz ondan b ah sedel im. D el ege b asit
anl amda dü ş ü nü rsek arac ı l ı k yapandı r. Burada ise del ege arac ı l ı k yapan metod ol arak
karş ı mı z a çı kar. Y ani b aş ka b ir metodun tetikl enmesine yardı m eden metottur. Bu sayede
metodl arı n tetikl enmesi dinamik ol arak gerçekl eş ir. O l ay(event) ise h er z aman –b el ki
f arkı nda ol madan– kul l andı ğ ı mı z kontrol l er gib idir. Y al nı z del ege il e ol ay arası ndaki f ark
del egel erin "invoke" edil mesi ol ayl arı n ise "raise" edil mesidir. D ah a b asit ol arak if ade
edersek ol ayl ar del egel erin öz el b ir h al idir. D el egel er ol madan ol ayl arı n b ir anl amı yoktur.
A sl ı nda b ir örnekl e b unl arı n nası l kul l anı l dı ğ ı nı açı kl arsam dah a iyi anl aş ı l ac aktı r. Ş imdi
çayı n kaynaması nı dü ş ü nü n. Ç ay kaynadı ğ ı anda h ab erdar ol mak istiyoruz anc ak çayı n
b aş ı nda da b ekl emek istemiyoruz . Bu yü z den b iz i h ab erdar edec ek z il çal ma metodunu
çayı n kaynama metoduna b ağ l ı yoruz . V e çay kaynadı ğ ı anda z il çal ma metodu da
otomatik ol arak tetikl enmiş ol uyor. D el ege il e ol ayı n impl ementasyonunu aş ağ ı da
gösterec eğ im ve b unl arl a il gil i b ir program de koyarak anl aş ı l ması nı kol ayl aş tı rac ağ ı m.
Ç ü nkü b az en programl arl a anl atmak istedikl erimiz i dah a iyi anl atı rı z .
I . O l ayı n(event) yapı l ı ş ı : M ouse’ ı n tı kl anması , f orm ü z erindeki b ir tuş a b ası l ması , f orm
ü z erindeki b ir l inkin tı kl anması vs… b unl arı n h epsi b irer ol aydı r asl ı nda. Ş imdi mouse
tı kl anması il e il gil i b ir kodu inc el eyel im:
M ouse.M ouseCl ic ked + = new M ouseCl ic kedE ventHandl er(F areTikl a);
// Ş imdi de f are sol tı kl andı ğ ı z aman çal ı ş ac ak ol an metodu devreden çı karı yoruz . Bu
sayede f are sol tı kl andı ğ ı z aman h iç b ir metot //devreye girmeyec ektir. Y ani f arenin sol
tı kl anması na h erh angi b ir tepki veril meyec ektir.
M ouse.M ouseCl ic ked -= new M ouseCl ic kedE ventHandl er(F areTikl a);
I I . D el egenin yapı l ı ş ı : D el ege kul l anı l ac ağ ı z aman tek b aş ı na da kul l anı l ab il diğ i gib i
ol ayl ara b ağ l anarak da kul l anı l ab il mektedir. Bu yü z den il k önc e ol ayı (event) anl arsak
del egenin anl aş ı l ması dah a da kol ayl aş ac aktı r. Ş imdi b asit b ir del ege nası l tanı ml anı r ona
b akal ı m.
//Ş imdi de del egenin temsil ettiğ i metodun nası l çal ı ş tı rı l ac ağ ı nı sağ l ayan kodu yaz al ı m.
aD el egate(3333);
Bunu eğ er uz un yol dan yapmak isterseniz tek tek b ü tü n f orml ar içinde b irer tane
değ iş ken tanı ml ayı p onu kontrol etmeniz gerekirdi. Sonra da tek tek diğ er f orml ara mesaj
gönderil mesini sağ l amak gerekirdi. Bu ş ekil de yapmak uz un ve z ah metl i b ir iş ol urdu.
İ kinc i yöntem ise del ege(temsil c i) yapı sı nı kul l anmaktı r. Ş imdi h er f ormumuz için b ir tane
f orma mesaj yaz ac ak ol an b ir metod ol mal ı ve b u metod h angi f ormdaki yaz dı rma
tuş unun tetikl endiğ ini b el irtmek için b ir tane de parametre al mal ı . Ş imdi de yukarı da
anl attı ğ ı mı z senaryonun kodunu inc el eyel im.
A na f ormumuz içinde tanı ml adı ğ ı mı z del ege ve ol ay yapı sı na b akal ı m. Burada del egemiz
tamsayı (int) b ir parametre al ı yor. Bu parametre sayesinde h angi f ormdaki tuş a b ası l arak
b u del egenin h arekete geçiril diğ ini anl ayab il ec eğ iz . O l ayı mı z a b akac ak ol ursak ol ayı mı z ı n
b ir ü st satı rda tanı ml anan del ege tipinde ol duğ unu göreb il iriz .
sayac değ iş keni ise f orma numara vermek için tanı ml anmı ş b ir değ iş ken ol uyor.
Y eni f orm ol uş turma tuş una b ası l ı nc a ise yeni f orm ol uş turul ac ak ve b u f ormun içindeki
etikete yaz ma metodu ol aya ekl enec ek.
sayac = sayac+1;
FrmUser frmUser=new FrmUser(sayac,this);
O l ayl ara doğ rudan b aş ka sı nı f l ar al tı ndan eriş il eb il se de b u yöntem pek doğ ru b ir yol
ol mayac ağ ı için ol ayı mı z ı b ir metodun içinde kamuf l e ederek kul l anı yoruz . O yü z den
ol ayı mı z ı metodTetikl e adı nda b ir metodun içinde kamuf l e ederek kul l anı yoruz . Baş ka b ir
f ormdan içinden b u metod çağ rı l dı ğ ı an otomatik ol arak ol ayı mı z ı tetikl eyip b ü tü n
f orml ara(ana f ormumuz h ariç) h angi f ormdan tuş a b aı l dı ğ ı nı yaz ac ak.
Bir de ş imdi ol aydan b el l i b ir del egenin çı karı l ması iş l emi var değ il mi? Ö yl e ya yaratı l an
f orml ardan b ir tanesi kapatı l ı rsa yaz dı rma metodunun tetikl enmesi istisna’ ya (ex c eption)
yol açar. Bu yü z den b u f ormun metodunun l isteden çı karı l ması gerekir. A ş ağ ı daki kod b u
iş i yaparak b iz i istenmeyen h atal ardan korumuş ol ur.
Y ukarı daki kodun tamamı ana f ormumuz içinde yer al an kodl ardı . Ş imdi de ana f ormda
tuş a b ası l ı nc a ol uş turul an f ormun içinde koda b akal ı m.
F orml ara yaz ı yaz dı rmak için tuş a b astı ğ ı mı z da ana f ormumuz daki metodTetikl e
metodunu çağ ı rarak ol ayı n tetikl enmesini sağ l ı yoruz .
G al ib a b ir tek sonradan ol uş turul muş b ir f orm kapatı l ı nc a ana f ormumuz daki del ege
çı kartma metodunun nası l çağ rı l ac ağ ı kal dı . O nu da sonradan ol uş turul an f ormumuz un
D ispose metodu içine aş ağ ı daki gib i yaz arsak h iç b ir ş ekil de h atayl a karş ı l aş mayı z .
form1.elemanCikart(this);
E vet yukarı da del ege ve ol ayı n nası l b ir arada kul l anı l dı ğ ı nı b asit b ir örnek ü z erinde
anl atmı ş ol dum. Y ukarı da del ege ve ol ayı n b ir arada kul l anı l dı ğ ı örnek programı b uraya
tı kl ayarak indireb il irsiniz .
Son ol arak iyi anl ayamadı ğ ı nı z veya kaf anı z a takı l an kı sı ml ar için mail adresim
aytac oz ay@ msakademik.net
C# ile " B it map t o B inary" v e " B it map İ nc elt me" A lgorit mas ı
Y az dı ğ ı m örnek uygul amanı n örnek ekran çı ktı l arı aş ağ ı daki gib idir.
Siyah Beyaz f ormatı ndaki A 4.b mp resminin il k görü ntü sü b inary f ormatı ndaki h al idir,
ikinc i görü ntü ise b u b inary b il gil erin inc el til mesinden el de edil miş tir.
Siyah Beyaz f ormatı ndaki B4.b mp resminin il k görü ntü sü b inary f ormatı ndaki h al idir,
ikinc i görü ntü ise b u b inary b il gil erin inc el til mesinden el de edil miş tir.
N ot : İ ki resim arası ndaki f arkı göremiyorsanı z ekranı nı z a b iraz dah a uz aktan ş aş ı ş ekil de
b akı n.
Y ukarı daki resim dosyal arı nı proj edeki h arf l er kl asörü nde b ul ab il irsiniz .
P r o je y e a it k a y n a k d o s y a la r ı in d ir m e k iç in t ık la y ın ız .
Bu yaz ı da C# ' ı n öneml i iki anah tar kel imesi ol an ve değ er tü rl eride dah il ol mak ü z ere
b ü tü n veri tü rl erini ref erans yol u il e metotl ara aktarmamı z ı sağ l ayan ref ve o u t' un
kul l anı mı nı gösterec eğ im.
C# dil inde temel ol arak iki veri tü rü vardı r. Bunl ardan b irinc isi ref erans tü rl eri ikinc isi
ise değ er tü rl eridir. R ef erans tü rl eri b ir if ade(metot çağ rı mı , atama if adesi vs.) içinde
kul l anı l dı ğ ı z aman nesnenin b el l ekteki adresi ü z erinden iş l em yapı l ı r. Y ani nesnenin
b ü tü n verisi ayrı c a kopyal anmaz . D eğ er tü rl erinde ise durum dah a f arkl ı dı r. D eğ er
tü rl eri yani int, b yte,b ool gib i veri tü rl eri h erh angi b ir if ade içinde kul l anı l ı rsa değ iş kenin
yeni b ir kopyası çı karı l ı r ve iş l eml er b u yeni kopya ü z erinden gerçekl eş tiril ir. D ol ayı sı yl a
orj inal nesnenin değ eri h iç b ir ş ekil de değ iş tiril emez . A sı l konumuz a geçmeden önc e
değ iş kenl erin ref erans yol u il e aktarı mı nı n ne demek ol duğ unu ve b u iki tü r arası ndaki
f arkı dah a iyi anl amak için b asit b ir örnek vermekte f ayda görü yorum.
A ş ağ ı daki programdaki gib i x ve y gib i iki int tü rü nden değ iş kenimiz ol sun. Bu
değ iş kenl erin değ erl erini değ iş tirmek(sw ap) için D egistir() isiml i b ir metot yaz mak
istediğ imiz i dü ş ü nel im. Bu metot il k akl a gel eb il ec ek ş ekil de aş ağ ı daki gib i yaz ı l ı r.
using System;
D egistir(x ,y);
Y ukarı daki programı derl eyip çal ı ş tı rdı ğ ı mı z da x ve y değ iş kenl erinin değ erl erinin
değ iş tiril mediğ ini ve aynı değ erde kal dı kl arı nı görü rü z . Bunun seb eb i D egistir()
metoduna gel en x ve y değ iş kenl eri il e M ain() metodunda tanı ml amı ş ol duğ umuz x ve y
değ iş kenl erinden tamamen b ağ ı msı z yeni değ iş kenl er ol ması dı r. D ol ayı sı yl a D egistir()
metodunda yaptı ğ ı mı z değ iş ikl ikl er orj inal değ iş kenl erimiz i h iç b ir ş ekil de
etkil ememiş tir. D eğ iş kenl erin b u ş ekil de aktarı l ması na "değ er yol u il e aktarma" yada
Y ukarı daki programı aş ağ ı daki gib i b iraz değ iş tirip x ve y değ iş kenl eri b ir sı nı f
arac ı l ı ğ ı yl a metota gönderirsek değ iş tirme iş l emini yapab il iriz .
using System;
c l ass Cl ass1
{
static void M ain()
{
C x = new C(10);
C y = new C(20);
D egistir(x ,y);
Bu progrmı derl eyip çal ı ş tı rdı ğ ı mı z da x ve y nesnel erinin deger ü ye el amanl arı nı n yer
değ iş tiril diğ ini görec eksiniz . Y er değ iş tirmeyi yapab il memiz in seb eb i x ve y
değ iş kenl erinin ref erans yol u il e metoda geçiril mesidir. Y ani D egistir() metodundaki x
ve y değ iş kenl eri il e M ain() metodundaki x ve y değ iş kenl eri b el l ekteki aynı b öl geyi
temsil etmektedirl er. D ol ayı sı yl a D egistir() metodunda yaptı ğ ı mı z b ir değ iş ikl ik M ain()
metodundaki değ iş kene de yansı yac aktı r. N esnel erin metotl ara b u ş ekil de aktarı l ması na
ise "ref erans yol u il e aktarı m" yada "pass b y ref erenc e" denil mektedir.
B ir refera ns tipi o la n string türü ile ilg ili ö nemli b ir istisna v a rdı r. string
refera ns türü o lma sı na ra ğ men meto tla ra string türünden değ iş k enler
g eç irilirk en değ er tiplerinde o ldu ğ u g ib i k o pya la na ra k g eç irilirler. Y a ni int
türünden b ir değ iş k en ile string türünden b ir değ iş k en meto tla ra değ er yo lu ile
a k ta rı lı rla r. B u nu test etmek iç in b irinc i pro g ra mda k i int türü yerine string
türünü k u lla na b ilirsiniz.
R ef A na hta r S ö zc üğ ü
Y ukarı da denil diğ i gib i değ er tipl eri(int, doub l e, b yte vs.) metotl ara kopyal anarak
geçiril irl er yani değ iş kenin b ireb ir yeni b ir kopyası ol uş turul ur. A nc ak b az ı duruml arda
değ er tipl erini de ref eransl arı il e metotl ara geçirmek isteyeb il iriz . C ve C+ + dil l erinde
değ er tipl erini ref erans yol u il e geçirmek için gösteric il erden f aydal anı r. Y ani metotl ara
değ iş kenl erin adresl eri geçiril ir. C# ta b u iş l emi yapmak için gösteric i yerine yeni b ir
anah tar söz c ü k ol an ref kul l anı l ı r. ref anah tar söz c ü ğ ü değ er tü rl erinin metotl ara
ref erans yol u il e geçiril mesini sağ l ar. R ef erans tü rl eri z aten ref erans yol u il e geçiril diğ i
için b u tü rl er için ref anah tar söz c ü ğ ü nü kul l anmak gereksiz dir. A nc ak kul l anı mı
tamamen geçerl i kı l ı nmı ş tı r.
ref söz c ü ğ ü metot çağ rı mı nda ve metot b il diriminde aynı anda kul l anı l mal ı dı r. Y ani
metot b il diriminde ref il e b irl ikte kul l anı l an b ir değ iş ken, metot çağ rı l ı rken ref il e
çağ rı l mal ı dı r. Y ukarı da yaz dı ğ ı mı z b irinc i programı ref söz c ü ğ ü nü n kul l anı mı il e yeniden
dü z enl ersek D egistir() metodunun istediğ imiz ş ekil de çal ı ş ması nı sağ l ayab il iriz .
using System;
Bu programı derl eyip çal ı ş tı rdı ğ ı mı z da x ve y değ iş kenl erinin değ erl erinin değ iş tiril diğ ini
görec eksiniz . Ç ü nkü D egistir() metoundaki x ve y değ iş kenl eri il e M ain() metodundaki x
ve ye değ iş kenl eri aynı b el l ek b öl gesindeki değ eri temsil etmektedirl er. Birinde yapı l an
değ iş ikl ik diğ erinide etkil emektedir. Y ani il k durumdan f arkl ı ol arak ortada iki değ iş ken
yoktur, tek b ir değ iş ken vardı r.
U nutmamamı z gereken nokta metot çağ rı mı nı n da ref anah tar söz c ü ğ ü il e b irl ikte
yapı l ması z orunl ul uğ udur. E ğ er D egistir() metodunu D egistir(ref x , ref y) yerine
D egistir(x ,y) ş ekl inde çağ ı rmı ş ol saydı k derl eme aş aması nda
A rgument ' 1' : c annot c onvert f rom ' int' to ' ref int'
A rgument ' 2' : c annot c onvert f rom ' int' to ' ref int'
O u t A na hta r S ö zc üğ ü
O ut anah tar söz c ü ğ ü nü n kul l anı m amac ı ref anah tar söz c ü ğ ü nü n kul l anı mı il e tamemen
aynı dı r. Y ani out il e de değ er tipl eri ref erans yol u il e aktarı l ı r. A ral arı ndaki tek f ark out
il e kul l anı l ac ak değ iş kenl ere il k değ er verme z orunl ul uğ unun ol maması dı r. Y ani ref
söz c ü ğ ü nü n kul l anı mı ndaki kı sı t, out il e b irl ikte ortadan kal dı rı l mı ş tı r. out anah tar
söz c ü ğ ü nü genel l ikl e b ir metottan b irden f az l a geri dönü ş değ eri b ekl iyorsak kul l anı rı z .
Y ukarı daki D egistir() metodunu out il e kul l anı l ab il ec ek ş ekil de değ iş tirdiğ imiz de x ve y
değ iş kenl erine il k değ er verme z orunl ul uğ umuz kal kac aktı r.
ref ve out söz c ü kl erinin C# dil inde kul l anı l ması nı n kü çü k b ir f arkı ol sada I L dil inde ref
ve out aynı ş ekil de impl emente edil miş tir. I L D A SM arac ı il e D egistir() metodunun h em
ref h emde out versiyonl arı nı n b il diriminin aş ağ ı daki gib i ol duğ unu görü rü z .
Bu durum ref ve out söz c ü kl erinin kul l anı mı ndaki f arkı n C# derl eyic isi il e sı nı rl ı
ol duğ unu göstermektedir. Y ani CL R il e il gil i b ir f ark değ il dir.
Y az ı yı b itirmeden önc e out anah tar söz c ü ğ ü nü n kul l anı mı na b ir örnek vermek istiyorum.
İ ki sayı dan b ü yü k ol anı na geri dönen b ir metot yaz mak istediğ imiz i dü ş ü nel im. A ynı
z amanda da b u iki sayı dan b irinc isinin mi ikinc isinin mi b ü yü k ol duğ unuda b u metotl a
öğ renmek istiyoruz . Her metodun tek b ir geri dönü ş değ eri ol ab il ec eğ ine göre kl asik
yönteml erl e b unu ideal (! ) b ir ş ekil de gerçekl eş tiremeyiz . Bunun için il k değ er
veril memiş yeni b ir parametreyi dah a M ax () isiml i metoda gönderec eğ iz . Bu parametre
metot içinde değ iş tiril erek kendisini çağ ı ran metoda il etil ec ektir.
using System;
namespac e O ut
{
c l ass Cl ass1
{
static void M ain()
{
b ool b ;
Y ukarı daki iş l emi ref anah tar söz c ü ğ ü il e de yapab il irdik anc ak b ir metodun içinde
değ eri b el irl enec ek b ir değ iş kene il k değ er vermek gereksiz ve mantı ksı z dı r. D ol ayı sı yl a
b ir metodun b irden f az l a değ er geri vermesini istediğ imiz duruml arda out anah tar
söz c ü ğ ü nü kul l anmamı z dah a okunab il ir ve dah a dü z enl i programc ı l ı k açı sı ndan
öneml idir.
Singl eton deseni il e b aş l adı ğ ı m "design pattern" yaz ı diz isine "A b strac t F ac tory" deseni il e
devam ediyoruz . Bu yaz ı da "Creational " desenl er grub unun en öneml i ve en sı k kul l anı l an
deseni ol an A b strac t F ac tory(Soyut F ab rika) tasarı m deseninin C# il e ne ş ekil de
uygul andı ğ ı nı b ir örnek ü z erinden gösterec eğ im.
İ l k yaz ı mda da b ah settiğ im gib i "Creational " grub undaki desenl er b ir yada dah a çok
nesnenin çeş itl i ş ekil l erde ol uş turul ması il e il gil i desenl erdir. Bu kategoride el e al ı nan
"A b strac t F ac tory" ise b irb irl eriyl e il iş kil i yada b irb irl erine b ağ l ı ol an nesnel erin
ol uş turul ması nı en etkin b ir ş ekil de çöz meyi h edef l er. Bu h edef e ul aş mak için soyut
sı nı f l ardan(ab strac t c l ass) veya arayü z l erden(interf ac e) yoğ un b ir ş ekil de
f aydal anmaktadı r. "A b strac t F ac tory" deseninin ana teması b el irl i sı nı f l arı n içerdiğ i ortak
arayü z ü soyut b ir sı nı f yada arayü z ol arak tasarl amaktı r. Böyl ec e nesnel eri ü reten sı nı f ,
h angi nesnenin ü retil ec eğ i il e pek f az l a il gil inmesi gerekmez . İ l gil enmesi gereken nokta
ol uş turac ağ ı nesnenin h angi arayü z l eri destekl ediğ i yada uygul adı ğ ı dı r. Bah si geçen
mekaniz mal arl a deseni ol uş turduğ umuz anda çal ı ş ma z amanı nda h angi nesnenin
ol uş turul ması gerektiğ ini b il meden nesnel erin ol uş turul ması nı yöneteb il iriz .
Ş imdi de gerçek dü nyadan b ir örnek vererek "A b strac t F ac tory" deseninin h angi
duruml arda kul l anab il ec eğ imiz i ve soyut f ab rika mantı ğ ı nı netl eş tirel im. Bir CD sü rü c ü sü
dü ş ü nü n. CD sü rü c ü sü kendisine sü rü l en CD l eri okumakl a soruml udur. Hiç b ir z aman
sü rü l en CD nin ş ekl i ve b içimiyl e il gil enmez . A ma sü rü l en CD nin okunab il mesi için de
b el irl i ş artl arı n yerine getiril diğ ini f arz eder. Y ani siz CD sü rü c ü sü ne CD ol mayan ama CD
ye b enz eyen b ir c isim yerl eş tiriseniz onu da okumaya çal ı ş ı r.(eğ er CD sü rü c ü nü z
b oz ul maz sa! ) Ç ü nkü okumaya çal ı ş tı ğ ı c ismin ne ol duğ u il e pek il gil enmez CD sü rü c ü sü .
Buradaki örnekte CD sü rü c ü sü nü n okuma yapab il mesi için gereken ş artl arı b ir soyut
f ab rika sı nı f ı il e model l eyeb il iriz . K are yada daire ş ekl indeki gerçek CD l er ise b u soyut
f ab rika sı nı f ı taraf ı ndan b el irl enen ş artl arı destekl eyen gerçek nesnel erdir. CD
sü rü c ü sü nü n kendisi ise soyut f ab rika taraf ı ndan b el irl enen standartl ar çerçevesi
içerisinde CD nin ne tü r b ir CD ol duğ undan b ağ ı msı z b ir ş ekil de b il giyi okuyan b irimdir.
Bu, "ab strac t f ac tory" desenindeki c l ient yani istemc i sı nı f a denk dü ş er ki b u sı nı f
nesnel erin yaratı l ması ndan soruml udur.
Bu giriş b il gil erinden sonra "ab strac t f ac tory" deseninin temel öz el l ikl erini kı sac a
öz etl eyel im.
• Üretil en nesnel erin kendisiyl e il gil enil mez . İ l gil enil en nokta ol uş turul ac ak
nesnel erin sağ l adı ğ ı arayü z l erdir. D ol ayı sı yl a aynı arayü z ü uygul ayan yeni
nesnel eri desene ekl emek çok kol ay ve esnektir.
• Bu desende ü retil ec ek nesnel erin b irb irl eriyl e il iş kil i ol ması b ekl enir.
U M L M o deli
A ş ağ ı daki ş ekil "ab strac t f ac tory" tasarı m deseninin yapı sal U M L diagramı nı
göstermektedir. Ş emadaki h er b ir ş ekil desendeki b ir sı nı f ı model l emektedir. A yrı c a
desendeki sı nı f l ar arası ndaki il iş kil erde detayl ı b ir ş ekil de gösteril miş tir.
Y ukarı da ş emayı kı sac a açı kl amakta f ayda var. Ş emadan da görü l ec eğ i ü z ere "ab strac t
f ac tory" deseninde 3 ana yapı vardı r. İ l k yapı nesnel erin ol uş turul ması ndan soruml u
soyut ve gerçek f ab rikal ar, ikinc i yapı soyut f ab rikadan tü reyen gerçek f ab rikal arı n
ü rettiğ i ü rü nl eri temsil eden soyut ve gerçek ü rü n sı nı f l ar, son yapı ise h erh angi b ir
ü rü nü , kendisine parametre ol arak veril en soyut f ab rikal arı kul l anarak ü reten
istemc i(c l ient) sı nı f ı dı r.
SoyutF ab rika sı nı f ı gerçek f ab rikal arı n uygul aması gereken arayü z ü temsil eder. Bu sı nı f ,
b ü tü n metotl arı soyut ol an sı nı f ol ab il ec eğ i gib i b ir arayü z de ol ab il ir. U ygul amanı z ı n
ih tiyac ı na göre dil ediğ iniz i kul l anab il irsiniz . SoyutF ab rika sı nı f ı nda ü rü n1 ve ü rü n2' nin
ü retil mesinden soruml u iki tane metot b ul unmaktadı r. D ol ayı sı yl a b ü tü n gerçek
f ab rikal arı n h em ü rü n1' i h emde ü rü n' yi ü rettiğ i kab ul edil mektedir. Her b ir ü rü nü n ortak
öz el l ikl erini b el irl emek ve ana yapı da topl amak için SoyutU run1 ve SoyutU run2 sı nı f l arı
ol uş turul ur. Bu sı nı f l arda h erh angi b ir ü rü ne öz el b il gi b ul unmamaktadı r. A sı l b il gi b u
soyut ü rü nl erden tü reyen G erc ekU run sı nı f l arı nda b ul unmaktadı r. Her b ir f ab rikanı n
ü rettiğ i ü rü nl eri model l eyen sı nı f l arda yukarı daki ş ekil de gösteril miş tir. A sı l öneml i mesel e
ise gerçek f ab rikal arı n ü retimden soruml u metotl arı nı n ne ş ekil de geri dönec eğ idir.
Y ukarı daki ş emadan da görü l ec eğ i ü z ere b u metotl ar ü retec eğ i ü rü nü n soyut sı nı f ı na
dönmektedir. Y ani ü retim sonuc unda geri dönen gerçek ü rü n nesnesi değ il dir. Ş emada
Cl ient ol arak gösteril en sı nı f ı n yapı sı ise ş u ş ekil dedir : Cl ient sı nı f ı yapı c ı metoduna b ir
soyut f ab rika nesnesi al ı r. V e soyut f ab rikanı n ü retimden soruml u metotl arı nı kul l anarak
soyut ü rü nl eri ü retir. D ikkat ederseniz Cl ient sı nı f ı h angi gerçek f ab rikanı n ü retim
yaptı ğ ı ndan ve ü retil en ü rü nü n gerçek öz el l ikl erinden h ab eri yoktur. Cl ient sadec e soyut
f ab rikanı n içerdiğ i temel öz el l ikl erin f arkı ndadı r. Bunu ş emadaki kal ı n ve kesikl i okl ardan
görmek mü mkü ndü r.
Y ukarı daki yapı sal örneğ i verdikten sonra gerçek b ir örnek il e b u deseni nası l
gerçekl eş tireb il ec eğ imiz i inc el eyel im. Bu örnekte arab a kasası ve arab a l astiğ i ü reten
f arkl ı iki f irmanı n ü retimi model l enmektedir.
Ö nc e örneğ i kab ac a inc el eyin, ardı ndan açı kl amal arı okuyun.
using System;
c l ass U retimBandi
{
pub l ic static void M ain()
{
SoyutA rab aF ab rikasi f ab rika1 = new M erc edesF ab rikasi();
F ab rikaO tomasyon f o1 = new F ab rikaO tomasyon( f ab rika1 );
f o1.L astikTak();
Y ukarı daki örnekte SoyutA rab aF ab rikasi sı nf ı iki metot içermektedir. Bu metotl ar
SoyutA rab aF ab rikasi sı nı f ı ndan tü reyec ek sı nı f l arı n uygul aması gereken metotl ardı r.
Ç ü nkü metotl ar ab strac t ol arak b il diril miş tir. Bu metotl ar gerçek f ab rika sı nı f l arı nı n arab a
kasası ve arab a l astiğ i ü retmesi gerektiğ inin b el irtisidir. Z ira görü l dü ğ ü ü z ere
SoyutA rab aF ab rikasi sı nı f ı ndan tü reyen M erc edesF ab rikasi ve F ordF ab rikasi kendil erine
h as l astikl eri ve kasal arı ü retmek için soyut f ab rika sı nı f ı nı n metotl arı nı kul l anmaktadı r.
Bu metotl ar geri dönü ş değ eri ol arak soyut ü rü n sı nı f l arı nı temsil eden sı nı f l arı
döndü rmektedirl er. Ö rneğ in K asaU ret() metodu h er b ir f ab rika için f arkl ı ü rü n ü retmesine
rağ men h er b ir ü rü n SoyutA rab aK asasi sı nı f ı ndaki metotl arı uygul adı ğ ı için gerçek ü rü nl er
b irb irl eyil e il iş kil i h al e gel ir. M erc edes f ab rikası K asaU ret() metodu il e M erc edesE 200
ü rü nü nü döndü rmesine rağ men F ord f ab rikası aynı metotl a F ordF oc us ü rü nü nü
döndü rmektedir. A nc ak h er iki f ab rikanı n da ü rettiğ i ü rü n SoyutA rab aK asasi sı nı f ı ndan
tü rediğ i için h erh angi b ir çel iş ki ol mamaktadı r.
SoyutA rab aK asasi sı nı f ı ndaki L astikTak() sı nı f ı f ab rikadan ü retil en ü rü nl erin b irb irl eriyl e
karı ş tı rı l madan esnek b ir ş ekil de nası l il iş kil endiril diğ ini gösteril mektedir. Bu metot
parametre ol arak gerçek l astik ü rü nü yerine soyut l astik ü rü nü al ı r. D ol ayı sı yl a h erh angi
b ir f ab rikadan ü retil en l astik ü rü nü b u metoda parametre ol arak geçiril eb il ir.
Son ol arak tasarl adı ğ ı mı z b ü tü n b u sı nı f l arı test edec ek U retimBandı sı nı f ı nı inc el eyel im.
Bu sı nı f içerisinde ü rü nl eri ü retil ec ek f ab rikanı n soyut nesnesi ol uş turul ur ve
F ab rikaO tomasyonu nesnesine parametre ol arak veril ir. SoyutF ab rika nesnesini al an
F ab rikaO tomasyonu b u nesnenin standart ü retimden soruml u metotl arı nı kul l anarak kasa
ve l astik ü retir. A rdı ndan SoyutA rab aK asasi sı nı f ı nı n L astikTak() metodunu kul l anarak
kasa ve l astik ü rü nl erini il iş kil endirir.
Bu örnekte kul l anı l an soyut sı nı f l arı n yerine arayü z l eride kul l anmak mü mkü ndü r. D ah a
önc e de dediğ im gib i siz uygul amanı z ı n durumuna göre h erh angi b irini seçeb il irsiniz .
D iğ er b ir "Creational " deseni ol an "Buil der" desenini anl atac ağ ı m yaz ı da görü ş mek
ü z ere...
C# ile . N E T O rt amınd a T h read ing' e G iriş
İ nsan vü c udunda aynı anda b ir çok iş b irl ikte yapı l ı r, mesel a kal b imiz tü m vü c uda kan
pompal arken midemiz yediğ imiz b ir ş eyi sindirmek için gerekl i enz iml eri sal gı l ar:
Bil gisayarl arı n z aman içinde çok h ı z l ı gel iş mel eri sonuc unda insanl ar b u al etl erden dah a
f az l a verim ve h ı z b ekl edil er ve ortaya atı l an b irçok çöz ü mden b iri de iş parçac ı kl arı nı
(th reads) kul l anmak ol muş tur.
İ ş parçac ı kl arı il k def a A da programl ama dil inde A merikan ordusunun stratej ik yaz ı l ı ml arı
için kul l anı l mı ş tı r. D ah a sonra C+ + dil inde iş parçac ı kl arı nı kul l anmak için kü tü ph anel er
gel iş tiril miş tir. Bu kü tü ph anel er sayesinde z aman içinde C+ + dil inde yaz ı l mı ş
programl arda iş parçac ı kl arı nı kul l anmak b ir takı m f aydal ar sağ l amı ş tı r.
İ ş parçac ı kl arı nı .N E T ortamı nda nası l kul l anac ağ ı mı z ı öğ renmeden önc e iş in teorik
temel l erini b il mek gerekir. A yrı c a iş parçac ı kl arı nı ne z aman ve nası l programl arı mı z a
katmayı da öğ renmek dah a sağ l ı kl ı programl ar gel iş tirmeye yardı mc ı ol ac aktı r.
M akal emiz in kal an kı smı nı M SD N kü tü ph anesindeki iş parçac ı kl arı konusunun b aş
kı sı ml arı ol uş turac aktı r.
İ ş l etim sisteml erinde aynı anda b irden f az l a programı n çal ı ş ması gü nü mü z de mü mkü n
h al e gel miş tir. A sl ı nda b ir iş l emc ide aynı anda sadec e b ir iş l em gerçekl eş eb il ir. F akat
b aş l ayan b ir iş l emin tamamı nı b itirmeden b aş ka b ir iş l emin yapı l ması il e mul titasking
b aş arı l ab al ir. M esel a b ir taraf tan M s W ord diğ er taraf tan M s E x pl orer açı k ol ab il ir.
İ ş l eml erin b ir al t parçası ol an iş parçaçı kl arı (th readl er) aynı z amanda b il gisayar
ortamı nda yapı l ac ak ol an en kü çü k görev b iriml eridir denil eb il ir. Bir iş l em(proc ess) içinde
b irden f az l a iş parçac ı ğ ı b ul unab il ir. Her b ir iş parçac ı ğ ı için h ata yönetimi(ex pec tion
h andl er), önc el ik çiz el gesi (sc h edul ing priority) ve b ir takı m yapı l ar b ul unur. Bir önc eki
c ü ml ede b ah settiğ imiz yapı l ar iş parçac ı ğ ı h akkı nda iş l etim sisteminin tuttuğ u b il gil erdir.
Bu b il gil er il e iş parçac ı kl arı nı n sorunsuz ol arak çal ı ş tı rı l ması sağ l anı r.
.N E T pl atf ormu iş l eml eri(proc ess) dah a kü çü k b ir b irim ol an a pplic a tio n do ma in' l ere
ayı rı r. A ppl ic ation domain' l er System.A ppD omain sistem al anı ndaki sı nı f l ar taraf ı ndan
iş l enirl er. .N E T' te b ir veya dah a f az l a iş parçac ı ğ ı b irden f arkl ı appl ic ation domain için
çal ı ş ab il ir. Her ne kadar b ir appl ic ation domain sadec e b ir tane iş parçac ı ğ ı il e çal ı ş maya
b aş l asa da z aman içinde b irden f az l a appl ic ation domain ve iş parçac ı ğ ı aynı appl ic ation
domain için çal ı ş ab il ir. A yrı c a tek b ir iş parçac ı ğ ı b irden f arkl ı appl ic ation domain' l er
arası nda gidip gel eb il ir.
İ ş l eml erin iş l emc iyi kul l anma aral ı kl arı iş l etim sistemine ve iş l emc iye göre değ iş ir.
İ ş l emc iyi kul l anma aral ı kl arı o kadar kü çü k ve iş l emc il er o kadar h ı z l ı dı r ki b ir çok iş
parçac ı ğ ı nı n çal ı ş tı rı l dı ğ ı b ir iş l etim sisteminde aynı anda b irden f arz l a programı n çal ı ş tı ğ ı
h issi kul l anı c ı da uyanı r.
N e Z aman B ird en F az la İ ş P arç ac ığı ile Çalışmalı?
E ğ er gel iş tirdiğ imiz programl ar kul l anı c ı il e sı k sı k etkil eş ime geçiyor ve kul l anı c ı l ara
sistemin c evab ı nı n çok h ı z l ı ol ması gerekiyorsa iş parçac ı kl arı nı kul l anmak yerinde
ol ac aktı r. E ğ er siz in programı nı z da sadec e b ir iş parçac ı ğ ı yeterl i ol uyorsa ve .N E T
remoting veye X M L W eb servisl eri kul l anı yorsanı z yine iş parçac ı kl arı ndan f aydal anmak
suretiyl e programı nı z ı n kul l anı c ı ya verec eğ i tepkiyi dah a kı sa sü rede ü reteb il irsiniz . Son
ol arak yoğ un b ir b içimde I /O iş l eml eri gerektiren programl arda iş parçac ı kl arı ndan
f aydal anmak uygun ol ac aktı r.
Bir programda h em iş parçac ı kl arı kul l anı l ı r h em de b u program b irden f az l a iş l emc isi ol an
b ir makinada çal ı ş tı rı l ı rsa kul l anı c ı l arı n programdan memnuniyetl erinde çok il eri seviyede
artı ş l ar ol ur. G el iş tirdiğ imiz b ir programda b irden f az l a iş parçası kul l anmakl a:
M ü mkü n ol duğ unc a az sayı da iş parçac ı ğ ı nı aynı anda kul l anmak tavsiye edil ir. Bu ş ekil de
iş l etim sisteminin dah a az kaynağ ı nı kul l anı r ve perf ormansı artı rab il iriz . A yrı c a iş
parçac ı kl arı için h em ek kaynak gereksimi h em de programda çakı ş ma ih timal l eri vardı r.
İ ş parçac ı kl arı için gerekl i ek kaynakl ar ş unl ardı r:
• İ ş l etim sisteml eri iş l eml er, A ppD omain nesnel eri ve iş parçac ı kl arı h akkı nda
b il gil eri tutmak z ordundadı rl ar. Y ani, iş l eml er, A ppD omain nesnel eri ve iş
parçı kl arı nı n ol uş turul ması nda kul l anı l ab il ir h af ı z a sı nı rl ayı c ı b ir etken ol ab il ir.
• Ç ok sayı da iş parçac ı kl arı il e çal ı ş ma duruml arı nda, iş l emc i iş parçac ı kl arı nı n
gerektirdiğ i iş l eri yapmaktan çok iş parçac ı kl arı arası nda geçiş için meş gul ol ur.
A yrı c a b ir iş l emin içinde çok sayı da iş parçac ı ğ ı varsa b u iş parçac ı kl arı nı n
iş l enmesi için dah a az sayı da ş ans doğ ac aktı r.
• Birden f az l a iş parçac ı ğ ı aynı anda iş l emye çal ı ş mak çok karmaş ı k b ir durum
yaratı r ve b ir çok h ataya seb ep ol ab il ir.
• Bir iş parçağ ı nı nı n iş i b ittiğ inde onu yok etmek için yine çok karmaş ı k kodl ar
yaz mak ve sonuçl arı nı tah min etmek gerekir.
K aynakl arı payl aş mak ve b irden f az l a iş l em için aynı anda kul l anmaya çal ı ş mak sistemde
çakı ş mal ara yol açab il ir. M uh temel çakı ş mal arı n önü ne geçmek için senkroniz asyon
yapmak veya payl aş ı l an kaynakl ara eriş imi kontrol al tı na al mak gerekir. A ynı veya f arkl ı
A ppD omain' l erde eriş iml eri senkroniz e etmede b aş arı sı z l ı k durumumda dea dlo c k (aynı
anda iki iş parçac ı ğ ı nı n b oş durdukl arı h al de b irb irl erini sonsuz a kadar b ekl eml eri)
prob l emi ortaya çı kab il ir. F akat sistemin sağ l adı ğ ı senkroniz e nesnel eri il e aynı kaynağ ı n
f arkl ı f arkl ı iş parçac ı kl arı taraf ı ndan kul l anı l ması koordine edil eb il ir. Tab iki iş
parçac ı kl arı nı n sayı sı nı az al tmak da kaynakl arı n senkroniz e ol arak kul l anı l ması nı
kol ayl aş tı rı r.
İ l eriki yaz ı l arda .N E T ortamı nda C# il e iş parçac ı kl arı nı n kul l anı ml arı nı dah a detayl ı ol arak
inc el eyec eğ iz ve b ir çok örnek kod ü z erinde durac ağ ı z .
C# ile İ lgili S ık S oru lan S oru lar ( S S S )
Bu yaz ı da C# dil i il gil i sı k sorul an sorul ara yanı t veril miş tir.
C - 2 : C# c ase b l okl arı için "ex pl ic it f al l th rough " öz el l iğ ini destekl emez . Buna göre
aş ağ ı daki kod parçası geçersiz dir ve C# ' ta derl enemez .
sw itc h (x )
{
c ase 0:
// b ir ş eyl er yap
c ase 1:
// 0 c ase' indekine ek ol arak b irş eyl er dah a yap
def aul t:
// 0 ve 1 duruml arı na ek ol arak b irş eyl er dah a yap
b reak;
}
Y ukarı daki kodun verdiğ i etkiyi C# il e aş ağ ı daki gib i gerçekl eş tirreb il iriz . (Case' l er
arası ndaki akı ş ı n açı kça b el irtil diğ ine dikkat edin! )
c l ass Test
{
pub l ic static void M ain()
{
int x = 3;
sw itc h (x )
{
c ase 0:
// b ir ş eyl er yap
goto c ase 1;
c ase 1:
// 0 c ase' indekine ek ol arak b irş eyl er dah a yap
goto def aul t;
def aul t:
// 0 ve 1 duruml arı na ek ol arak b irş eyl er dah a yap
b reak;
}
}
}
S - 3 : c onst ve static readonl y arası ndaki f arkl ar nel erdir?
static readonl y ü ye el emanl arı nı n değ iş tiril eb il mesini b iraz açac ak ol ursak, static readonl y
ü yeyi içeren sı nı f b u ü yeyi aş ağ ı daki duruml arda değ iş tireb il ir :
C - 4 : M etotl arl a b irl ikte Conditional nitel iğ ini kul l anarak gerçekl eyeb il iriz .
c l ass D eb ug
{
[c onditional ("TR A CE ")]
pub l ic void Trac e(string s)
{
Consol e.W riteL ine(s);
}
}
Y ukarı daki örnekte D eb ug.Trac e() metodu anc ak ve anc ak TR A CE öniş l emc i seöb ol ü
tanı ml anmı ş sa çağ rı l ac aktı r. K omut satı rı ndan ön iş l emc i semb ol l erini tanı ml amak için /D
parametresi kul l anı l ab il ir. Conditional nitel iğ i il e b il diril en metotl arı n geri dönü ş değ erinin
void ol ma z orunl ul uğ u vardı r.
C - 5 : D erl eyic inin /target:l ib rary argü manı nı kul l anmanı z gerekir.
S - 6 : c h ec ked isiml i b ir değ iş ken tanı ml adı ğ ı mda neden derl eme z amanı nda "syntax
error" h atası al ı yorum?
c l ass B
{
B(int i)
{ }
}
c l ass C : B
{
C() : b ase(5) //
B(5) i çağ ı rı r.
{ }
C(int i) : th is() //
C() yi çağ ı rı r.
{ }
ifade i s tü r
namespac e F oo
{
enum Col ors
{
BL U E ,
G R E E N
}
c l ass Bar
{
Col ors c ol or;
Bar() { c ol or = Col ors.G R E E N ;}
C - 10 : Bir metodun geri dönü ş değ erini yaz madan b il dirirseniz derl eyic i onu sanki b ir
yapı c ı metot b il diriyormuş sunuz gib i davranı r. O h al de geri dönü ş değ eri ol mayan b ir
metot b il dirimi için void anah tar söz c ü ğ ü nü kul l anı n. A ş ağ ı da b u iki kul l anı ma örnek
veril miş tir.
S - 11 : Her b irinde f arkl ı M ain() metodu ol an b irden f az l a kaynak kod dosyam var:
derl eme sı rası nda h angi M ain() metodunun kul l anı l ac ağ ı nı nası l b il direb il irim?
C - 11 : P rogramı nı z ı n giriş noktası (metodu) M ain isiml i h erh angi b ir parametre al mayan
yada string tü rü nden b ir diz i parametresi al an geri dönü ş değ eri void yada int ol an static
b ir metot ol mal ı dı r.
C# derl eyic isi programı nı z da b irden f az l a M ain metodu b il dirmeniz e iz in verir f akat h angi
M ain() metodunu kul l anac ağ ı nı z ı derl eme z amanı nda b il dirmeniz gerekir. M ain()
metodunu b el irtirken M ain metodunun b ul unduğ u sı nı f ı n tam yol unu b el irtmeniz gerekir.
K omut satı rı ndan kul l anı l an /main argü manı b u iş e yarar.(Ö rn : c sc /main:M ainSı nı f ı *.c s)
S - 12 : Consol e.W riteL ine() metodu b ir string içinde N U L L karakteri gördü ğ ü nde ekrana
yaz ma iş l emini durdururmu?
C - 13 : Bü tü n temsil c il er varsayı l an ol arak mul tic ast ol arak b il diril ir. D ol ayı sı yl a V isual
J+ + taki gib i ayrı c a mul tic ast anah tar söz c ü ğ ü yoktur.
Bu, static ve instanc e metotl arı nı n aynı sentaks il e çağ rı l ab il ec eğ ini göstermektedir.
S - 15 : Y aptı ğ ı m w indow s penc ere uygul aması nı h er çal ı ş tı rdı ğ ı mda neden pop up
ş ekl inde konsol ekranı gösteril iyor.
C - 15 : P roj e ayarl arı nda "Target Type" öz el l iğ inin Consol e A ppl ic ation yerine W indow s
A ppl ic ation ol duğ una emin ol un. E ğ er komut satı rı derl eyic isini kul l anı yorsanı z /target:ex e
argü manı yerine /target:w inex e argü manı nı kul l anı n.
S - 16 : G ereksiz çöp topl ayı sı nı c ı (G arb age Col l ec tion) z orl a çağ ı rmanı n b ir yol u var mı ?
C - 16 : E vet; Bü tü n ref erasnl arı nul l değ er atayı n ve System.G C.Col l ec t() statik
metodunu çağ ı rı n.
Y ı kı l ması (destruc t) gereken nesnel eriniz var ve G C nin b unu yapmadı ğ ı nı dü ş ü nü yorsanı z
nesnel eri nul l değ ere atayarak onl arı n sonl andı rı c ı metotl arı nı n çağ rı l ması nı sağ l ayı n ver
ardı ndan System.G C.R unF inal iz ers() metodunu çağ ı rı n
S - 18 : C# derl eyic isine b az ı dl l l eri ref erans vermememe rağ men neden kendisi
ref erans verir.
C - 18 : "c sc .rsp" dosyası nda b ul unan b ü tü n assemb l y l ere C# derl eyic isi otomatik ol arak
ref erans verir. Bu dosyanı n içerdiğ i assemb l y l eri /r argü manı il e b el irtmek z orunda
değ il siniz . c sc .rsp dosyası nı n kul l anı mı nı komut satı rı ndan /noc onf ig argü manı nı b el irterek
engel l eyeb il irsiniz .
Y ukarı daki örnek kod yönetil meyen(unmanaged) D L L deki doğ al (native) b ir f onksiyonu
C# ta b il dirmek için minumum gereksiniml eri gösterir.C.M essageBox A () metodu static ve
ex tern söz c ü kl eri il e b il diril miş , D l l I mport nitel iğ i il e b u metodun user32.dl l dosyası nda
M essageBox A ismiyl e uygul anmı ş ol duğ u b el irtil mektedir.
S - 20 : CO M + runtime' ı nda tanı ml anan b ir arayü z ü uygul amaya çal ı ş ı yorum anc ak
"pub l ic * O b j ec t G etO b j ec t{...}" çal ı ş mı yor gib i. N e yapmal ı yı m?
C - 21 : Hayı r, f akat b ir tü r ş ab l on ol an generic s yapı l arı nı n C# dil ine ekl enil mesi
pl anl anmaktadı r. Bu tü rl er sentaks ol arak ş ab l onl ara b enz erl er f akat derl eme z amanı
yerine çal ı ş ma z amanı nda ol uş turul url ar. Bu tü rl erl e il gil i detayl ı b il gi için tı kl ayı n.
C - 22 : C# öz el l ikl eri destekl er anc ak I tem öz el l iğ inin sı nı f l ar için öz el anl amı vardı r.
I tem öz el l iğ i asl ı nda varsayı l an indeskl eyic i ol arak yer al ı r. Bu imkanı C# ta el de etmek
için I tem söz c ü ğ ü nü atmak yeterl idir. A ş ağ ı da örnek program gösteril miş tir.
using System;
using System.Col l ec tions;
c l ass Test
{
pub l ic static void M ain()
{
A rrayL ist al = new A rrayL ist();
al .A dd( new Test() );
al .A dd( new Test() );
Consol e.W riteL ine("F irst E l ement is {0}", al [0]);
}
}
W riteL ine metodunda .I tems[0] ' ı n kul l anı l madı ğ ı na dikkat edin.
int i;
f oo(out i);
f oo metodu aş ağ ı daki gib i b il diril miş tir.
[return-type] f oo(out int o) { }
S - 24 : C+ + ' taki ref eransl ara b enz er b ir yapı C# ' ta varmı dı r? (Ö r : void f oo(int &x ) gib i
)
c l ass Test
{
pub l ic void f oo(ref
int i)
{
i = 1;
}
N ot: M etot çağ rı mı nda da ref söz c ü ğ ü nü n kul l anı l dı ğ ı na dikkat edin!
String s1;
String s2;
s1 = "Hel l o";
M yM eth od(ref s1, out s2);
Consol e.W riteL ine(s1);
Consol e.W riteL ine(s2);
N ot : Hem metot çağ rı mı h emde metot b il dirimi sı rası nda ref söz c ü ğ ü nü n kul l anı l dı ğ ı na
dikkat edin.
C - 26 : C# ta sonl andı rı c ı metotl ar vardı r ve kul l anı mı aş ağ ı daki gib idir. (Bu sonl andı rı c ı
metotl ar C+ + taki yı kı c ı metotl ara b enz er, tek f arkı çağ rı l ac ağ ı garanti al tı na
al ı nmamı ş tı r.)
c l ass C
{
~ C()
{
// your c ode
}
S - 27 : D erl eme sı rası nda neden "CS5001: does not h ave an entry point def ined -
tanı ml anmı ş giriş noktası yok- " h atası nı al ı yorum?
C - 27 : Bu h ata en çok M ain metodunu main ş ekl inde yaz dı ğ ı nı z da karş ı nı z a çı kar. G iriş
noktası ol an b u M ain metodunun b il dirimi aş ağ ı daki gib i ol mal ı dı r :
c l ass test
{
static void M ain(string[] args) {}
}
S - 28 : V isual J+ + ta "sync h roniz ed" ol arak b il dril en metotl arı C# dil ine nası l taş ı rı m?
C - 28 : O rj inal V isual J+ + kodu:
c l ass C
{
pub l ic void R un()
{
l oc k(th is)
{
// f unc tion b ody
}
}
S - 29 : K anal (th read) senkroniz asyonu(O b j ec t.W ait, N otif t ve Critic al Sec tion) C# ' ta nası l
sağ l anı r?
l oc k(ob j )
{
// c ode
}
try
{
Critic al Sec tion.E nter(ob j );
// c ode
}
f inal l y
{
Critic al Sec tion.E x it(ob j );
}
C - 30 : A ş ağ ı da M yCl ass adl ı sı nı f ı n statik yapı l andı rı c ı sı nı n b il dirimi gösteril miş tir.
c l ass M yCl ass
{
static M yCl ass()
{
// initial iz e static variab l es h ere
}
S - 31 : Bir öz el l iğ in get ve set b l okl arı nı f arkl ı eriş im b el irl eyic il eri il e b il dirmek
mü mkü nmü dü r?
C - 31 : Hayı r, b ir öz el l iğ in b el irtil en eriş im b el irl eyic isi aynı z amanda h em get h em de set
b l okl arı nı nn eriş im b el irl eyic isidir. F akat yapmak istediğ iniz i muh temel en sadec e get
b l oğ u ol an yani readonl y ol arak b il dirip set b l oğ unu private yada internal ol an b ir metot
yapac ak ş ekil de gerçekl eş tireb il irsiniz .
S - 32 : Tek b ir assemb l y de çokl u dil desteğ ini nası l sağ l ayab il irim?
using System;
c l ass Cl ass1
{
private string[] M yF iel d;
S - 35 : CO M nesnel erine eriş mek için opsiyonel ol an parametrel eri nası l simul e
edeb il irim?
S - 36 : C+ + ' taki varsayı l an metot argü manl arı nı n b ir karş ı l ı ğ ı C# ' ta var mı ?
C - 36 : V arsayı l an argü man desteğ i yoktur anc ak aynı etkiyi metot yü kl eme il e rah atl ı kl a
yapab il irsiniz .
Bu prob l em için metot yü kl emeyi terc ih etmemiz in seb eb i il eriki z amanl arda kaynak kodu
yeniden derl emeden varsayı l an argü manı değ iş tirme imkanı vermesidir. C+ + taki
varsayı l an argü manl ar derş enmiş kodun içine gömü l dü ğ ü için sonradan b u argü manı
kaynak kodu derl emeden değ iş tirmek mü mkü n değ il dir.
S - 36 : İ çiçe geçmiş b l okl arda yada döngü l erde h angi b l oğ un sonl andı rdı l dı ğ ı nı b el irtmek
için kol ay b ir yol varmı dı r?
C - 36 : Bu iş in en kol ay yol u goto atl ama deyimini aş ağ ı daki gib i kul l anmaktı r.
using System;
c l ass BreakE x ampl e
{
pub l ic static void M ain(String[] args)
{
f or(int i=0; i< 3; i+ + )
{
Consol e.W riteL ine("P ass {0}: ", i);
f or( int j =0 ; j < 100 ; j + + )
{
if ( j == 10) goto done;
Consol e.W riteL ine("{0} ", j );
}
Consol e.W riteL ine("Th is w il l not print");
}
done:
Consol e.W riteL ine("L oops c ompl ete.");
}
}
C - 37 : G C mekaniz ması gerçek anl amda deterministik yapı da değ il dir. Y ani ne z aman
gereksiz nesnel erin topl anac ağ ı kesin ol arak b el il enmemiş tir. Bu yü z den kritik kaynakl ara
sah ip ol an nesnel eri tasarl amak için I D isposab l e arayü z ü nü uygul amı ş sı nı f l ar
tasarl amakta f ayda vardı r. A ş ağ ı daki tasarı m deseni sı nı f için ayrı l an kaynağ ı n b l ok
sonunda b ı rakı l ac ağ ı nı b il dirmektedir.
using(F il eStream myF il e = F il e.O pen(@ "c :\temp\test.tx t", F il eM ode.O pen))
{
int f il eO f f set = 0;
A kı ş , using b l oğ unun sonuna gel diğ inde myF il e nesnesi ü z erinden D ispose() metodu
çağ rı l ac aktı r. N esnel eri b u ş ekil de using il e kul l anab il mek için il gil i sı nı f ı n I D isposab l e
arayü z ü nü uygul aması gerektiğ ini unutmayı n.
S - 38 : C# ' ta metotl ar için değ iş ken sayı da argü man (vararg) desteğ i varmı dı r?
C - 38 : params anah tar söz c ü ğ ü b ir metodun değ iş ken sayı da parametre al ab il ec eğ ini
b el irtir. M etot b il diriminde params anah tar söz c ü ğ ü nden sonra h erh angi b ir metot
parametresi b il diril emez . V e b ir metot için sadec e b ir tane params anah tar söz c ü ğ ü nü n
kul l anı mı na iz in verimiş tir. A ş ağ ı da params' ı n kul l anı mı a b ir örnek veril miş tir.
using System;
Ç ı ktı
1
2
3
1
a
test
10
11
12
S - 39 : C# ' ta string tü rü nden b ir değ iş keni int tü rü ne nası l dönü ş tü reb il irim?
using System;
c l ass StringToI nt
{
pub l ic static void M ain()
{
String s = "105";
int x =
Convert.ToI nt32(s);
Consol e.W riteL ine(x );
}
}
S - 40 : C# il e yaz ı l mı ş uygul amal ardan çı kmak için ex it() gib i b ir f onksiyon varmı dı r?
C - 40 : E vet, uygul amadan çı kmak için System.E nvironment.E x it(int ex itCode)
metodunu yada uygul amanı z b ir w indow s uygul aması ise A pl ic ation.E x it() metotl arı nı
kul l anab il irsiniz .
using System;
c l ass X {}
N ot : I D E taraf ı ndan yaratı l an proj el erde b u nitel ik b il diriml eri A ssemb l yI nf o.c s
dosyası nda yapı l mı ş tı r.
S - 42 : C# il e yaz ı l mı ş kodu kl asik CO M istemc il erinin kul l anı mı na sunmak için nası l
kayı t(register) etmel iyim?
C - 42 : regasm arac ı nı kul l anarak eğ er gerekl iyse type l ib rary l eri ol uş turun. Sı nı f
w indow s registery ye kayı t edil dikten sonra b u sı nı f a CO M istemc il eri taraf ı ndan sanki b ir
CO M b il eş eniymiş gib i eriş il eb il ir.
S - 43 : Birden f az l a derl enec ek kaynak kod aynı anda derl endiğ inde, çal ı ş tı rı l ab il ir
dosyanı n ismi nası l b el irl eniyor?
E ğ er gerçekten string değ iş kenl erinin ref eransl arı nı karş ı l aş tı rmak istersek aş ağ ı daki kodu
kul l anab il iriz .
if ((ob j ec t) str1 == (ob j ec t) str2) { ... }
A ş ağ ı da string değ iş kenl erinin nası l çal ı ş tı ğ ı na b ir örnek veril miş tir.
using System;
pub l ic c l ass StringTest
{
pub l ic static void M ain(string[] args)
{
O b j ec t nul l O b j = nul l ;
O b j ec t real O b j = new StringTest();
int i = 10;
Consol e.W riteL ine("{0} == {1} ? {2}", str1, str2, str1 == str2 );
Consol e.W riteL ine("{0} == {1} ? {2}", str2, str3, str2 == str3 );
}
}
Ç ı ktı
N ul l O b j ec t is []
R eal O b j ec t is [StringTest]
i is [10]
f oo == b ar ? F al se
b ar == b ar ? True
S - 45 : C+ + ' taki typedef komutunun yaptı ğ ı gib i f arkl ı tü rl er için takma isiml eri
kul l anı l ab il irmi?
C - 45 : Tam ol arak değ il ama b ir dosyada using deyimini aş ağ ı daki gib i kul l anarak
h erh angi b ir tü re takma isim vereb il irsiniz .
using System;
using I nteger =
System.I nt32; // takma
isimi
using deyiminin kul l anı mı h akkı nda ayrı ntı l ı b il gi için C# standartl arı nı inc el yin.
S - 46 : C# ' ta sı nı f il e yapı arası ndaki f arkl ar nel erdir?
C - 46 : Sı nı f l ar ve yapı l ar arası ndaki f arkl arı n l istesi ol dukça f az l adı r. Y apı l ar sı nı f l ar gib i
arayü z l eri uygul ayab il ir ve aynı ü ye el emanl ara sah ip ol ab il irl er. Y apı l ar, sı nı f l ardan b ir
çok öneml i noktada ayrı l ı r; yapı l ar değ er tipl eri sı nı f l ar ise ref erans tipl eridir ve tü retme
yapı l ar için destekl enmez . Y apı l ar stac k b el l ek b öl gesinde sakl anı r. D ikkatl i programc ı l ar
b az en yapı l arı kul l anarak uygul amanı n perf ormansı nı artı rab il irl er. M esel a P oint yapı sı için
sı nı f yerine yapı kul l anmak çal ı ş ma z amanı nda tah sis edil en b el l ek açı sı ndan ol dukça
f aydal ı dı r.
c h ar c = ' f ' ;
System.Consol e.W riteL ine((int)c );
S - 48 : V ersiyonl ama b akı ş açı sı yl a arayü z tü retmenin sı nı f tü retmeye karş ı getiril eri
nel erdir?
Sı nı f l arda f arkl ı versiyonl ara yeni ü ye el emanl ar örneğ in yeni metot ekl emeniz
mü mkü ndü r. Bu metot ab strac t ol madı ğ ı sü rec e yeni tü retil en sı nı f l ar b u metodun
f onksiyonal itesine sah ip ol ac aktı r. A rayü z l er uygul anmı ş kodl arı n tü retil mesini
destekl emediğ i için b u durum arayü z l er için geçerl i değ il dir. Bir arayü z e yeni b ir metot
ekl emek sı nı f l ara yeni b ir ab strac t metot gib idir. Bu arayü z ü uygul ayan b ir sı nı f b u
metodu aynen uygul ayı p kendine göre anl aml andı rmal ı dı r.
S - 49 : C# koduna inl ine assemb l y yada I L kodu yaz mak mü mkü nmü dü r?
C - 49 : Hayı r.
S - 50 : Bir metodu yada h erh angi b ir ü ye el emanı nı n kul l anı mı nı sadec e b el irl i b ir isim
al anı için sı nı rl ayab il irmiyiz ?
C - 50 : İ sim al anl arı için b ir kı sı l ama yapı l amaz çü nkü isim al anl arı koruma amaçl ı ol arak
kul l anı l mamaktadı r anc ak internal eriş im b el irl eyic isi il e b ir tü rü n sadec e il gil i aseemb l y
dosyası içinde kul l anı l ab il ec ek durumuna getireb il iriz .
S - 51 : try b l oğ u içerisinde return il e metodu sonl andı rı sam f inal l y b l oğ undaki kodl ar
çal ı ş tı rı l ı r mı ?
C - 51 : E vet, f inal l y b l oğ undaki kodl ar siz return il e metodu sonl andı rsanı z da try
b l oğ unun sonuna gel seniz de h er z aman çal ı ş ac aktı r. Ö rneğ in :
using System;
c l ass main
{
pub l ic static void
M ain()
{
try
{
programı nda h em "I n try b l oc k" h emde "I n F inal l y b l oc k" yaz ı s ekrana yaz dı rı l ac aktı r.
P erf ormans açı sı ndan return söz c ü ğ ü nü try b l oğ unda yada f inal l y b l oğ undan sonra
kul l anmanı n b ir f arkı yoktur. D erl eyic i yukarı daki durumda return if adesinin sanki f inal l y
b l oğ unun dı ş ı ndaymı ş gib i davranı r. E ğ er yukarı da ol duğ u gib i return deyimi h erh angi b ir
if ade il e kul l anı l mı yorsa h er iki durumdada I L ol arak ü retil en kodl ar aynı dı r. F akat eğ er
return deyimi b ir if ade il e kul l anı l ı yorsa try b l oğ undaki return if adesinde ekstradan store
ve l oad deyiml erinin I L de ol ac ağ ı açı ktı r.
C - 52 : E vet destekl iyor, aş ağ ı da b u b l okl arı n kul l anı mı na b ir örnek veril miş tir.
using System;
pub l ic c l ass TryTest
{
static void M ain()
{
try
{
Consol e.W riteL ine("I n Try b l oc k");
th row new A rgumentE x c eption();
}
c atc h (A rgumentE x c eption n1)
{
Consol e.W riteL ine("Catc h Bl oc k");
}
f inal l y
{
Consol e.W riteL ine("F inal l y Bl oc k");
}
}
}
Ç ı ktı
I n Try Bl oc k
Catc h Bl oc k
F inal l y Bl oc k
C - 53 : Hayı r. Statik indeksl eyic i tanı mal amaya iz in veril memiş tir.
S - 54 : D erl eyic iyi /optimiz e+ argü manı il e çal ı ş tı rdı ğ ı mı z da ne gib i optimiz asyonl ar
yapar.
K ul l anı l mayan l okal değ iş kenl eri atı yoruz . (örnek, h iç okunmayan l okal değ iş kenl er -
kendisine değ er veril miş ol sa b il e-).
Hiç b ir ş ekil de eriş il emyec ek(unreac h ab l e) kodl arı atı yoruz .
try b l oğ u b oş ol an try/c atc h b l okl arı nı kal dı rı yoruz .
try b l oğ u b oş ol an try/f inal l y b l okl arı nı kal dı rı yoruz .(normal koda çevrl ir)
f inal l y b l oğ u b oş ol an try/f inal l y b l okl arı nı kal dı rı yoruz .(normal koda çevrl ir)
D al l anmal arda diğ er dal l anmal arı optimiz e ediyoruz . Ö rneğ in
gotoif A , l ab 1
goto l ab 2:
l ab 1:
kodu
gotoif ! A , l ab 2
l ab 1:
koduna dönü ş tü rü l ü r.
W e optimiz e b ranc h es to ret, b ranc h es to nex t instruc tion, b ranc h es to b ranc h es.
D al l anmal arı "ret"' e, "nex t instruc tion" l ara veya diğ er "b ranc h " l ara dönü ş tü rü yoruz .
C - 55 : M ic rosof t.W in32 isim al anı ndaki R egistry ve R egistry sı nı f l arı nı kul l anarak b u
al ana eriş mek mü mkü ndü r. A ş ağ ı daki program b ir registry anah tarı nı okuyup değ erini
yaz dı rmaktadı r.
using System;
using M ic rosof t.W in32;
c l ass regTest
{
pub l ic static void M ain(String[] args)
{
R egistryK ey regK ey;
O b j ec t val ue;
regK ey = R egistry.L oc al M ac h ine;
regK ey =
regK ey.O penSub K ey("HA R D W A R E \\D E SCR I P TI O N \\System\\Central P roc essor\\0");
val ue = regK ey.G etV al ue("V endorI dentif ier");
Consol e.W riteL ine("Th e c entral proc essor of th is mac h ine is: {0}.", val ue);
}
}
S - 56 : C# gl ob al sab itl eri tanı ml amak için # def ine komutunu destekl er mi?
C - 56 : Hayı r. E ğ er C dil indeki aş ağ ı daki koda b enz er b ir kul l anı m el de etmek istiyorsanı z
# def ine A 1
c l ass
M yConstants
{
pub l ic
c onst int A
= 1;
}
Böyl ec e A makrosuna h er eriş mek istediğ iniz de M yConstants.A ş ekl inde b ir kul l anı ma
sah ip ol ursunuz .
M yConstants.A ş ekl indeki kul l anı m il e 1 sayı sı nı n kul l anı mı arası nda b ir f ark yoktur. Y ani
aynı kod ü retil ec ektir.
S - 57 : Y eni b ir proses çal ı ş tı rı p b u proesisin sonl anması nı nası l b ekl eyeb il irim?
C - 57 : A ş ağ ı daki kod argü man ol arak veril en çal ı ş tı rı l ab il ir programı çal ı ş tı rı ve çal ı ş an
b u programı n kapatı l ması için b ekl er.
using System;
using System.D iagnostic s;
[O b sol ete]
pub l ic int F oo() {...}
yada
[O b sol ete("Bu mesaj metodun neden O b sol ete ol duğ unu açı kl ar.")]
pub l ic int F oo() {...}
S - 59: using deyimini kaynak koduma ekl ememe rağ men derl eyic i tanı ml anmamı ş
tü rl erin b ul unduğ unu söyl ü yor. N erede yanl ı ş yapı yorum ac ab a?
C - 6 0 : E vet. örnek :
using System;
using System.Th reading;
c l ass Th readTest
{
pub l ic void runme()
{
Consol e.W riteL ine("R unme Cal l ed");
}
S - 61: O verride edil miş b ir metodun temel sı nı f taki versiyonunu nası l çağ ı rab il irim?
C - 6 1 : A ş ağ ı daki gib i b ase anah tar söz c ü ğ ü nü n kul l anarak çağ ı rab il irsiniz .
C - 6 2 : E vet, .N E T sı nı f kü tü ph anesi programc ı l ara dü z enl i if adel erl e çal ı ş mak için
System.Tex t.R egul arE x pressions isim al anı nda b ir takı m sı nı f l ar sağ l amaktadı r.
S - 63 : C# il e yaz mı ş ol duğ um uygul amayı çal ı ş tı rdı ğ ı mda neden gü venl ik h atası
al ı yorum?
Bu tü r duruml arda genel l ikl e System.Sec urity.Sec urityE x c eption istisnai durumu
meydana gel ir.
Bu tü r sorunl arı n ü stesinden gel mek için c aspol .ex e arac ı yardı mı yl a intranet için gü venl ik
pol ic y niz i c odegroup 1.2 ye ayarl ayab il irsiniz .
S - 64: try-c atc h b l okl arı nda f aal iyet al anı (sc ope) prob l eml erinin ü stesinden nası l
gel irim?
C - 6 4 : try b l oğ u içinde yarattı ğ ı nı z nesneye c atc h b l oğ u içinden eriş emez siniz çü nkü try
b l oğ unun sonunda il gil i nesnenin f aal iyet al anı b itec ektir. Bunun önü ne geçmek için
aş ağ ı daki kod b l oğ u kul l anı l ab il ir.
try b l oğ undan önde değ iş keni nul l değ ere atamakl a derl eyic inin CS016 5 (U se of possib l y
unassigned l oc al variab l e ' c onn' ) h atası nı vermesini engel l emiş ol uruz .
S - 65: .N E T gel iş tirme ortamı nda regsvr32 ve regsvr32 /u komutl arı nı n karş ı l ı ğ ı nedir?
C - 6 5 : R egA sm arac ı nı kul l anab il irsiniz . .N E T SD K içinde b u arac ı n kul l anı mı h akkı nda
detayl ı b il giyi b ul manı z mü mkü ndü r.
S - 65: C# , parametrel eri öz el l ikl eri destekl iyor mu?
C - 6 5 : Hayı r, f akat dil in temel yapı sı nda indeksl eyic i diye ayrı b ir kavram vardı r.
Bir indeksl eyic i b ir tü rü n diz i gib i indek operatörü il e kul l anı l ab il mesini sağ l ar.K ı sac a
öz el l ikl er f iel d b enz eri eriş imi indeskl eyic il er ise diz i b enz eri eriş imi sağ l arl ar.
Ö rnek ol ması açı sı ndan dah a önc e yaz dı ğ ı mı z Stac k sı nı f ı nı dü ş ü nü n. Bu sı nı f ı tasarl ayan
sı nı f ı n ü ye el emanl arı na b ir diz i gib i eriş il mesini isteyeb il ir ve b öyl ec e gereksiz P op ve
P ush çağ rı ml arı yapı l mamı ş ol ur. Y ani stac k b ir b ağ l ı l iste gib i tasarl anmı ş ol ması na
rağ men b ir diz i gib i kul l anı l ab il mektedir.
Bu yazımda sizlere, XML dokümanlarında nasıl sorgulama yapabileceğimizi basit bir örnek ile
anlatmaya çalışacağım.
Dilerseniz hemen uygulamaya geçelim. Yeni bir Asp.Net Web Application açın ve adını XmlQuery
olarak ayarlayın. Ardından projeye yeni bir xml doküman ekleyin ve adını Kayıtlar.Xml olarak
ayarlayın. Xml dokümanın yapısını aşağıdaki gibi düzenleyin.
using System;
using System.Collections;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Web;
using System.Web.SessionState;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.HtmlControls;
using System.Xml;
namespace XmlQuery
XmlNodeList Isimler,Isimler2,Isimler3,Isimler4,Isimler5;
//XmlNodeList türinden değişkenlerimizi tanımlıyoruz.
İ ş dü nyası ndaki değ iş ikl ikl erl e b irl ikte ih tiyaç duyul an yaz ı l ı ml arı n da gel iş mesi ve
değ iş mesi gerekiyor. Böyl e b ir ortamda M ic rsof t kendisinin yaz ı l ı m gel iş tirme araçl arı nı
kul l anan gel iş tiric il ere devrim nitel iğ inde ve iş dü nyası nı n değ iş en ih tiyaçl arı na en kı sa ve
en iyi çöz ü ml erini ü retec ek yaz ı l ı m gel iş tirme araçl arı nı sunmaya devam
ediyor. K uruml arı n gel ec ekteki yaz ı l ı m ih tiyaçl arı nı n pl anl aması nı yaparken onl ara
yardı mc ı ol mak amac ı yl a M ic rosof t b u yol h aritası nı sunmaktadı r. Bu b el ge öz el l ikl e ş u
ü rü nl er ü z erinde yoğ unl aş mı ş tı r:
M ic rosof t yaz ı l ı m gel iş tirme araçl arı h er z aman W indow s pl atf ormunun en son
öz el l ikl erine eriş meyi ve onl arı programl amayı programc ı l ara sunmuş tur. Y ukarı da da
görü l dü ğ ü gib i M ic rosof t b u gel eneğ i sü rdü rmeye devam edec ektir. Bu b ağ l amda
M ic rosof t O f is Sistem 2003’ ü , SQ L Server Y ukon’ u ve W indow s iş l etim sisteml erini
programl amak için b ir çok kol ayl ı kl ara sah ip ol ac ağ ı z b iz yaz ı l ı m gel iş tiric il er ol arak.
V isual Studio 2003’ ü n h emen ardı ndan M ic rosof t, O f is 2003 için V isual Studio araçl arı nı
piyasaya sü rdü . Bu yeni teknol oj i sayesinde .N E T pl atf ormundan yönetil en kod sayesinde
M ic rosof t W ord 2003 ve M ic rosof t E x c el 2003 için kod yaz ı l ab il ec ek. Tı pkı V BA ve CO M
tab anl ı otomasyon proj el eri gib i. M ic rosof t O f is 2003 için V isual Studio A raçl arı b iz
yaz ı l ı mc ı l ara ş u öneml i avantaj l arı da getiriyor:
• T a nı dı k pro g ra mla ma deneyimi: M ic rosof t O f is 2003 için V isual Studio A raçl arı
il e programc ı l ar .N et sı nı f kü tü ph anel erini kul l anab il irl er. Böyl el ikl e b ir çok
z ah metl i iş için çok dah a az satı r kod yaz mak z orunda kal ac ağ ı z . M esal a stringl eri
iş l emede, veri yapı l arı nda, veri tab anı iş l eml erinde ve dosya yönetiminde b ü yü k
kol ayl ı kl ar sağ l ar. D ah ası V isual Studio.N E T il e dah a gü çl ü of is uygul amal arı
gel iş tirme ş ansı na da sah ib iz . M ic rosof t O f is 2003 için V isual Studio A raçl arı il e
W ord ve E x c el dosyal arı nı n nesne model l erine tam ol arak eriş im ve onl arı
programl ama h akkı mı z doğ uyor.
• K o la yla ş tı rı lmı ş pro g ra m k u ru lu mu v e b a k ı mı : M ic rosof t O f is 2003 için V isual
Studio A raçl arı il e yaz dı ğ ı mı z kodl ar D L L ol arak derl eneb il ir. Bu D L L (l er) genel de
ağ ü z erinde payl aş ı mda ol an b ir yerde dururl ar ve E x c el veya W ord açı l dı ğ ı nda
il gil i dl l makinaya indiril ir ve çal ı ş tı rı l ı r. E ğ er kodda b ir değ iş ikl ik ol ursa yeni
derl enmiş kod otomatik ol arak istemc i makineye indiril ir.
• G eliş miş g üv enlik : M ic rosof t O f is 2003 için V isual Studio A raçl arı il e dah a gü venl i
b ir çal ı ş ma ortamı na sah ip ol ac ağ ı z . Hem gü venl ik kod (trusted c ode)
çal ı ş tı rac ağ ı z h em de gü venl iğ in sistem yönetic isi taraf ı ndan denetim al tı na
al ı nması sağ l anac ak.
“ G eliş miş araçlar, tü m kritik z amanlarda, uyg ulamar için çok ö nemli dö nemeçler
olmuş tur A ynı ş ekilde uyg ulamardaki b u kritik dö nemeçler b ilg i iş lem alanında b ir s onraki
aş amayı g etirmiş tir. ”
-B i l l G a t e s
D iğ er göz e çarpan gel iş me ise M ic rosof t taraf ı ndan ü retil en yaz ı l ı m gel iş tirme araçl arı nı n
pl anl ı ol arak b irb iri il e ve sisteml e dah a uyuml u h al e gel mesidir. W h idb ey’ in SQ L Server
Y ukon il e çok iyi entagrasyonu b u uyuml ul uk pl anl arı nı n b aş ı nda gel iyor. Tı pkı W indow s
Server 2003’ ü n dah a sisteminiz e kurul urken .N E T P l af ormunun varsayı l an ol arak
kurul ması gib i. Bu sayede SQ L Server Y ukon CL R ortamı na tam ol arak adapte ol muş h al e
gel ec ektir. Y ukarı da da b el irtil diğ i gib i W h idb ey ortamı nda SQ L Server Y ukon ü z erinde
çal ı ş an sakl ı yordaml ar (stored proc edures) yaz ab il ec eğ iz . Tab i ki W h idb ey il e veri tab anı
iş l eml erimiz i dah a az kod yaz arak gerçekl eş tirme ş ansı mı z vardı r.
Y ukarı daki geniş değ iş ikl ikl erin yanı nnda yenil ikl er b aş l ı c a ş u konul arda ol muş tur:
P ro g ramlama D illeri
.N E T P l atf orumunda yaz ı l ı m gel iş tirmek için 20’ den f az l a değ iş ik dil kul l ab il iriz . Bunun
yanı nda M ic rosof t resmi ol arak .N et pl atf ormunda 4 dil i W h idb ey’ de destekl iyor ol ac ak.
M ic rosof t W h idb ey’ de b u 4 dil için gerekl i tü m araçl arı ve desteğ i en gü venil ir yaz ı l ı m
gel iş tirmek için b iz l ere sunuyor.
V is ual Bas ic
W h idb ey il e gel ec ek ol an V isual Basic versiyonunda programc ı l arı n veriml il iğ ini inanı l maz
seviyede artı rac ak yenil ikl eri görec eğ iz . Tab i b u yenil ikl er V isual Basic programl ama dil i
il e .N E T ortamı nda yaz ı l ı m gel iş tirmek için b iz e sunul an tü m öz el l ikl eri de sonuna kadar
kul l anac ağ ı z . V isual Basic W h idb ey’ deki kritik değ iş ikl ikl er temel ol arak ş unl ardı r:
4 G eliş tirilmiş R A D ha ta a yı k la ma
1. Ç oğ u programda sı k sı k yaz mak z orunda kal dı ğ ı mı z kodl arı n yaz ı mı V isual Basic
W h idb ey’ de en az iki katı h ı z l ı b ir b içimde yaz ı l ab il inec ek. P rogramc ı veriml il iğ in artması
için çal ı ş ma z amanı nesnel erine ve metodl arı na direk ol arak eriş im ve b unl arı getirdiğ i
esnekl ik diğ er b ir gü z el h ab er. K od editörü ndeki gel iş mel er sayesinde sı k sı k yaz ı l an
kodl arı h ı z l ı c a yaz mak için sadec e b el irl i b oş l ukl arı dol durmak yetec ektir. Bu sayede dil in
söz diz imi yerine gel iş tiril en proj enin mantı ğ ı ü z erinde yoğ unl aş ma f ı rsatı b ul ac ağ ı z .
2. Y eni kod editörü sayesinde h er seviyedeki programc ı l arı n h atal arı nı en az a, dah a
tasarı m aş aması nda, indirmek mü mkü n. M ic rosof t W ord’ ta b ul unan gramer ve yaz ı m
h atal arı nı kontrol ve dü z el tmeye yarayan arac ı n b ir b enz eri V isual Basic W h idb ey il e
gel ec ek. V isual Basic derl eyic isi de dah a iyi b ir kod denetimi yaptı ktan sonra programı
derl eyec ek b öyl ec e çal ı ş ma anı nda ortaya çı kması muh temel h atal arı n önü ne geçil ec ek.
3. V isual Basic W h idb ey il e veriye eriş im ve veri ü z erinde değ iş ikl ikl er yapmak çok dah a
kol ay h al e gel iyor. K ol ayl aş tı rı l an iş l erin b aş ı nda, yerel ve uz aktaki veriye, iş l e il gil i veri
taş ı yan nesnel ere ve uz aktaki X M L W eb servisl erine eriş im gel iyor. W h idb ey ayrı c a
sadec e veril er ü z erinde çal ı ş an (datab ound) programl ar gel iş tirmeyi de inanı l maz kol ay
h al e getiriyor. Bu tü r programl arı tek satı r dah i kod yaz madan dah i gel iş tirme imkanı
b ul ac ağ ı z . Ç ok sı k kul l anı l an veriye eriş im senaryol arı için tasarl anan b u yönteml erl e
programl arı veri kaynağ ı ndaki tab l ol arı ve sü tunl arı sü rü kl eyip b ı rakarak programı
gel iş tireb il ec eğ iz .
4. W h idb ey il e gel en h ata ayı kl ama yönteml eri için araçl ar h em dah a gü çl ü h em de V isual
Basic programc ı l arı nı n aş ina ol dukl arı b ir b içimde tasarl andı . E dit ve Continue
komutl arı nı n b aş tan tasarı mı sayesinde programda h ata ayı kl arken tekrar tekrar
programı derl emeyi ve h ata ayı kl amaya devam etmeyi unutun. A yrı c a b reak modundaki
değ iş ikl ikl er il e dah a önc e görü l memiş en gü çl ü ve esnekl ikte h ata ayı kl ama araçl arı na
sah ip ol ac ağ ı z .
5. Son ol arak, il eri seviyedeki V isual Basic programı l arı için dil de b ir çok iyil eş tirmel er
yapı l dı . Bunl ar iş l eş l ere aş ı rı yü kl enme (operator overl oading), iş aretsiz veri tipl eri
(unsigned data types), kod içinde X M L tab anl ı kod dokü mantasyonu yaz ı mı (inl ine X M L -
b ased c ode doumentation) ve kı smi veri tipl eri (partial types). D il deki b u gel iş mel er
sayesinde V isual Basic programc ı l arı tip gü venl i (type -saf e), yü ksek perf ormansl ı ,
derl eme z amanı nda onayl anmı ş (c ompil e time-verif ied) ol an g eneric s yaz ab il ec ekl er. Bu
sayede kodun tekrar tekrar f akl ı veri tipl eriyl e b irl ikte kul l anı l ması nı b erab erinde
getirec ektir.
Ö nc eki versiyonl arı gib i V isual Basic W h idb ey’ de h ı z l ı b ir b içimde program gel iş tirmeyi
mü mkü n kı l mak ü z erine yoğ unl aş mı ş tı r. P l anl ı ol an yenil ikl er il e V isual Basic P rogramc ı l arı
dah a gü venl i, dah a sağ l am ve dah a h oş programl arı kol ay b ir b içimde gel iş tirip onl arı
aynı kol ayl ı kl a w eb , çal ı ş ma grub u ve kurumsal ortaml arda dağ ı tmayı /kurmayı
garantil iyor.
V is ual C + +
V isual C+ + W h idb ey önc eki versiyonunl arı ndan dah a gü çl ü ol arak sistem programl ama
ve yaz ı l ı m gel iş tirme görevl erini h em W indow s h em de .N E T’ i terc ih eden programc ı l arı
h edef al ı yor. P l anl ı ol arak yapı l an yenil ikl er derl eyic iyi, gel iş tirme ortamı nı , programl ama
dil ini ve temel kü tü ph anel eri kapsı yor. E k ol arak V isual C+ + W h idb ey il e mob il c ih az l ar
için native C+ + uygul amarı nda gel iş tirmek mü mkü n ol ac ak.
C+ + derl eyic isindeki gel iş mel erden b iri P rof il e G udied O ptimiz ation (P O G O )’ dı r. P O G O
teknol oj isi derl eyic inin b ir uygul amayı inc el eyip onun nası l kul l anı l dı ğ ı h akkı nda b il gi
topl aması dı r. Bu b il gil er il e V isual C+ + kodu dah a iyi b içimde optimiz e edec ek. Son h al i
ol masada 6 4-Bit P O G O teknol oj isinin P re-rel ease versiyonu ü c retsiz ol arak indiril eb il ir.
W h idb ey de ise b u teknol oj i dah a gel iş miş ol arak 32-b it derl eyic i için h az ı r ol arak
gel ec ektir.
V isual C+ + W h idb ey C+ + temel kü tü ph anel erinde b ir çok gel iş meyi b erab erinde
getiriyor. Bil diğ imiz gib i C+ + ’ ta kul l anab il ec eğ imiz dü nya çapı nda yaygı n kü tü ph anel er
b unul uyor. Bunl ar en çok öne çı kanl arı ndan b iri de M ic rosof t F oundation Cl ass
(M F C)’ dir. V isual C+ + W h idb ey il e gel en M F C’ de b ir yönden yeni gel iş mel er ol ac ak.
Bunl arı n en dikkat çekeni ise W indow s F usion teknol oj isine destektir. W indow s F usion
D L L ’ l erin çı kardı ğ ı sorunl arı az a indirmek için yaratı l an il eri seviye b ir teknol oj idir. D iğ er
öneml i gel iş me ise kol ayc a M F C tab anl ı uygul amal arı n .N E T pl atf ormu taraf ı ndan
destekl enmesidir.
V ius al C #
M ic rosof t V isual C# ’ a değ iş ik dil l erden çok h oş öz el l ikl eri W h idb ey’ de ekl emeyi pl anl ı yor.
Bu değ iş ikl ikl er il e programc ı l ara “ K od odakl ı R A D ” ol anakl arı sağ l anac ak. Y ani, C#
programc ı l arı dah a veriml i b ir b içimde tekrar kul l anı l ab il ir nesne yönel iml i b il eş enl er ve iş
tasl akl arı gel iş tirec ekl er. E kl enec ek yenil ikl er generic s, itaretörl er, anonymous metodl ar
ve kı smi tipl erdir.
Bir yaz ı l ı m proj esinin karmaş ı kl ı ğ ı artı kça programc ı l ar dah a f az l a oranda h az ı r ol an
program b il eş enl erini direk kul l anmaya veya onl arı n öz erinde az b ir değ iş ikl ikl e kul l anma
eğ il imi gösterirl er. Böyl e yü ksek seviyede kodun yeniden kul l anı l ması nı b aş armak için
g eneric s ismi veril en yöntemi terc ih ederl er. W h idb ey’ de CL R içine yerl eş tiril en öz el l ikl er
sayesinde yü ksek perf romansl ı , tip gü venl i ve derl eme z amanı nda onayl anmı ş
generic s' l eri C+ + ’ ta b ul unan templ ate’ l ere b enz er b içimde gel iş tireb il iriz . G eneric l er
programc ı l ara kodu b ir kere yaz ı p b ir çok değ iş ik veri tipl eriyl e b irl ikte h iç b ir perf ormans
kayb ı ol madan kul l anmayı vaad eder. CL R de yaz ı l an generic l erin b enz erl erine göre dah a
sade koda, b u sayede dah a kol ay okunab il ir ve b akı mı yapı l ab il ir ol mal arı b ü yü k b ir
avantaj dı r.
C# il e kodun tekrar kul l anı l ması yönü nde b ir çok kol ayl ı kl arı n gel mesine ek ol arak tekrar
tekrar yapmamı z gereken b az ı karmaş ı k kod parçal arı için de yeni yeni çöz ü ml er
ü retil miş tir. M esel a enum sab itl eri için yenil ec il er(iterators). Y enil eyic il er sayesinde enum
sab itl eri il e çal ı ş mak dah a rah at b ir h al al mı ş tı r. Bil gisayar b il iml erinde araş tı rmal arda
kul l anı l an CL U , Sath er ve I c on programl ama dil l erindeki öz el l ikl erden esinl enerek f oreac h
b l okl arı içinde h angi veri tipl erinin nası l ne ş ekil de yenil eyic il erin kul l anı l ması nı n
tanı ml anması mü mkü n h al e gel miş tir.
A nonim metodl ar (anonymous meth ods) da C# dil ine W h idb ey il e girec ek. Bu tü r
metodl ar il e yaz mı ş ol duğ umuz b ir kod parçası nı b ir del ege içine koyup dah a sonra
kul l anac ağ ı z . A nonim metodl ar programl ama dil l erinin inc el endiğ i dersl erde geçen l a m d a
f u nc t i o n f ikri ü z erine kurul muş tur ve L isp ve P h yton dil l erinde uygul anmı ş tı r. Bu tü r
metodl ar kul l anı l ac akl arı anda ve yerde tanı ml anı yorl ar. N ormal de b ir f onksiyon dah a
önc e tanı ml anı r ve derl eyic i onun imz ası nı (meth od signature ) b il mek ister. Böyl el ikl e
anonim metodl ar, öz el l ikl e metodun yaptı ğ ı iş veya metodun imz ası nı n çal ı ş ma anı nda
değ iş mesinin gerektiğ inde b az ı iş l eml erin yapı l ması nı dah a uygun ve kol ay h al e gel ir.
Son ol arak W h idb ey C# il e programc ı l ar b ir veri tipinin tamamı nı tek b ir yerde değ il
değ iş ik kaynak dosyal arı nda tanı ml ayab il ec ekl er. Bu tü r tipl er parçal ı tip (partial types)
ol arak adl andı rı l ac akl ar. A yrı c a parçal ı tipl er geniş proj el erde dah a kol ay program
tasarı mı ve kod yaz ı mı imkanı sağ l ayac aktı r.
C# dil indeki öngörü l en yenil ikl er il e h em b ü yü k proj el er için gel iş tiril ec ek pl atf orml arı n
tasarı mc ı l arı h em de yaz ı l ı m mimarl arı (sof tw are artitec h ts) için f avori dil ol maya devam
edec ektir. A yrı c a modern söz diz imi ve b il eş en yönel iml i öz el l ikl eri (c omponent-
oreineted) il e koda odakl anmı ş R A D arac ı ol arak karş ı mı z a çı kac aktı r.
V is ual J #
J# W h idb ey il e pl anl amı ş b ir çok yenil ik gel ec ektir. Bunl arı n amac ı programc ı l arı n sah ip
ol dukl arı Java deneyiml erini dah a iyi b ir b içimde .N E T ortamı nda kul l anmal arı yönü ndedir.
Y enil ikl erin b aş ı nda Borw ser Control s ve J# dil inin gel iş tiril mesini sayab il iriz .
J# ’ ı n 2002’ de .N E T’ e katı l ması il e Java programc ı l arı önc eden yaz dı kl arı Java A ppl etl erini
.N E T koduna çevireb il mek ve .N E T ortamı nda da A ppl et tü rü yaz ı l ı ml ar gel iş tireb il meyi
tal ep ettil er. P rogramc ı l arı n b u istekl erine c evap ol arak M ic rosof t J# Brow ser Control s
adl andı rı l an teknol oj iyi gel iş tirdi. Ş u anda b eta aş aması nda ol an b u teknol oj i sayesinde
var ol an appl et kaynak kodl arı nı açı p tekrar J# il e (çok çok az kod değ iş ikl iğ i il e)
derl emek yeterl i ol ac aktı r. Bu teknol oj inin tam ol arak kul l anı l maya b aş l andı ğ ı gü nl erde
programc ı l ar kendi J# Brow ser Control ’ l arı nı tı pki Java appl etini b ir w eb sayf ası na gömer
gib i gömeb il ec ekl er. E k ol arak, tab iki, J# Brow ser Control ’ l arı .N E T F ramew ork’ unun tü m
ol anakl arı na eriş im h akl arı ol ac ak ve X M L w eb servisl erinin kul l anı mı mü mkü n ol ac ak.
J# ’ a ekl enec ek yenil ikl er il e .N E T dil l eri arası uyuml ul uğ u artac ak ve W indow s iş l etim
sisteminin öz el l ikl erine eriş im dah a rah at ol ac aktı r. İ l k ol arak yeni J# ’ ta E num sab itl eri ve
değ er tipl eri kavraml arı il e J# CL S’ ye dah a uyuml u ol ac ak. İ kinc isi ise v o la tile ve a ssert
anah tar kel imel erinin ekl enmesi il e dah a esnek ve dah a optimiz e ol arak çal ı ş an program
kodl arı na sah ip ol ac ağ ı z . Son ol arak generic ’ l erin J# içinden çağ rı l ab il mesi il e diğ er .N E T
dil l eri il e dah a da uyuml u ol ac aktı r.
Java programc ı l arı için h em al ı ş ı k b ir söz diz imi h em de nesne yönel iml i öz el l ikl eri il e .N E T
ortamı nda kol ayc a yaz ı l ı m gel iş tireb il ec ekl eri dil ol arak J# öne çı kac aktı r. W h idb ey J# ’ ta
gü n yü z ü ne çı kac ak h arika öz el l ikl er sadec e Java ve J+ + programc ı l arı nı değ il b il gisayar
b il iml erinde eğ itim gören öğ renc il er ve onl arı n h oc al arı nı çok mutl u edec ektir.
C# ile R as t gele K od Ü ret imi
Bu uygul ama b irçok, yerde iş imiz e yarayab il ec ek b ir “ R astgel e K od Üretic i” dir. R astgel e
ü retil miş b ir koda b irçok yerde ih tiyaç duyab il iriz . Ö rneğ in; w eb siteniz in ü ye kayı tl arı nda
ü ye adayl arı nı n gerçek email adresl erini girmel erini garantil emek isteyeb il irsiniz . Bunu
sağ l amanı n en b asit yol u, kiş inin verdiğ i email adresine rastgel e ü rettiğ inz b ir kodu
göndermektir. Böyl ec e ü ye adayı ndan, ü yel ik iş l eml erinin tamaml anarak h esab ı n aktive
ol ab il mesi için, email adresine gönderdiğ iniz aktivasyon kodunu “ ü yel ik aktivasyon”
sayf anı z da girmesini isteyeb il irsiniz . E ğ er email adresi doğ ru değ il se aktivasyon kodunu
edinemeyec eğ inde ü yel iğ i de geçerl i ol maz .
R astgel e kod ü reteb il mek için kul l anac ağ ı mı z en öneml i sı nı f “ System” isim al anı
(namespac e) içerisinde b ul unan “ R andom” sı nı f ı dı r (c l ass). Bu sı nı f ı kul l anarak kod
içerisinde görü nmesini istediğ imiz karakterl er diz isinin b oyutu kadar rastgel e tamsayı
ü retec eğ iz .
K ul l anac ağ ı mı z diğ er b ir sı nı f ise System.Tex t isim al anı içerisinde b ul unan StringBuil der
sı nı f ı dı r. Y apac ağ ı mı z iş l em b ir metin b irl eş tirme döngü sü içermekte ve metin b irl eş tirme
iş l eml erinde StringBuil der sı nı f ı , string tipine oranl a dah a f az l a perf ormans sağ l amaktadı r.
U yg u la ma yı b ir fo nk siyo n o la ra k ha zı rla ya c a ğ ı z.
F onksiyon ü retec eğ i “ rastgel e kod” un kaç karakter uz unl ukta ol ması istendiğ ini
“ c odeL ength ” parametresiyl e al ac ak. Ürettiğ i “ c odeL ength ” kadar karakter uz unl uğ undaki
“ R astgel e K od” u da string veri tipinde, f onksiyonun çağ ı rı l dı ğ ı yere döndü rec ek.
F onksiyonda il k ol arak “ sb ” değ iş ken adı yl a, “ rastgel e kod” u yapı l andı rac ağ ı mı z
StringBuil der nesnesini ve ikinc i ol arak da “ ob j R andom” adı yl a, rastgel e sayı ü retec ek
ol an R andom nesnesini yapı l andı rac ağ ı z .
Sı ra “ R astgel e K od” umuz içinde yer al ması nı istediğ imiz karakterl eri b ir metin diz isi
ol arak tanı l amaya gel di. Ben b u örnekte “ A -Z ” , “ a-z ” ve “ 0-9 ” arası karakterl eri
kul l andı m. Siz isterseniz uygul amayı z enginl eş tirmek için f arkl ı karakterl er de
kul l anab il irsiniz .
Ş imdi iş l eml ere b aş l ayab il iriz . Ö nc e rastgel e ü retec eğ imiz sayı aral ı ğ ı nı b ul al ı m.
Y ukarı daki karakterl er “ strCh ars” adı nda b ir metin diz isinde tutul maktal ar. D iz il er 0
indeksl e b aş l adı kl arı ndan rastgel e ü retil ec ek ol an minimum rakam 0 ol mal ı dı r. Üretil ec ek
maksimum rakam ise diz inin en son el emanı nı n indeksi ol mal ı dı r. D iz inin en b ü yü k
indeksl i el emanı nı n indeks b il gisini
koduyl a aynı anda h em b u değ eri tutac ak ol an “ max R and” adı nda b ir değ iş ken
tanı ml ayarak diz inin “ G etU pperBound(0)” metoduyl a al ı rı z .
“ R astgel e K od” un ü retil mesi, istenil en kod uz unl uğ u için h er b ir b asamağ ı n rastgel e
ol uş turul ması yl a sağ l anı r. Bunun için, 0 il e “ R astgel e K od” için kul l anı l ac ak karakter
diz isinin en b ü yü k indeksi arası nda rastgel e b ir sayı ob j R andom.N ex t(max R and)
metoduyl a ü retil ir ve b u değ er “ rndN umb er” değ iş kenine atanı r.
K arakter diz isindeki rastgel e b ir el eman, edinil en “ rndN umb er” sayı sı nı indeks ol arak
kul l anarak “ strCh ars(rndN umb er)” if adesiyl e el de edil ir ve b u karakter sb .A ppend
metoduyl a “ sb ” nesnesine ekl enir.
E ğ er 10 karakter uz unl uğ unda b ir “ rastgel e kod” istenirse, önc e b irinc i b asamak için
rastgel e b ir karakter ü retil ir, dah a sonra ikinc i b asamak için ve b u b öyl ec e 10’ a kadar
devam eder. Bu ü retil en karakterl er “ sb ” değ iş keni içerisinde ard arda ekl enir.
return sb .ToString();
string[] strCh ars = { "A ","B","C","D ","E ","F ","G ","H","I ",
{
int rndN umb er=ob j R andom.N ex t(max R and);
return sb .ToString();
}
M et in( S t ring) İ ş lemlerind e Perf ormans ı A rt ırmak
....
Bu l iste b öyl ec e uz ar gider. M etinsel iş l eml er denil inc e akl a gel en il k ş ey metin
b irl eş tirme iş l emidir. “ Bir metnin b ir diğ erine ekl enmesi.” İ ş metinl e il gil i ol duğ unda b u
iş i gerçekl eş tirmek için C# ta il k akl a gel en veri tipi “ string” dir. “ System.String”
sı nı f ı nı (c l ass) temsil eden string b ir ref erans tü rü dü r. A nc ak b iraz f arkl ı b ir ref erans
tü rü dü r. Y apı ol arak “ immutab l e” , yani değ iş mez dir/sab ittir ve b u yü z den b ir kez
yapı l andı rı l dı ktan sonra içeriğ i değ iş tiril emez . İ ş te b u yapı dan dol ayı dı r ki b ir string
değ iş kene anc ak b ir kez değ er atayab il irsiniz .
string metin="Merhaba";
Ş imdi ikinc i satı ra b akal ı m. Birinc i satı rda, metin değ iş keninin temsil ettiğ i string
nesnesine “ b irinc i string nesnesi” diyel im. İ kinc i satı rdaki kod iş l endiğ inde “ b irinc i string
nesnesi” ü z erine yeni değ er ekel enemeyec eğ inden, öb ekte ikinc i b ir string nesnesi
tü retil iyor ve iş l em sonuc u, yani “ M erh ab a D ü nya! ” b u ikinc i string nesnesine
yü kl eniyor.
V e kil it nokta!
“ metin” değ iş keni ikinc i satı rdaki kodun sonunda artı k “ b irinc i string nesnesi” nin değ il ,
“ ikinc i string nesnesi” nin adresini taş ı maya b aş l ı yor. Y ani artı k “ b irinc i string nesnesi”
tamamen eriş il emez ol uyor ve “ Ç öp Topl ayı c ı ” (G arb age Col l ec tor) devreye girip b el l eğ i
temiz l eyene kadar b el l ekte yer tutmaya devam ediyor.
İ ş te “ string” veri tipinin b u yapı sı nedeniyl e metinsel iş l eml erde dah a iyi perf ormans
sağ l amak amac ı yl a System.Tex t isim al anı içine b ul unan “ StringBuilder” sı nı f ı
kul l anı l maktadı r.
A l goritmaya b ağ l ı ol arak değ iş mekl e b irl ikte, StringBuil der sı nı f ı nı n çok çok dah a h ı z l ı
ol duğ u söyl eneb il ir.
A ş ağ ı daki örnek kod ve yukarı daki ekran görü ntü sü , metin b irl eş tirme iş l eml erinde
gerçekten çok iyi perf ormans gösteren StringBuil der sı nı f ı nı n, string il e karş ı l aş tı rı l dı ğ ı
b ir Consol e uygul aması dı r.
string str="";
Consol e.W riteL ine("' string' veri tipi kul l anil arak metin b irl estirme.....");
str + =i.ToString();
}
Consol e.W riteL ine("Topl am sü re :\t" + sure.Total M il l isec onds + " mil isaniye");
//-------------------------------------------------------
Consol e.W riteL ine("' StringBuil der' sinif i kul l anil arak metin b irl estirme.....");
sb .A ppend(i.ToString());
Consol e.W riteL ine("Topl am sü re :\t" + sure.Total M il l isec onds + " mil isaniye");
//-------------------------------------------------------
Consol e.W riteL ine("U ygul amaya sonl andirmak içim [E nter] tusuna b asin.");
Bu yaz ı da "Creational " desenl er grub unda yer al an "Buil der" tasarı m deseninden ve b u
deseni C# il e nası l gerçekl eş tireb il ec eğ imiz den b ah sedec eğ im.
Bu yaz ı yı okumadan önc e "Singl eton" ve "A b strac t F ac tory" tasarı m desenl erini konu
al an yaz ı l arı mı okumanı z ı tavsiye ederim.
"Buil der" deseni adı ndan da anl aş ı l ac ağ ı ü z ere b ir nesnenin ol uş turul ması il e il gil idir. Bu
desende kul l anı l an yapı l ar h emen h emen "A b strac t F ac tory" deseninde kul l anı l an
yapı l ar il e aynı dı r. Bu iki desen arası nda çok kü çü k f arkl ı l ı kl ar vardı r. Bu f arkl arı
il erl eyen kı sı ml arda açı kl ayac ağ ı m.
"Buil der" deseni b irden f az l a parçadan ol uş an kompl eks yapı daki b ir nesnenin
ol uş turul ması nı ve b u kompl eks nesnenin ol uş turul ma saf h al arı nı istemc i modü l ü nden
tamamen giz l emek için kul l anı l ı r. K ompl eks nesnenin yaratı l ması istemc i modü l ü nden
tamamen yal ı tı l dı ğ ı için nesnenin yaratı l ması il e il gil i iş l eml er f arkl ı versiyonl arda
tamamen değ iş tiril eb il ir, b u istemc i programı n çal ı ş ması nı h iç b ir ş ekil de
etkil emeyec ektir. Burda dikkat edil mesi gereken nokta ise ş udur : b u desen kompl eks
nesneyi ol uş turan yapı l arı n gerçek nesneden tamamen b ağ ı msı z b ir yapı da ol duğ u
duruml arda kul l anı l dı ğ ı z aman esnekl ik getirec ektir. D ol ayı sı yl a h er b ir f arkl ı parçanı n
kompl eks nesnede kul l anı l ması , kompl eks nesnenin iş l evini değ iş tirmeyec eğ i gib i
sadec e görü nü mü nü yada tipini değ iş tirec ektir.
Buil der deseninin A b strac t F ac tory deseninden f arkı na gel inc e; "A b strac t F ac tory"
deseninde soyut f ab rika ol arak b il inen yapı nı n metotl arı f ab rikaya ait nesnel erin
yaratı l ması ndan b iz z at soruml udur. Buil der deseninde ise aynı mekaniz ma b iraz dah a
f arkl ı iş l emektedir. Buil der deseninde istemc i modü l ü , nesnel erin ne ş ekil de
ol uş turul ac ağ ı na soyut f ab rika yapı sı na b enz er b ir yapı ol an Buil der yapı sı nı n metotl arı
il e
karar verir ve istemc i ol uş turul an b u nesneyi Buil der sı nı f ı ndan tekrar tal ep eder.
Y ukarı daki soyut açı kl amal ardan sonra dah a gerçekçi b ir örnekl e b u deseni açı kl amamı n
siz in ruh h al iniz açı sı ndan f aydal ı ol ac ağ ı nı dü ş ü nü yorum. F arkl ı donanı m ü rü nl erinin
b iraraya getiril erek b il gisayar sisteml erinin ol uş turul duğ u b ir teknik servisi göz önü nde
b ul undural ı m. Bir mü ş teri b u servise gel erek çeş itl i öz el l ikl eri içinde b arı ndı ran b ir
b il gisayar tal ep eder. İ steğ i al an servis temsil c isi b u isteğ i teknik b iriml ere il etir
ardı ndan teknik el eman istenil en öz el l ikl erde b ir b il gisayarı n ol uş ması için gerekl i
donanı ml arı raf l arı ndan al ı r ve b irl eş tirir. Sonuçta mü ş terinin isteğ i yerine gel ir ve
karş ı l ı kl ı b ir mutl ul uk h avası içine giril ir. Tab i b iz i il gil endirin mü ş terinin ve satı c ı nı n
mutl ul uğ u değ il el b ette. Biz i il gil endiren nokta mü ş terinin b il gisayarı ol uş turuan
parçal arı n b irl eş tiril mesinden tamamen soyutl andı ğ ı dı r. D ikkat ederseniz veril en
öz el l ikl erde b il gisayarı n ol uş ması nda mü ş terinin h iç b ir etkisi ol mamı ş tı r. E ğ er mü ş teri
son anda vaz geçip f arkl ı öz el l ikl erde b ir b il gisayar istemiş ol saydı yine b ir etkisi
ol mayac aktı . Bu durumda eski b il gisayarı n il gil i parçal arı değ iş tiril ip yeni isteğ e uygun
parçal ar takı l ac aktı . Burda da kompl eks b ir yapı ol an b il gisayar sisteminin kendisini
ol uş turan parçal ardan (donanı m) tamamen b ağ ı msı z b ir yapı da ol duğ unu görü yoruz .
Herh angi b ir diskin yada monitörü n değ iş mesi b il gisayarı b il gisayar yapmaktan
çı karmayac ak sadec e b il gisayarı n tipini ve görü ntü sü nü değ iş tirec ektir. Bu durum b iz im
yukarı da açı kl adı ğ ı mı z b uil der deseninin amac ı na tam ol arak uymaktadı r. Z ira b iraz dan
b ir teknik servisteki b u iş l eri otomatiz e eden temel desenimiz i C# il e nası l
gerçekl eş tireb il ec eğ imiz i görec eğ iz .
Buil der desenin de temel ol arak 4 yapı b ul unmaktadı r. Bu yapı l ar sı rası yl a ş öyl edir :
• " B u ilder" A ra yüzü : Bu yapı içinde gerçek/somut(c onc rete) Buil der sı nı f l arı nı n
uygul aması gereken öz el l ikl eri ve metotl arı b arı ndı rı r. "Buil der" ab strac t b ir sı nı f
ol ab il ec eğ i gib i b ir arayü z de ol ab il ir. E n çok terc ih edil en yapı arayü z ol ması na
rağ men uygul amanı z ı n ih tiyac ı na göre ab strac t sı nı f l arı da kul l anab il irsiniz .
G erçek örneğ imiz de b u yapı b ir b il gisayar sisteminin minimum ol arak
uygul aması gereken öz el l ikl eri temsil eder. Ö rneğ in kul l anı c ı l ara satı l ac ak h er
b il gisayar sistemi mutl aka HD D ,R A M gib i yapı l arı içerisinde b ul undurmal ı dı r.
D ol ayı sı yl a b irb irinden f arkl ı b il gisayar sisteml erinin b u tü r yapı l arı mutl ak ol arak
içerisinde b arı ndı rab il mesi için z orl ayı c ı b ir etkene diğ er b ir değ iş l e ab strac t ü ye
el emanl ara yada arayü z l ere ih tiyac ı mı z vardı r.
• Direc to r( Y ö netic i) : G enel l ikl e istemc i il e yani örneğ imiz deki mü ş teri il e
Buil der(parçal arı b irl eş tirip ü rü n yapan b iriml er) yapı l arı arası nda köprü
görevinde b ul unan yapı ol arak b il inir. K ı sac ası b il gisayar sisteminin ol uş ması için
raf l ardan donanı ml arı al ı p onl arı b irl eş tiren teknik el eman D irec tor görevindedir.
Tab i D irec tor yapı sı nı n iş yaparken Buil der arayü z ü nü n kı sı tl arı na göre çal ı ş ması
gerektiğ inide b el irtmek gerekir.
U M L M o deli
Y ukarı daki U M L diyagramı nı kı sac a öz etl eyec ek ol ursak : Buil der arayü z ü nde b ul unan
metotl ar yardı mı yl a gerçek b uil der sı nı f l arı nda kompl eks nesnenin parçal arı
b irl eş tiril erek istenil en nesne ol uş turul ur. K ompl eks sistemi ol uş turan parçal ar f arkl ı
sayı l arda ol ab il dğ i h al de minumum gerekl il ikl eri de sağ l amak z orundadı r. Bu minumum
gereksiniml er Buil der arayü z ü nde b il diril miş tir. D irec tor sı nı f ı ndaki b ir metot, h er sistem
için standart ol an Buil der arayü z ü ndeki metotl arı kul l anarak h angi sistemin
ol uş turul duğ undan b ağ ı msı z ol arak kompl eks nesnenin ol uş turul ması sağ l anı r. Y ani
D irec tor h angi tü r b ir b ir b il gisayar sisteminin ol uş turul ac ağ ı il e il gil enmez . D irec tor
sı nı f ı sadec e kendisine gönderil en parametre sayesinde Buil der arayü z ü nü n
metotl arı ndan h ab erdardı r. Son ol arak istemc i D irec tor sı nı f ı nı n il gil i metotl arı nı
kul l anarak gerçek ü rü nü n ol uş ması nı sağ l ar. Bunun için el b ette D irec tor sı nı f ı nı n il gil i
metoduna h angi ü rü nü n ol uş turul ac ağ ı nı b il dirmesi gerekir.
Bu kı sa açı kl amadan sonra yukarı daki diyagramı b az al arak modern b ir programl ama
dil i ol an C# il e b u deseni nası l gerçekl eş tireb il ec eğ imiz i inc el eyel im.
! A ş ağ ı daki kodl arı kı sac a inc el eyip açı kl amal arı okumaya devam edin.
using System;
void CD R O M _ O l ustur();
void HD D _ O l ustur();
void M onitor_ O l ustur();
void R A M _ O l ustur();
}
pub l ic G ol dP C()
{
mBil gisayar = new Bil gisayar("G ol d-P C");
}
K aynak koddan da görü l ec eğ i ü z ere en temel yapı mı z I Bil gisayarTopl ayic isi arayü z ü dü r.
Bu arayü z de b ir Bil gisayar ü rü nü nü temsil etmek için b ir öz el l ik ve b il gisayarı ol uş turan
parçal arı ol uş turmak için gereken metotl ar b ul unmaktadı r. Bu metotl arı n b u arayü z den
tü reyen b ü tü n sı nı f l ar taraf ı ndan uygul anması gerekmektedir. Ö rneğ imiz de b ir G ol dP C
ve Sil verP C b il gisayar model l eri için gereken b il eş enl eri ol uş turmak için 4 adet metot
b ul unmaktadı r. Burada en öneml i nokta h er Bil gisayar tipinde b ir öz el l iğ inde b ul unması .
Bu öz el l ik istendiğ i z aman ol uş turul an Bil gisayar ü rü nü nü istemc iye vermektedir. Z aten
dikkat ederseniz h er b ir sisteme il iş ikin öz el l ikl er Bil gisayar sı nı f ı ndaki Hash tab l e
nesnesinde sakl anmı ş tı r. A yrı c a h er Bil gisayar nesnesinin ayrı c a b ir tip b il gisi
sakl anmaktadı r. Son ol arak TeknikServis isiml i sı nı f ı mı z ı el e al al ı m. Bu sı nı f Buil der
desenindeki D irec tor yapı sı na denk dü ş mektedir. Bu sı nı f taki Bil gisayarTopl a metodu
kendisine gönderil en b il gisayartopl ayı c ı sı arayü z ü ref eransı na ait metotl arı kul l anarak
Bil gisayar nesnesinin parçal arı nı kendisi ol uş turmaktadı r. Bu örnekte b il gisayarı
ol uş turan h er parça kaf a karı ş tı rmamak için ayrı b ir sı nı f ol arak tasarl anmamı ş tı r.
Bunun yerine string tü rü nden değ erl ere sah ip ol an b ir h ash tab l e nesnesi kul l anı l mı ş tı r.
N ot : Y ukarı daki örnek gerçek otomasyonda b ireb ir kul l anı l amayab il ir. Ö rneğ in h er b ir
b il gisayar model i için ayrı ayrı sı nı f tasarl amak h oş ol mayab il ir. Bu sorunu dah a dinamik
ş ekil de kavrayab il meniz için veril miş tir.
Son ol arak yukarı daki yapı l arı kul l anan b ir istemc i programı yaz ı p desenimiz i test
edel im.
using System;
D esenl erl e il gil i b ir sonraki yaz ı mda Creational desenl erden ol an "P rototype" desenini
el e al ac ağ ı m. Herkese iyi çal ı ş mal ar.
K od O p t imizas yonu v e " v olat ile" A nah t ar S özc üğ ü
Bu yaz ı da C# ' ı n öneml i ama tam ol arak neden kul l anı l dı ğ ı b az ı prof esyonel programc ı l ar
taraf ı ndan b il e pek f az l a b il inmeyen b ir anah tar söz c ü k ol an vol atil e ü z erinde durac ağ ı z .
Bir çok popü l er derl eyic i siz in isteğ iniz dı ş ı nda kodunuz un iş l eyiş mantı ğ ı na mü dah al e
edeb il mektedir. Bu mü dah al enin en b il inen seb epl erinden b irisi uygul umanı z ı n kod
b oyutunu kü çü l tmek yada uygul amanı z ı n çal ı ş ma z amanı nı dü ş ü rmektir. A sl ı nda b iz b u
iş l eml erin tamamı na b irden optimiz asyon da diyeb il iriz . Z ira h emen h emen b ü tü n
derl eyic il erin optimiz asyon iş l eminin yapı l ı p yapı l mayac ağ ı nı b el irten b ir parametresi
vardı r. C# derl eyic isi için b u parametre /optimiz e yada kı sac a /o ş ekl indedir.
P eki optimiz astondan neyi anl amal ı yı z ? G enel ol arak iki f arkl ı ş ekil de optimiz asyondan
b ah setmek mü mkü ndü r. Birinc isi dah a h enü z derl eme aş aması ndayken programc ı nı n
göz ü nden kaçan b az ı gereksiz b il diriml erin veya tanı ml amal arı n derl eyic i taraf ı ndan
derl enec ek koda dah il edil memesi il e ol ab il ir. Ö rneğ in h iç kul l anmadı ğ ı nı z b ir değ iş ken
için b el l ekte b ir al an tah sis edil mesinin h iç b ir gereğ i yoktur. Bu yü z den h iç b ir yerde
kul l anı l mayan değ iş kenl erin derl eyic iniz taraf ı ndan derl eme modü l ü ne il etil memesi b ir
optimiz asyon ol arak görü l mektedir. Bu tip optimiz asyon kapsamı içinde el e al ı nab il ec ek
diğ er b ir örnek ise aş ağ ı daki kod parçası il e gösteril miş tir.
int a = 0;
w h il e(a ! = 0)
{
a=2;
a=0;
}
Y ukarı daki kodda akı ş h iç b ir z aman w h il e b l oğ unun içine gel meyec ektir. V e ü stel ik eğ er a
değ iş keni f arkl ı b ir iş parçac ı ğ ı (th read) taraf ı ndan w h il e b l oğ una girmeden değ iş tiril ip akı ş
w h il e b l oğ una girse b il e a değ iş keni w h il e b l oğ u içinde tekrar eski sab it değ erine atanı yor.
D ol ayı sı yl a w h il e b l oğ unda b ul unan kodl arı n çal ı ş tı rı l ab il ir uygul ama dosyası nı n b oyutunu
b ü yü tmekten b aş ka b ir iş e yaramayac ağ ı açı ktı r. O h al de b urda insan ü stü b ir
mekaniz manı n devreye girip kodu optimiz e etmesi gerekir. Bu mekaniz ma el b etteki
derl eyic inin optimiz asyon iş ine yarayan parametresidir. O ptimiz asyon iş l eminde
derl eyic iden derl eyic iye f ark ol ması na rağ men yukarı daki kod parçası nı n geeb il ec eğ i en
optimum b içim aş ağ ı da gösteril diğ i gib idir.
int a = 0;
w h il e(a ! = 0)
{
D iğ er b ir optimiz asyon b içimi ise derl eyic inin değ iş kenl erin el de edil mesinde yada tekrar
yaz ı l ması nda b el l eğ in yada iş l emc inin terc ih edil mesi il e il gil idir. Bu noktada
mikroiş l emc il er il e il gil i kı sa b ir b il gi vermekte f ayda var : K aynak kodumuz çal ı ş tı rı l ab il ir
durumdayken asl ı nda makine koduna çevril miş tir. Bu komutl ar dah a önc eden
mikroiş l emc il erde el ektronik dü z eyde programl andı kl arı için b u komutl ar tek tek
mikroiş l emc ide kol ayl ı kl a ic ra edil ir. M ikroiş l emc il er aynı anda tek b ir iş yapab il ec eğ i için
yapac ağ ı iş l eml er içinde kul l andı ğ ı değ iş kenl eri h er def ası nda b el l ekten al mak yerine dah a
h ı z l ı ol ması açı sı ndan mikroiş l emc ideki data register dediğ imiz kayı tçı l arda tutar. Bu
register dediğ imiz b öl ü ml erin sı nı rl ı sayı da b ul unduğ unu b el irtmek gerekir. D ol ayı sı yl a
b el l ekte b ul unan uygul amamı z ı n ih tiyac ı na göre dah a doğ rusu ic ra edil ec ek b ir sonraki
makine kodunun çeş idine göre iş l emc i b el l ekten il gil i değ iş kenl eri register' l arı na yü kl er ve
il gil i komutunu çal ı ş tı rı r. D oğ al dı r ki b ir değ erin mikroiş l emc i taraf ı ndan b el l eğ e(ram)
yaz ı l ması il e mikroiş l emc ideki register b öl gesine yaz ı l ması arası nda dağ l ar kadar f ark
vardı r. Bu f ark el b ette h ı z f aktörü dü r. İ ş te tam b u noktada ikinc i tip optimiz asyon kural ı nı
tanı ml ayab il iriz . D erl eyic i öyl e b l okl ara rastl ayab il ir ki, b u b l okl ar içinde b ul unan b ir
değ iş kenin değ erini h er def ası nda b el l ekten okuyac ağ ı na b u değ iş kenin değ erini b ir
def aya mah sus ol mak ü z ere mikroiş l emc inin il gil i register b öl gesine b öl gesine kaydeder
ve sonraki okumal arda iş l emc i b el l ek yerine b u register b öl gesini kul l anı r. Böyl ec e
kodunuz un çal ı ş ma sü resinde öneml i sayı l ab il ec ek b ir az al ma görü l ü r. E l b etteki b u
optimiz asyon iş l eminin yü z l erc e kez tekrarl andı ğ ı nı varsayarak b u sonuc a varı yoruz .
Y ukarı da değ iş ken okuma il e il gil i söyl edikl erimin aynı sı b ir değ iş kenin değ erini
değ iş tirmek için de geçerl i ol duğ unu b el irtmel iyim. Y ani siz programı nı z ı n 10. satı rı nda b ir
değ iş kenin değ erini b ir değ erden b aş ka b ir değ er çektiğ iniz h al de derl eyic i b u iş l emi
15.satı rda yapab il ir. Bu durumda 15. satı ra kadar o değ iş kenin kul l anı l madı ğ ı yorumunu
yapab il iriz . Bu ş ekil de mikroiş l emc inin b el l eğ e yaz ma iş l emi gec iktiril erek b el l i öl çü de
optimiz asyon sağ l anı r. Tab i b u optimiz asyonun öl çü sü tamamen mikroiş l emc inin o anki
durumuna b ağ l ı dı r.
Buraya kadar h erş ey normal . Bir de madol yonun öteki yü z ü ne b akal ı m. Bil diğ iniz ü z ere
uygul amal ar genel l ikl e çokl u iş parçac ı kl arı ndan(mul ti th read) ve prosesl erden ol uş ur.
Her b ir proses diğ er b ir proses teki değ iş kene iş l etim sisteminin iz in verdiğ i öl çü de eriş ip
ü z erinde iş l eml er yapab il ir. A ynı ş ekil de b ir iş parçac ı ğ ı da diğ er b ir iş parçac ı ğ ı nda
b ul unan değ iş kene eriş ip ü z erinde çeş itl i iş l eml er yapab il ir. P eki b unun b iz im
optimiz asyon kurl l arı mı z l a b ağ l antı sı ne? Ş öyl e ki : derl eyic i b ir değ iş kenin değ erinin
f arkl ı b ir iş parçac ağ ı taraf ı ndan yada f arkl ı b ir proses taraf ı ndan iş l enec eğ i ü z erinde
durmaz . Bu tamamen iş l etim sisteminin yönetimindedir. Hal b öyl eyken b iz im yukarı da
b ah settiğ imiz ikinc i optimiz asyon tipi b az ı duruml arda yarar getirec eğ iniz z arar getireb il ir.
Z ira optimiz asyon adı na b ir değ iş kenin değ erini h er def ası nda b el l ekten okuma yerine
mikroiş l emc ideki il gil i register dan okurken o anda f arkl ı b ir iş parçac ağ ı yada f arkl ı b ir
proses h atta ve h atta iş l etim sistemi siz in eriş meye çal ı ş tı ğ ı nı z değ iş kenin değ erini siz in
uygul amanı z ı n mantı ğ ı na göre değ iş tireb il ir. Bu durumda siz o değ iş kenin son h al ini
kul l anmamı ş ol ursunuz . Do la yı sı yla pro g ra mı nı zda fa rk lı threa d la r ya da pro sesler
a ra sı nda pa yla ş ı la n v eya iş letim sistemi ta ra fı nda n değ iş tirilmesi mu htemel o la n
değ iş k enlerinizi o ptimiza syo n k u ra lı na ta b i tu tma ma nı z g erek ir. P eki b unu nası l
b aş arac ağ ı z ?
v o la tile anah tar söz c ü ğ ü b urada imdadı mı z a yetiş iyor. Bir değ iş keni vol atil e anah tar
söz c ü ğ ü il e b il dirdiğ iniz takdirde derl eyic iniz in optimiz asyon il e il gil i parametresini açı k
tutsanı z b il e il gil i değ iş ken yukarı da b ah si geçen teh l ikel i optimiz asyon kural l arı na tab i
tutul mayac aktı r. Y ani vol atil e il e b il diril en değ iş kenl ere programı n akı ş ı sı rası nda h er
ih tiyaç duyul duğ unda değ iş kenin gerçek yeri ol an b el l eğ e b aş vurul ur. A ynı ş ekil de b ir
değ iş kene yeni b ir değ er yaz ı l ac ağ ı z aman b u yaz ma iş l emi h iç gec iktiril meden b el l ekteki
yerine yaz ı l ı r. Böyl ec e vol atil e il e b il diril en değ iş kenl er f arkl ı iş parçac ı kl arı yada prosesl er
taraf ı ndan ortak kul l anı l ı yor ol sada programı n akı ş ı içerisinde h er z aman son versiyonu
el de edil ec ektir. Ç ü nkü b u değ iş kenl erin değ eri h er def ası nda b el l ekten çekil ir. Her ne
kadar optimiz asyondan taviz verme z orunda kal sak ta b öyl ec e uygul amal arı mı z da
çı kab il ec ek ol ası b ugl arı n(b öc ek) önü ne geçmiş ol uruz .
vol atil e, C# dil indeki anah tar söz c ü kl erden b iridir. Üye değ iş ken b il dirimi il e b irl ikte
kul l anı l ı r. vol atil e anah tar söz c ü ğ ü yal nı z c a aş ağ ı daki değ iş ken tipl eri il e b irl ikte
kul l anı l ab il ir.
• Herh angi b ir ref erans tipindeki değ iş ken il e
• b yte, sb yte, sh ort, ush ort, int, uint, c h ar, f l oat yada b ool . tü rü nden ol an
değ iş kenl er il e
• b yte, sb yte, sh ort, ush ort, int, yada uint tü rü nden semb ol l er içeren
numaral andı rmal ar(enums) il e
....
M ic rosof t' un resmi dökü manl arı nda(M SD N ) veril en b ir örneğ i b uraya taş ı yarak ne gib i
duruml arda vol atil e anah tar söz c ü ğ ü ne ih tiyaç duyac ab il ec eğ imiz i görel im.
using System;
using System.Th reading;
c l ass Test
{
pub l ic static int resul t;
pub l ic static v o la tile b ool f inish ed;
f or (;;)
{
if (f inish ed)
{
Consol e.W riteL ine("resul t = {0}", resul t);
return;
}
}
}
}
Y ukarı daki örnek programdaki pü f nokta f inish ed isiml i değ iş kenin ana th read ve ana
th read içinde b aş l atı l an yeni th read taraf ı ndan ortak kul l anı l an b ir değ iş ken ol ması dı r.
E ğ er f inish ed değ iş keni vol atil e ol arak b il diril memiş ol saydı , akı ş th read2 metoduna
gel miş ol ması na rağ men M ain metodu içindeki if b l oğ u çal ı ş tı rı l mayab il irdi. Ç ü nkü
derl eyic i ana th read içinden f inish ed değ iş keninine tampol anmı ş b ir b öl geden(register)
eriş eb il ir. Bu durumda f inish ed değ iş keninin gerçek değ eri true ol ması na rağ men ana
th read de f inish ed değ iş keni h al en f al se ol arak el e al ı nı r. Bu yü z den f inish ed değ iş keninin
h er durumda son versiyonunu el de etmek için b u değ iş ken vol atil e anah tar söz c ü ğ ü il e
b il diril miş tir.
vol atil e anah tar söz c ü ğ ü nü n kul l anı mı na b ir örnek dah a verel im. Bel l i b ir anda b ir sı nı f tan
sadec e b ir nesnenin ol uş ması nı sağ l ayan Singl eton desenini dah a önc eki b ir makal emde
el e al mı ş tı m. Bu konu il e il gil i b il gi eksikl iğ iniz varsa il gil i makal eyi okumanı z ı tavsiye
ederim. Bah si geçen makal ede veril en desenin b ir uygul aması aş ağ ı da ki gib i yeniden
yaz ı l mı ş tı r.
return nesne;
}
}
Bu örnekte Singl etonD eseni nesnesinin b el l i b ir anda tekil ol arak b ul unduğ unu çok kanal l ı
uygul amal ar içinde geçerl i kı l mak için b u nesne vol atil e ol arak b il diril miş tir. Üstel ik b u
örnekte f arkl ı b ir prosesin mü dah al esi ol sa b il e b u nesneden anc ak ve anc ak b ir adet
yaratı l ac aktı r.
Son ol arak vol atil e kel imesinin söz l ü k anl amı ü z erinde durmak istiyorum. İ ki yı l önc e
İ ngil iz c e' den Tü rkçe' ye çevril miş b ir V isual C+ + kitab ı nı okuduğ umda vol atil e il e
b il diril miş değ iş kenl erden oynak(! ) değ iş kenl er diye b ah sedil diğ ine ş ah it ol dum. İ l k b aş ta
b u il ginç kul l anı m b ana b irş ey if ade etmedi ama h isl erimin yardı mı yl a asl ı nda yaz arı n
vol atil e dan b ah settiğ ine karar verdim. Siz de takdir edersiniz ki yukarı da anl attı kl arı mı z
il e "oynak" kel imesi arası nda pek b ir b ağ b ul unmamaktadı r. K itab ı n çevirisini yapan yaz ar
muh temel en b ir programc ı değ il b ir çevirmendi. Ç ü nkü eğ er iyi b ir programc ı ol saydı
oynak kel imesi yerine dah a uygun b ir kel ime seçil eb il irdi. vol atil e' ı n söz l ü k anl amı "uçuc u
ol an", "b uh ar ol an" anl amı na gel mektedir. A nc ak b en h enü z vol atil e söz c ü ğ ü ne kendi
mesl eğ imiz l e il gil i uygun b ir karş ı l ı k b ul amadı m. Bu konuda dah a önc e c dili ve c dernek
isiml i iki yah oo grub unda çeş itl i tartı ş mal ar ol muş tur. Bu grupl ara ü ye ol arak il gil i
tartı ş mal arda geçen konuş mal arı okumanı z ı öneririm. E ğ er siz in de b u konuda öneril eriniz
varsa b iz iml e payl aş ı rsanı z seviniriz .
U marı m f aydal ı b ir yaz ı ol muş tur. Herkese iyi çal ı ş mal ar...
O v erload ed ( A ş ırı Yüklenmiş ) M et ot ların G üc ü
Bu makal emde siz l ere overl oad kavramı ndan b ah setmek istiyorum. K onunun dah a iyi
anl aş ı l ab il mesi açı sı ndan, il erl iyen kı sı ml arda b asit b ir örnek ü z erinde de çal ı ş ac ağ ı z .
Ö nc el ikl e O verl oad ne demek b undan b ah sedel im. O verl oad kel ime anl amı ol arak A ş ı rı
Y ü kl eme anl amı na gel mektedir. C# programl ama dil inde overl oad dendiğ inde, aynı isme
sah ip b irden f az l a metod akl a gel ir. Bu metodl ar aynı isimde ol mal arı na rağ men, f arkl ı
imz al ara sah iptirl er. Bu metodl arı n imz al arı nı b el irl eyen unsurl ar, parametre sayı l arı ve
parametre tipl eridir. O verl oad edil miş metodl arı kul l andı ğ ı mı z sı nı f l arda, b u sı nı f l ara ait
nesne örnekl eri için aynı isme sah ip f akat f arkl ı görevl eri yerine getireb il en ( veya aynı
görevi f arkl ı sayı veya tipte parametre il e yerine getireb il en ) f onksiyonel l ikl er kaz anmı ş
ol uruz .
Ö rneğ in;
Ş ekil 1 de M etodA isminde 3 adet metod tanı mı görü yoruz . Bu metodl ar aynı isime sah ip
ol ması na rağ men imz al arı nedeni il e b irb irl erinden tamamı yl a f arkl ı metodl ar ol arak
al gı l anı rl ar. Biz e sağ l adı ğ ı avantaj ise, b u metodl arı b arı ndı ran b ir sı nı f nesnesi
yarattı ğ ı mı z da aynı isme sah ip metodl arı f arkl ı parametrel er il e çağ ı rab il memiz dir. Bu b ir
anl amda h er metoda f arkl ı isim vermek gib i b ir karı ş ı kl ı ğ ı nda b ir neb z e önü ne geçer. P eki
imz a dediğ imiz ol ay nedir? Bir metodun imz ası ş u unsurl ardan ol uş ur.
T ab lo 1. K ullanım K uralları
Y ukarı daki unsurl ara dikkat ettiğ imiz sü rec e dil ediğ imiz sayı da aş ı rı yü kl enmiş (overl oad
edil miş ) metod yaz ab il iriz .
Ş imdi dil erseniz kü çü k b ir Consol e uygul aması il e , overl oad metod ol uş umuna engel teş kil
eden duruma b ir göz atal ı m. Ö nc el ikl e metodun geri dönü ş tipinin metodun imz ası ol arak
kab ul edil emiyec eğ ininden b ah sediyoruz . A ş ağ ı daki örneğ imiz i inc el eyel im.
using System;
namespace Overloading1
{
class Class1
{
public int Islem(int a)
{
return a*a;
}
[STAThread]
static void Main(string[] args)
{
}
}
}
Ö rneğ in yukarı daki uygul amada, I sl em isiml i iki metod tanı ml anmı ş tı r. A ynı parametre tipi
ve sayı sı na sah ip ol an b u metodl arı n geri dönü ş değ erl erinin f arkl ı ol ması neden il e
derl eyic i taraf ı ndan f arkl ı metodl ar ol arak al gı l anmı ş ol ması gerektiğ i dü ş ü nü l eb il ir. A nc ak
b öyl e ol mamaktadı r. U ygul amayı derl eme çal ı ş tı ğ ı mı z da aş ağ ı daki h ata mesaj ı il e
karş ı l aş ı rı z :
Y apı c ı metodl arı da overl oad edeb il iriz . Bu nokta ol dukça öneml idir; ki metodl arı overl oad
etmeyi .N E T il e yaz ı l ı m gel iş tirirken sı kça kul l anı rı z . Ö rneğ in, Sq l Connec tion sı nı f ı ndan b ir
nesne örneğ i ol uş turmak istediğ imiz de b unu yapab il ec eğ imiz 2 tane overl oad edil miş
yapı c ı metod ol duğ unu görü rü z . Bunl ardan b irisi aş ağ ı da görü l mektedir.
D ol ayı sı yl a b iz de yaz dı ğ ı mı z sı nı f l ara ait c onstruc torl arı overl oad edeb il iriz . Ş imdi
dil erseniz overl oad il e il gil i ol araktan kı sa b ir uygul ama gel iş tirel im. Bu uygul amada
yaz dı ğ ı mı z b ir sı nı f a ait c onstruc tor metodl arı overl oad ederek değ iş ik tipte
f onksiyonel l ikl er edinmeye çal ı ş ac ağ ı z .
Ş imdi sı ra gel di kodl arı mı z ı yaz maya. Ö nc el ikl e uygul amamı z a K ol ayV eri adı nda b ir c l ass
ekl iyoruz . Bu c l ass’ ı n kodl arı aş ağ ı daki gib idir. A sl ı nda uygul amaya b u aş amada
b aktı ğ ı mı z da Sq l Connec tion nesnemiz in b ir b ağ l antı ol uş turması nı öz el l eş tirmiş gib i
ol uyoruz . G erçekten de aynı iş l eml eri z aten Sq l Connec tion nesnesini overl oad
c onstruc tor’ l ari il e yapab il iyoruz . A nc ak temel amac ı mı z aş iri yü kl emeyi anl amak ol duğ u
için programı n çal ı ş ma amac ı nı n çok öneml i ol madı ğ ı dü ş ü nc esindeyim. U muyorum ki
siz l ere aş ı rı yü kl eme h akkı nda b il gi vereb il iyor ve viz yonunuz u gel iş tireb il iyorumdur.
using System;
using System.Data.SqlClient;
namespace Overloading
{
public class KolayVeri
{
/* Baglantı işlemini bir try bloğunda yapıyoruz ki, herhangi bir nedenle
Sql sunucusuna bağlantı sağlanamazsa (örnegin hatalı veritabanı adı
nedeni ile) catch bloğunda baglantiDurumu değişkenine BAĞLANAMADIK
değerini atıyoruz. Bu durumda program içinde KolayVeri sınıfından örnek
nesnenin BaglantiDurumu özelliğinin değerine baktığımızda BAĞLANAMADIK
değerini alıyoruz böylece bağlantının saglanamadığına kanaat getiriyoruz.
Kanaat dedikte aklima Üsküdarda ki Kanaat lokantasi geldi :) Yemekleri
çok güzeldir. Sanirim karnımız acıktı... Neyse kaldığımız yerden devam
edelim.*/
try
{
con.Open(); // Bağlantımız açılıyor.
/* BaglantiDurumu özelliğimiz (Property), baglantiDurumu
değişkeni sayesinde BAĞLANDIK değerini alıyor.*/
baglantiDurumu="BAGLANDIK";
}
/* Eğer bir hata olursa baglantiDurumu değiskenine
BAĞLANAMADIK değerini atıyoruz.*/
catch(Exception hata)
{
baglantiDurumu="BAGLANAMADIK";
}
}
string veritabaniAdi;
stbDurumBilgisi.Text=lstDatabase.SelectedItem.ToString()+"
"+kv.BaglantiDurumu;
}
private void btnOzelBaglan_Click(object sender, System.EventArgs e)
{
string kullanici,sifre;
kullanici=txtKullaniciAdi.Text;
sifre=txtParola.Text;
veritabaniAdi=lstDatabase.SelectedItem.ToString();
stbDurumBilgisi.Text=lstDatabase.SelectedItem.ToString()+"
"+kvOzel.BaglantiDurumu+" User:"+kullanici;
}
V e b irde kul l anı c ı adı il e parol a veril erek nası l b ağ l anac ağ ı mı z ı görel im.
Ş ekil 7 . K ullanıcı adı v e p arola ile b ağ lantı
E vet değ erl i okuyuc ul ar b u sef erl ikte b u kadar. Bir sonraki makal emiz de görü ş mek
dil eğ iyl e h epiniz e mutl u gü nl er, yarı nl ar dil erim.
C#' t a N u maraland ırıc ılar( E nu merat ors )
Bu makal emiz de, kendi değ er tü rl erimiz i ol uş turmanı n yol l arı ndan b irisi ol an
E numerator' l arı inc el eyec eğ iz . C# dil inde veri depol amak için kul l anab il ec eğ imiz temel
veri tü rl eri yanı nda kendi tanı ml ayab il ec eğ imiz tü rl erde vardı r. Bunl ar Struc ts(Y apı l ar),
A rrays(D iz il er) ve E numerators(N umaral andı rı c ı l ar)' dı r.
N umaral andı rı c ı l ar, sı nı rl ı sayı da değ er içeren değ iş kenl er yaratmamı z a ol anak sağ l arl ar.
Burada b ah si geçen deş iş ken değ erl eri b ir grup ol uş tururl ar ve semb ol ik b ir adl a temsil
edil irl er. N umaral andı rı c ı l arı kul l anma nedenl erimiz den b irisi v erilere a nla mla r
yük lek leyerek , pro g ra m iç erisinde k o la y o k u na b ilmelerini v e a nla ş ı la b ilmelerini
sa ğ la ma k tı r.
Ö rnekl erimiz de b u konuyu çok dah a iyi anl ı yac aksı nı z . Bir N umaral andı rı c ı tanı ml amak
için aş ağ ı daki söz diz imi (syntax ) kul l anı l ı r.
K apsam b el irteçl eri protec ted, pub l ic , private, internal yada new değ erini al ı r ve
numaral andı rı c ı nı n geçerl i ol duğ u kapsamı b el irtir. D ikkat edil ec ek ol ursa, el emanl ara
h erh angi b ir değ er ataması yapı l mamı ş tı r. N itekim b u numaral andı rı c ı l arı n öz el l iğ idir. İ l k
el eman 0 değ erine sah ip ol mak ü z ere diğ er el emanl ar 1 ve 2 değ erl erini sah ip ol uc ak
ş ekil de b el irl enirl er. D ol ayı sı yl a programı n h erh angi b ir yerinde b u numaral andı rı c ı ya ait
el emana ul aş tı ğ ı mı z da, b u el emanı n index değ erine eriş miş ol uruz . G ördü ğ ü nü z gib i
numaral andı rı c ı kul l anmak okunurl uğ u arttı rmaktadı r.
D il ersek numaral andı rı c ı el emanl arı nı n 0 index inden değ il de h er h angib ir değ ere
b ağ l aması nı sağ l ayab il ir ve h atta diğ er el emanl arada f arkl ı index değ erl eri atayab il iriz .
Basit b ir numaral andı rı c ı örneğ i il e konuyu dah a iyi anl amaya çal ı ş al ı m.
using System;
namespace enumSample1
{
class Class1
{
enum Gunler
{
Pazartesi,
Sali,
Carsamba,
Persembe,
Cuma,
Cumartesi,
Pazar
}
Console.WriteLine("Çarsamba günün
degeri={0}",(int)Gunler.Carsamba);
}
Ş imdi b aş ka b ir örnek gel iş tirel im. Bu kez numaral andı rı c ı nı n değ erl eri f arkl ı ol sun.
using System;
namespace enumSample
{
class Class1
{
enum Artis
{
Memur = 15,
Isci = 10,
Muhendis = 8,
Doktor = 17,
Asker = 12,
}
D ikkat edic ek ol ursak, numaral andı rı c ı l arı program içinde kul l anı rken, açı k ol arak(ex pl ic it)
b ir dönü ş ü m yapmaktayı z . Ş u ana kadar numaral andı rı c ı el emanl arı na integer değ erl er
atadı k. A ma dil ersek L ong tipinden değ er de atayab il iriz . F akat b u durumda enum‘ in
değ er tü rü nü de b el irtmemiz gerekmektedir.Ö rnegin:
using System;
namespace enumSample
{
class Class1
{
G örü l dü ğ ü gib i Sı nı rl arl ar isiml i numaral andı rı c ı l ong tipinde b el irtil miş tir. Bu sayede
numaral andı rı c ı el emanl arı na l ong veri tipinde değ erl er atanab il miş tir. D ikkat edil ec ek b ir
diğ er nokta ise, b u el emanl ara ait değ erl eri kul l anı rken, l ong tipine dönü ş tü rme
yapı l ması dı r.
Bir numaral andı rı c ı varsayı l an ol arak integer tiptedir. Bu nedenl e integer değ erl eri ol an
b ir numaral andı rı c ı tanı ml anı rken int ol arak b el irtil mesine gerek yoktur.
Ş imdi dah a çok ise yarar b ir örnek gel iş tirmeye çal ı sal ı m. U ygul amamı z son derec e b asit
b ir f orma sah ip ve b ir kaç satı r koddan ol uş uyor. A mac ı mı z numaral andı rı c ı kul l anmanı n
programc ı açı sı ndan iş l eri dah a da kol ayl aş tı rı yor ol ması . U ygul amamı z b ir W indow s
A ppl ic ation. F orm tasarı mı mı z aş ağ ı daki gib i ol uc ak.
F orm yü kl enirken Ş eh ir K odl arı nı n yer al dı ğ ı c omb oBox kontrol ü mü z otomatik ol arak
numaral andı rı c ı nı n yardı mı yl a dol durul uc ak. I ş te program kodl arı :
using System;
namespace enumSample
{
class Class1
{
comboBox1.Items.Add(AlanKodu.Ankara);
comboBox1.Items.Add(AlanKodu.Avrupa);
comboBox1.Items.Add(AlanKodu.Izmir);
}
İ ş te sonuç:
A sl ı nda b u c omb oBox kontrol ü nü b aş ka ş ekil l erde de al an kodl arı il e yü kl eyeb il iriz . Bunu
yapmanı n sayı sı z yol u var. Burada ası l dikkat etmemiz gereken nokta numaral andı rı c ı
sayesinde b u sayı sal kodl arl a kaf amı z ı karı ş tı rmak yerine dah a b il inen isiml er il e aynı
sonuc a ul aş mamı z dı r.
G el dik b ir makal emiz in dah a sonuna. İ l erl iyen makal el erimiz de b u kez yine kendi değ er
tipl erimiz i nası l yaratab il ec eğ imiz e struc t kavrami il e devam edec eğ iz . Hepiniz e mutl u
gü nl er dil erim.
M ic ros of t . N E T Programlama D illeri
Bu yaz ı da M ic rosof t dotN E T il e b irl ikte programc ı l ara sunul un gel iş tirme dil l eri ü z erinde
durul muş tur. Bu yaz ı Temmuz 2003' te M SD N de yayı nl anan M ic rosof t P rogramming
L anguages yaz ı sı ndan Tü rkçe' ye çevril miş tir.
M ic ro so ft . N ET ' in Y a ra rla rı
M ic rosof t . N E T F ramew ork ,X M L W eb Servisi ve uygul amal arı nı n derl enip çal ı ş tı rı l ması
için gerekl i ol an M ic rosof t W indow s® b il eş enl erini içerir. Bu; b iz e gel iş tirdiğ imiz
uygul amal arda
• yü ksek b ir verim ,
• standart b ir al t yapı ,
• internet uygul amal arı nda kul l anab il me ve çal ı ş tı rmanı n rah atl ı ğ ı nı getirir.
Sanatçı l ar çal ı ş ı rken b ul undukl arı ortam ve araçl ar, sanatçı l arı n tec rü b el erini ve
kiş il ikl erini yansı tı r. A ynı yaz ı l ı m uz manl arı gib i onl arda b il dikl eri dil i ve eğ itiml erini göz
önü ne al arak çal ı ş ı rl ar. Tü m yaz ı l ı m uz manl arı nı memnun edec ek b ir dil h enü z yoktur.
P rogramc ı l ar, doğ uş tan f arkl ı b ir kiml iktirl er: kı smen b il im adamı , kı smen sanatçı , h er
z aman dik kaf al ı , ve h ep dah a iyisini araş tı ran insanl ardı r. Buna rağ men modern
programl ama dil l erinin eksikl ikl erini kab ul ederl er.
"Biz h er z aman, yarı m mil yon veya 50 mil yon V B(V isual Basic ) b il en programc ı ya sah ip
ol ac ağ ı z . Biz im, .N E T ' de V B miz var. V e b iz im simdi, . N E T' de Java dil imiz ve h atta,
CO BO L dil imiz b il e var! Bunun ne demek ol dugunu tah min et? " -T im H uckab y, b askan
ve CE O , I nterknow l ogy
P rograml ama dil l eri personel al ı mı nda öneml i b ir f aktördü r. Bir yaz ı l ı m uz manı nı n b il diğ i
dil den b aş ka b ir dil i kul l anmaya geçmesi z ordur. .N E T yapı sı nı n gü c ü il e b ir kaç dil i içinde
b arı ndı ran b ir pl atf orm sağ l ar. P rogramc ı l ar b u pl atf orm da-C+ + , O b j ec tive C, F ortran,
CO BO L , V isual Basic ® , P erl -' in h er b iri il e gü çl ü yaz ı l ı m gel iş tiril eb il irl er.
Bu b öl ü mde M ic rosof t' un dört f arkl ı programl ama dil i sunduğ unu ve b unl arı tek b ir
ortamda nası l b irl eş tirdiğ ini görec eğ iz .
• V isual Basic .N E T , dü nyanı n en popü l er gel iş tirme arac ı nı n ve dil inin en son
uyarl aması dı r. V isual Basic .N E T, vaz geçil emez veriml il igi tesl im eden, ve
task(görev)-oriented(yönel iml i) programl ama için eş siz öz el l ikl er sunan b ir dil dir.
• V isual C+ + dil i, pow er(gü ç)-oriented(yönel iml i) gü çl ü uygul amal ar gel iş tiril eb il en ,
f arkl i teknol oj il erl e köprü kurab il en, h em w indow s doğ al dil ine h emde(assemb l y)
.N E T ara dil ine(I L ) derl eneb il en maksimum perf ormans karekteristikl erine ve
yü ksek f onksiyonal iteye sah ip b ir dil ol arak karş ı mı z a çı kar.
Burada M ic rosof t, programl ama dil l erindeki geniş dil seçeneğ inin gel iş tiric il ere uygunl uğ u
il e dikkat çeker. M ic rosof t.N E T, programc ı l arı b u yeni pl atf ormda b irl eş tirmek için eğ itim
ve çöz ü me dah a h ı z l ı ul aş mayı sagl amada onl ara yardı m etme imkanı da sunar.
Vis u al B as ic . N E T
V isual Basic 1.0, W indow s' un gel iş mesi ve dah a geniş b ir kul l anı c ı sayı sı na ul aş ması ve
gü nü mü z deki veriml il iğ ine kavuş ması için b ir devrim yarattı . Böyl e z engin b ir tarih e sah ip
ol an V B , okunab il ir b ir syntax , sez gisel b ir arayü z ü n ve al etl erin ol dugu , task-
oriented(görev yönel iml i) yapı sı il e h ı z l ı b uil d edil eb il mesi il e ve .N et il e yeni b ir
yapı l andı rmaya kavuş muş tur. V isual Basic .N E T dil inede diğ er popul ar dil l er gib i h er tü r
W indow s uygul aması , W E B,ve mob il e al etl er için uygul ama yapab il me yetenekl eri
ekl endi.
D eadl ine(Son tesl im) tarih l eri, yaz ı l ı m sanayisine yeni ol an b ir ş ey değ il dir. P rogramc ı l arı n
b ü yü k b ir grub u için, deadl ine tarih l eri, gü nl ü k h ayatı n b ir gerçeğ idir. P rogramc ı l ar
çoğ unl ukl a, pl an yaparken ,iş in gereksiniml erini karş ı l ayac ak h ı z l ı b ir yol un çöz ü mü nü
ararl ar. Baz i çöz ü ml er , b u ortaml ar yaratı l ı rken dikkatl ic e test edil ec ek, dah a sonra
uygul ama b u tarz yapı l arda h emen kul l anı l ac aktı r. U ygul ama gel iş tirme uz manı nı n
prob l eml erde çöz ü me odakl anması için b ir dah aki iş veril ene kadar serb est b ı rakı l ması
gerekir. Task-O riented b ir gel iş tirme ortamı , ortam f arkl ı l ı kl arı ndan programc ı yı
kurtarmak için kab ul edil eb il ir b ir yöntemdir.
G el ec ek kuş ak uygul amal arı ve servisl eri b irl eş tirerek .N E T ortamı nda araş tı rma yapmak
isteyen aş ağ ı daki tipteki programc ı l ar için V isual Basic .N E T ideal b ir dil dir.
• S ezg isel v e eriş eb ilirlik ö zelliğ i yük sek o la n b ir dille g eliş tirme ya pma k isteyen
pro g ra mc ı la r : V isual Basic .N E T, gel iş tiric il erin b ü yü k b ir b öl ü mü ne ul aş ab il mek için
tasarl anmı ş tı r. Bu nedenl e h em uz manl ara, h em de yeni b aş l ayanl ara öneril ir. Y eni
b aş l ayanl ar, V isual Basic ortamı nı n ve V isual Basic dil inin b irçok b enz ersiz öz el l igini
f aydal ı b ul ac aktı r.
V B.N E T, uygul ama ü retkenl iğ ini h ı z l andı rac ak diğ er .N E T dil l erinde ol mayan b ir takı m
öz el l ikl eri içinde b arı ndı rı r.
• Değ iş k enlere v a rsa yı la n ilk değ er v erme :V B.N E T' te değ iş kenl eri kul l anı l madan
önc e onl ara il k değ er veril me z orunl ul uğ u yoktur. Bu yü z den yeni b aş l ayan b ir çok
programc ı nı n diğ er dil l erde ol duğ u gib i kaf ası karı ş mayac aktı r.
• V a rsa yı la n pu b lic eriş imi :V isual Basic .N E T sı nı f inı n ü yel e el emanl arı varsayı l an
ol arak pub l ic ol duğ u için programc ı l ara sez gisel gü c ü f az l a ol an b ir öz el l ik sunar.
• S ha red üye elema nla rı nı k u lla nma :Sh ared(C# taki static ) ü ye el emanl arı na h em
sı nı f ı n ismi ü z erinden h em de il gil i sı nı f nesnel erinden eriş il eb il ir. Bu da programc iya dah a
esnek b ir yapı sunar. Ö rneğ in
• O psiyo nel pa ra metreler : V isual Basic .N E T programc ı l arı nesne yönel iml i
programl ama tekniğ inin b ü tü n nü ansl arı nı b il meye gerek kal madan esnek sı nı f yapı l arı
tasarl ayab il ir. Ö rneğ in sı nı f tasarı mc ı l arı opsiyonel parametrel eri kul l anarak dah a esnek
sı nı f l ar tasarl ayab il irl er.
• P a ra metreli Ö zellik ler : V isual Basic .N E T te öz el l ikl er C# taki karş ı l ı ğ ı ndan f arkl ı
ol arak parametrel i ol ab il ir. Böyl ec e öz el l ikl er dah a esnek b ir yapı sunmuş ol ur.
• Dec la ra tiv e ev ent ha ndlers : V isual Basic .N E T' te ol ayl ara il iş ikin metotl arı b il dirirken
Handl es anah tar söz c ü ğ ü kul l anı l ı r.
• A ra yüz üye elema nla rı nı n yeniden b ildirilmesi : V B.N E T' te impl emente edil en b ir
arayü z ü n ü ye el emanı nı n ismi arayü z ü uygul ayan sı nı f taraf ı ndan değ iş tiril eb il ir.
V isual Basic .N E T programc ı l ara dah a çok yarar sağ l ayac ak b ir tasarı ma, uygul ama ve
servis yaz makta kol ay b ir ortam sağ l ar. Bu sadec e V isual Basic .N E T' i degil tü m .N E T
pl atf ormunu kapsar.
A rka pl anda kodun derl enmesi : G el iş tirme ortamı siz çal ı ş ı rken arka pl anda kodunuz u
derl er ve eğ er kodda h ata varsa b unu siz e l istel er.
V isual Basic . N E T otomatik ol arak yaz dı ğ ı nı z kodu dü z enl er ve kaydeder. O tomatik ol arak
dü z enl erken kodun durumu , anah tar söz c ü kl erin durumunu ve değ iskenl eri h iz al ayab il ir.
Bu da çok f az l a if adenin kul l anı l dı ğ ı duruml arda yanl ı ş if adel erin yada f ormatsı z if adel erin
dü z gü n görü l mesini sağ l ar.
P erfo rma ns
Son öneml i nokta perf ormanstı r.V isual Basic . N E T derl eyic isinin ü rettiğ i ara kod, C#
derl eyic isinin ü rettiğ i I L kodu il e aynı perf ormansa sah iptir.
Vis u al C+ +
Ç oğ unl ukl a yaz dı ğ ı programl ardan gü ç b ekl entisi ol an programc ı l arı n b u pl atf ormun tü m
öz el l ikl erinden f aydal anması mü mkü ndü r.CL R ve . N E T al tyapı sı nı n pek çok f aydal arı na
rağ men, b az ı programc ı l ar h al a uygul amal arı gel iş tirirken, W indow s iş l etim sisteminin
tü m geniş l ik ve derinl ikl erine gü venerek uygul amal arı nı ol uş tururl ar. G el eneksel ol arak
programc ı l ar, sistem veriml il iğ ini en iyi kul l anan kodu yaz mak sistem taraf ı ndan sağ l anan
kaynakl ara(disk,h af ı z a) en etkil i eriş imi sağ l amak amac ı yl a V isual C+ + ortamı nı
seçmiş l erdir. V isual C+ + .N E T b u gel eneksel yönteml erin devamı nı sağ l amayı
h edef l emiş tir. Tab i b unu yaparken W in32 A P I den sı kl ı kl a f aydal anı r. C+ + .N E T aynı
z amanda .N E T F ramew ork ve yönetil eb il ir CL R nin b ir çok imkanı na eriş meyi de sağ l ar.
Bir çok durumda gel iş tiric il er, iş l etim sisteminin sağ l adı ğ ı b ü tü n imkanl ara eriş mek
isterl er. M ic rosof t, b u imkanl ardan soyutl anmı ş yada tamamen b u imkanl ar ü z erine
kurul muş değ iş ik araçl ar tasarl amı ş tı r. Bugü n itib ariyel .N E T f ramew ork sağ l am uygul ama
gel iş tirmek için b u imkanl arı n b irçoğ unu sunarken yinede iş l etim sisteminin b ü tü n
yetenekl erini içinde b arı ndı rmaz . G ü ç yönel iml i(P ow er-O riented) gel iş tirme araçl arı ,
programc ı l ara b u dil in tü m öz el l ikl erinin yanı nda, uygul amanı n gerektirdiğ i çöz ü ml erin de
kol ayc a çöz ü me kavuş ab il ec eğ i kü tü ph anel eri sağ l ar.
• G ö steric iler( P o inters) : G österic il er, C + + gel iş tiric il erine makinenin yerel h af ı z ası na
doğ rudan eriş eb il mesini sağ l ar ve b öyl ec e en yü ksek seviyede perf ormans el de edil ir.
• I ntrinsic s : I ntrinsic s' l er, gel eneksel programl ama teknikl erinde ol mayan b ir takı m
yeni öz el l ikl ere eriş meye imkan sunar. Ö rneğ in M M X ve A M D 3D N ow ! registerl arı ve
komutl arı .
C + + . N ET G eliş tirme O rta mı na H a s Ö zellik ler
V isual C+ + .N E T 2003 gel iş tirme ortamı da dah a esnek ve dah a gel iş miş uygul amal ar
gel iş tirmek için b ir takı m öz el l ikl er sağ l ar.
• Derleyic iyi o ptimize etmek : V isual C+ + derl eyic isi b ir çok gel iş tirme seneryosu için
derl eme iş l emini optimiz e edeb il ir. Bu seneryol ardan b ir kaçı : M SI L ü retimi, kodun
çal ı ş c ağ ı sisteme öz gü n optimiz asyon, f l oating sayı h esapl amal arı nı n yoğ un ol duğ u
derl emel er.
• İ leri düzey ha ta ra po rla ma : U ygul amal ar daima programc ı l arı n h atal arı ndan
etkil enirl er. M inidump teknol oj isiyl e V isual C+ + gel iş tirme ortamı , uygul ama gel iş tirme
uz manl arı na h atal arı n kol ayc a b el irl enmesine yardı mc ı ol ur. Üstel ik derl enmiş kodda b il e
b u h atal ar kol ayl ı kl a rapor edil eb il ir.
• G eliş miş ha ta a yı k la ma ( deb u g ) : V isual Studio h ata ayı kl ayı c ı sı aynı anda h em
native h emde yönetil eb il ir kodda h ata ayı kl ama desteğ ini b enz er b ir ş ekil de sunar.
G el ec ekte, V isual C + + . N E T P rogramc il ara yardim etmek için dah a gü çl ü öz el l ikl eri
içerec ek.
• G eneric s : P arametrel i kod al goritmal arı nı yeniden kul l anı l ab il irl iğ ini sağ l amayı
h edef l eyen çal ı ş ma z amanı (run-time) teknol oj isi.
Vis u al C#
Bu iki dil in sunduğ u imkanl ar arası ndaki b oş l uğ u dol durmak için M ic rosof t kod odakl ı
uygul ama gel iş tirmeyi modern ve yenil ikçi b ir taz rda el e al an C# dil ini gel iş tirdi. C# , C+ +
söz diz imine b enz er b ir ş ekil de temiz ve gü z el b ir programl ama dil i sunarken aynı
z amanda V isual Basic dil inin ü retkenl iğ inide korur.
K o d O da k li G eliş tirme
P rogramc ı l arı n h epsi proj el erinde mutl aka b el l i öz el l ikl erde kod yaz arl ar. F akat
programc ı l arinin çoğ u z amanl arı nı n öneml i b ir kı smı nı sih irb az (w iz ard),kontrol ve tasarı m
araçl arı kul l anarak h arc arl ar ve b öyl ec e öneml i öl çü de b ir ü retkenl ik sağ l arl ar. Bu
öz el l iğ in programc ı l ar için tek kötü yanı sih irb az taraf indan ü retil en kodun
anl aş ı l ab il irl iğ inin az ol ması dı r.F akat programc ı l ar kodl arı nda anl aş ı l ı rl ı k ve veriml il ik
arasindaki terc ih l erinde gü veni terc ih ettil er.
A yrı c a kod odakl ı gel iş tirme yapan programc ı l ar b aş kal arı taraf indan doğ ru tasarl anmı ş
kodu yeniden yaz maya yönel ir ve b u dah a az b il gil i programc ı l arı n pratik ol arak iyi kod
gel iş tireb il mesindeki karmaş ı kl ı ğ ı dü z el tir.
G el ec ek kuş ak uygul amal arı ve servisl eri b irl eş tirerek .N E T ortamı nda araş tı rma yapmak
isteyen aş ağ ı daki tipteki programc ı l ar için C# ideal b ir dil dir.
C# dil i, gel eneksel C+ + öz el l ikl erinin b ir çoğ unu destekl emektedir. Bu gel eneksel
öz el l ikl erin b ir çoğ u V isual C+ + ' taki ü retkenl iğ i artı rmak için de kul l anı l mı ş tı r.
• O v erlo a ding ( O pera tö r a ş ı rı yük leme) : Sı nı f kü tü ph anesi tasarı mc ı l arı operatörl eri
aş ı rı yü kl eyerek dah a sağ l am sı nı f l ar tasarl ayab il irl er.
• U sing ifa desi : P rogramc ı l ar, uygul amal arı nda b ul unan kaynakl arı dah a kontrol l ü b ir
ş ekil de yöneteb il mek için using anah tar söz c ü ğ ü nü kul l anı rl ar.
• G u v ensiz k o d( U nsa fe c o de) : C# , programc ı l ara gösteric i kul l anma imkanı tanı yarak
h af ı z aya direkt eriş imi sağ l ar. Her ne kadar gü vensiz kodda CL R yönetiminde ol sa da il eri
dü z ey programc ı l ar uygul amal arı nı n h af ı z a yönetimi ü z erinde söz sah ib i ol mal arı için
gü vensiz kod yaz ab irl er. Buna rağ men h af ı z a ü z erinde dah a etkil i b ir kontrol için V isual
C+ + kul l anı l ması dah a çok tavsiye edil ir.
• X M L dö k üma nta syo nu : P rogramc ı l ar, kodl arı na açı kl ayı c ı notl ar ekl emek için X M L
f ormatı ndaki b il diriml eri kul l anab il irl er.
• G eneric s : V arol an kodl arı n yeniden kul l anı l ab il irl iğ ini kol ayc a sağ l ayan C+ +
ş ab l onl arı na b enz er b ir yapı .
• Eriş ic iler ( I tera to rs) : K ol eksiyon tab anl ı sı nı f l arı n el emanl arı arası nda dah a h ı z l ı ve
kol ay b ir ş ekil de dol aş mamı z ı sağ l ayac ak yapı .
• A no nim( A no nymo u s) M eto tla r : Basit görevl eri temsil c il erl e dah a rah at b ir ş ekil de
el e al ac ak yöntem
Vis u al J #
M ic rosof t, V isual J# dil i il e JA V A dil ini .N E T ortamı na sokmuş ol du. M ic rosof t Java dil ine
.N E T ortamı nı n pratikl iğ ini getirdi ve okul l arda mü f redatl arı ol an programc ı l ara,
ögrenc il ere, ve prof esörl ere Java yapı sı nı muh af az a ederek onl arı n .N E T e h ı z l ı b ir ş ekil de
girmel erini sağ l adı . A yı rc a J# dil i w indow s tab anl ı uygul ama gel iş tiren V isual J+ + 6 .0
kul l anı c ı l arı na kol ayc a V isual J# .N et ortamı na geçeb il mel erinde kol ayl ı kl ar sagl adi.
C+ + gel iş tiric il erin sı kı l ı kl a karş ı l aş tı kl arı prob l eml er etkil i ve kol ay b ir sentaks yapı sı aynı
z amanda b enz er O O P f onksiyonel itesi il e JA V A il e gideril miş tir.Java il e uygul ama
gel iş tirenl erin .N E T ortamı nda uygul ama gel iş tirenil mel eri için en uygun dil J# ol arak
görü l mektedir. Java programc ı l arı dil değ iş tirmek z orunda kal madan .N E T f ramew ork teki
b ü tü n ol anakl ardan h ı z l ı b ir ş ekil de f aydal anma imkanı na kavuş muş tur.
• J a v a -dili g eliş tiric ileri : D ah a önc eden Java dil ini kul l anan b ir programc ı .N E T e
geçerken b ş ska b ir dil i öğ renmek istemeyeb il ir. V isual J# , .N E T pl atf ormunun getirdiğ i
öz el l ikl er il e j ava programc ı l arı nı n b il gil erini kul l anab il dikl eri rah at ve h ı z l ı b ir pl atf orm
sunar.
• J a v a dilinin sö z dizimi : Java gel iş tiric il eri b il dik b ir dil yapı sı il e karş ı l ac ak ve aynı
z aman .N E T in tü m imkanl arı ndan f aydal andı kl arı nı görec ekl er.
• S ı nı f k ütüpha nesi desteğ i : Bağ ı msı z ol arak gel iş tiril en ve b ir çok öz el l iğ i sunan Java
1.1.4 JD K versiyonundaki kü tü ph ane il e JD K 1.2 j ava.util de b ul unan h emen h emen
b ü tü n sı nı f l arı içerir.
• Ö zellik ler, temsilc iler( deleg a tes) v e o la yla r( ev ents) : .N E T gel eneksel JA V A söz
diz imi il e .N E T' in gü çl ü öz el l ikl erinden ol an event ,del egate, ve property yapı l arı nı
destekl er.
• J a v a do c Y o ru mla rı : J# , Javadoc kol arı ndaki yoruml ama stil ini destekl er. V isual J# .
N E T, kul l anı c ı l arı n HTM L A P I b el gesini yaratab il mesine ol anak kı l ar.
V isual J# .N E T direkt ol arak V isual Studio.N E T gel iş tirme ortamı na entegre b ir ş ekil de
çal ı ş ı r. D ol ayı sı yl a tasarl ama araçl arı , editörl er ve h ata ayı kl ayı c ı l ar V isual J# gel iş tirme
ortamı nda rah atl ı kl a kul l anı l ab il ir. A yrı c a h az l ih az ı rdaki JA V A programc ı l arı nı n .N E T' e
geçiş ini kol ayl aş tı rac ak b ir takı m araçl ar da vardı r.
• V isu a l J + + U pg ra de W iza rd : V isual J+ + gel iş tiric il eri proj el erini V isual J# ortamı
için upgrade edeb il irl er. Bu sih irb az proj e dosyal arı nı çevirir ve ol ası potansiyel sorunl ar
için kul l anı c ı yı b il gil endirir.
• I k ili dö nüstürüc ü : Bu araç, Java b yte kodunu, .N E T uygul amal arı nda kul l anmak
ü z ere M S.N E T assemb l y l erine dönü ş tü rü r.
Ö zet
P rograml ama dil l eri f akl i çöz ü ml er için kul l anı l ab il mektedir. Her dil kendi öz el l ikl erini ve
b el irl i b ir uygul amanı n ih tiyaçl arı nı karş ı l ayab il ec ek en uygun ortamı içerir. M ic rosof t
geniş b ir dil seçeneğ ini sunduğ u gel ismiş .N E T yapı sı il e yaz ı l ı m uygul amal arı nda dah a
sağ l am ve f onksiyonal ite sağ l amı ş b ul unmakta.
C#' t a Params ile D eğ iş ken S ayıd a Paramet re ile Ç alış ma
Bu makal emiz de, C# metodl arı nda öneml i b ir yere sah ip ol duğ unu dü ş ü ndü ğ ü m params
anah tar kel imesinin nası l kul l anı l dı ğ ı nı inc el emeye çal ı ş ac ağ ı z . Bil diğ iniz gib i metodl ara
veril eri parametre ol arak aktarab il iyor ve b unl arı metod içersinde iş l eyeb il iyoruz . A nc ak
parametre ol arak geçiril en veril er b el l i sayı da ol uyor. D iyel imki sayı sı nı b il mediğ imiz b ir
el eman kü mesini parametre ol arak geçirmek istiyoruz . Bunu nası l b aş arab il iriz ? İ ş te
params anah tar söz c ü ğ ü b u noktada devreye girmektedir. Hemen çok b asit b ir örnek il e
konuya h ı z l ı b ir giriş yapal ı m.
using S y st e m ;
na m e sp a c e P a r a m sS a m p l e 1
{
c l ass Cl ass1
{
/* b urada Carpim isiml i metodumuz a, integer tipinde değ erl er geçiril mesini
sağ l ı yoruz . params anah tarı b u metoda istediğ imiz sayı da integer değ er
geçireb il ec eğ imiz i if ade ediyor*/ pub l ic int Carpim(params int[]
deger)
{
int sonuc =1;
f or(int i=0;i< deger.L ength ;+ + i) /*M etoda gönderil en el emanl ar doğ al ol arak b ir
diz i ol uş tururl ar. Bu diz ideki el emanl ara b ir f or döngü sü il e kol ayc a eriş eb il iriz . D iz inin
el eman sayı sı nı ise L ength öz el l iğ i il e öğ reniyoruz .*/
{
sonuc *=deger[i]; /* Burada metoda geçiril en integer değ erl erin b irb irl eri il e
çarpı l ması nı sağ l ı yoruz */
}
return sonuc ;
}
P eki derleyici b u işlemi nasıl yap ıyor b irazda ondan b ah sedelim. C arp im isimli metoda değişik sayılarda p arametre
g önderdiğimizde, derleyici g önderilen p aramtetre sayısı kadar b oyuta sah ip b ir integ er dizi oluşturur v e du dizinin
elemanlarına sırası ile (0 index inden b aşlayacak şekilde) g önderilen elemanları atar. D ah a sonra aynı metodu b u
eleman sayısı b elli olan diziyi aktararak çağırır. cl.C arp im(8 ,5 ) satırını dü şü nelim; derleyici,
İlk adımda,
İkinci adımda,
diz i[0] =8
Bazı durumlarda p arametre olarak g eçireceğimiz değerler f arklı v eri tip lerine sah ip olab ilirler. Bu durumda p arams
anah tar sözcü ğü nü , ob j ect tip inde b ir dizi ile kullanırız. H emen b ir örnek ile g örelim. A ynı örneğimize G oster isimli
değer döndü rmeyen b ir metod ekliyoruz. Bu metod kendisine aktarılan değerleri console p enceresine yazdırıyor.
G örü ldü ğü g ib i G oster isimli metodumuza değişik tip lerde(int,F loat,D ecimal,b ool, S tring ) p arametreler
g önderiyoruz. İşte sonuç;
Şekil 2 . p arams ob j ect [ ] kullanı mı .
Ş imdi dilerseniz dah a işe yarar b ir örnek ü zerinde konuyu p ekiştirmeye çalışalım. Ö rneğin değişik sayıda tab loyu
b ir dataset nesnesine yü klemek istiyoruz. Bunu yap ıcak b ir metod yazalım v e kullanalım. P rog ramımız, b ir sq l
sunucusu ü zerinde yer alan h er h ang ib ir datab ase’ e b ağlanıp istenilen sayıdaki tab loyu ekranda p rog ramatik
olarak oluşturulan dataG rid nesnelerine yü kleyecek. K odları inceledikçe örneğimizi dah a iyi anlıyacaksınız.
U yg ulamamız b ir W indow s A p p lication. Bir adet tab C ontrol v e b ir adet Button nesnesi içeriyor. A yrıca p arams
anah tar sözcü ğü nü kullanan C reateD ataS et isimli metodumuzu içeren C dataS et isimli b ir class’ ımızda v ar. Bu
class’ a ait kodları yazarak işimize b aşlayalım.
using S ystem;
using S ystem.D ata;
using S ystem.D ata.S q lC lient;
da.F il l (dt );
ds .T ab l es .A dd(dt );
}
p u b l ic CD at aS et ()
{
}
}
}
p riv ate v oid b tnY ukle_ C lick(ob j ect sender, S ystem.E v entA rg s e)
{
CD at aS et c =n ew CD at aS et ();
D at aS et ds =n ew D at aS et ();
ds =c .Creat eD at aS et (" n o rt h w in d" , " P ro du c t s " , " O rders " );
G örü ldü ğü g ib i iki tab lomuzda yü klenmiştir. Burada tab lo sayısını arttırab ilir v eya azaltab iliriz. Bunu p arams
anah tar kelimesi mü mkü n kılmaktadır. Ö rneğin metodomuzu b u kez 3 tab lo ile çağıralım;
U muyorumki p arams anah tar sözcü ğü ile ilg ili yeterince b ilg i sah ib i olmuşsunuzdur. Bir sonraki makalemizde
g örü şmek dileğiyle h ep inize mutlu g ü nler dilerim.
C#'ta Özyenilemeli Algoritmalar (Recursion)
Ö z y en il em el i al go rit m al arda p ro b l em in en b as it h al i iç in ç ö z ü m b u l u n u r. B u e n ba s it
d urum a te m e l d urum ( ba s e c a s e ) d e n ir. E ğ er m et o d t em el du ru m iç in ç ağ ı rı l ı rs a
s o n u ç dö n deril ir D ah a karm aş ı k du ru m l ar iç in m et o d, t em el du ru m dan y ararl an ı l arak,
p ro b l em i ç ö z m ey e ç al ı ş ı r y an i ken din iç ağ ı rı r. K arm aş ı k du ru m l ar iç in y ap ı l an h er ç ağ rı
recursion step o l arak adl an dı rı l ı r.
int faktoriyel = 1;
n! = n * (n-1)!
D ah a aç ı k b ir y az ı m il e;
5! = 5 * 4 * 3 * 2 * 1
5! = 5 * (4 * 3 * 2 * 1)
5! = 5 * (4!)
A ş ağ ı da ş ekil de 5 ! in ö z y en il em el i b ir al go rit m ada n as ı l h es ab l an ac ağ ı n ı gö rü y o ru z . Ş ekl in
s o l u n da 5 ! ' den 1! ' l e kadar h er ö z y en il em el i ç ağ rı daki n ey in ç ağ rı l ac ağ ı s ağ da is e s o n u c a
u l aş ı l an a kadar h er ç ağ rı da dö n en değ erl er y eral ı y o r.
sayi * Faktoriyel(sayi-1)
S ı ra ö rn eğ im iz i b ir W in do w s u y gu l am as ı o l ac ak b iç im de p ro gram l ay al ı m . B u n u n iç in
ö n c el ikl e aş ağ ı da gö rdü ğ ü m ü z F o rm ' u t as arl ay al ı m . M et in ku t u s u n a tx tS a y i ve dü ğ m ey e
btn H e s a p l a is im l eri verm ey i u n u t m ay al ı m .
F o rm daki btn H e s a p l a is im l i dü ğ m ey e ç if t t ı kl ay al ı m dü ğ m en in Cl ic k o l ay ı n a c evap veren
m et o du y az al ı m .
MessageBox.Show(sonucMetin.ToString(),"Faktoriyel Hesabı");
}
K o d 3 : Ö r ne k p r o g r a m d a b t nH e s a p l a _ C l i c k ( ) m e t o d u
using S ystem;
class C lass1
{
static v oid M ain (string [ ] arg s)
{
Z aman z;
C onsole.W riteL ine ("K oşucu: "+ z.K osucu);
C onsole.W riteL ine ("S aat: "+ z.S aat.T oS tring ());
C onsole.W riteL ine ("D akika: "+ z.D akika.T oS tring ());
C onsole.W riteL ine ("S aniye: "+ z.S aniye.T oS tring ());
}
}
}
Z am an z ;
S at ı rı y erin e
Z am an z =n ew Z am an ();
Ş ekil 3 . N ew y ap ı l an dı rı c ı s ı il e il k değ er at am as ı .
s t ru c t y en i: Z am an
'Z a m a n ' : ty p e in in te rf a c e l is t is n o t a n in te rf a c e
using S ystem;
/ * Y ap ı için p arametreli b ir constructor metod tanımladık. Y ap ı içinde yer alan kosucuA di,saat,dakika,saniye
alanlarına ilk değerlerin atandığına dikkat edelim. Bunları atamassak derleyici h atası alırız. * /
/ * Bir dizi özellik tanımlayarak p riv ate olarak tanımladığımız asıl alanların kullanımını kolaylaştırıyoruz. * /
p ub lic string K osucu
{
g et
{
return kosucuA di;
}
set
{
kosucuA di =v alue;
}
}
class C lass1
{
static v oid M ain (string [ ] arg s)
{
/ * Z aman yap ısı içinde kendi yazdığımız p arametreli constuructorlar ile Z aman yap ısı örnekleri
oluşturuyoruz. Y ap tığımız b u tanımlamarın ardından b elleğin stack b ölg esinde derh al 4 adet değişken oluşturulur
v e değerleri atanır. Y ani kosucuA di,saat,dakika,saniye isimli p riv ate olarak tanımladığımız alanlar b ellekte stack
b ölg esinde oluşturulur v e atadığımız değerleri alırlar. Bu oluşan v eri dizisinin adıda Z aman yap ısı tip inde olan
Baslang ic v e Bitis değişkenleridir. * /
//
/ * Z aman yap ısı içinde tanımladığımız özelliklere erişip işlem yap ıyoruz. Burada elb ette
zamanları b irb irinden b u şekilde çıkarmak matematiksel olarak b ir cinayet. A ncak amacımız yap ıların kullanımını
anlamak. Bu satırlarda yap ı içindeki özelliklerimizin değerlerine erişiyor v e b unların değerleri ile semb olik işlemler
yap ıyoruz * /
C onsole.W riteL ine ("F ark {0 } saat, {1 } dakika, {2 } saniye",saatF ark,dakikaF ark,saniyeF ark);
}
}
}
1 ) .N E T F ram ew o rk S D K : Y ü kl ey eb il m ek iç in en az w in do w s N T 4 .0 S P 6 ku ru l u 3 2 M B
R A M ' l i b ir s is t em gerekm ekt edir.
2 ) V is u al S t u dio .N E T : Y ü kl ey eb il m ek ic in en az W in do w s 2 000 P ro f es s io n al S P 3 ve 9 6
M B R A M iç eren b ir s is t em gerekm ekt edir.
D iy el im ki el im iz de b ir W in do w s 9 8 iş l et im s is t em i y ü kl ü s is t em var. B u s is t em in b el l eğ i
de s adec e 3 2 M B o l s u n . B u ö z el l ikl ere s ah ip b ir s is t em ü z erin de .N E T p ro gram l arı y az m ak
is t ey el im . B u n u y ap ab il ir m iy iz ?
E ğ er .N E T p ro gram l arı n ı y az m an ı n t ek y o l u y u karidaki araç l ari ku l l an m ak o l s ay dı b u
s o ru n u n y an ı t ı " h ay ı r" o l ac akt ı . F akat .N E T p ro gram l arı n ı y az m an ı n b irkaç y o l u dah a var.
B u n l ardan b ir t an es i M o n o p ro j es i dah il in de gel iş t iril en C# derl ey ic is idir. h t t p : //w w w .go -
m o n o .c o m / adres in den p ro j ey l e il gil i b il gil ere ve gerekl i t ü m p ro gram l ara ü c ret s iz
u l aş ab il ir b il gis ay arı n ı z a in direb il irs in iz . m o n o ' n u n b u gü n ku t arih it ib ariy l e W in do w s ic in
0.2 8 s ü rü m ü m evc u t . M o n o ' n u n CL R al t y ap ı s ı il e b as it b ir u y gu l am ay i " m in t d e n 1. e x e "
ş ekl in de ç al ı ş t ı rm ak is t ediğ im de b en im b il gis ay arı m da " b el l ek y et ers iz " gib i b ir h at a verdi.
B u y ü z den M ic ro s o f t .N E T F ram ew o rk ku rm an ı z ı da t avs iy e ederim . M ic ro s o f t ' u n
s it es in den s o n .n et f ram ew o rk ku ru l u m do s y as ı n ı in dirrip ku rdu kt an s o n ra M o n o ' n u n
" m c s " derl ey ic is i il e derl edigin iz p ro gram l arı n o rm al W in do w s u y gu l am as ı ç al ı ş t ı rı y o rm u ş
gib i ç if t t ı kl ay arak ç al ı ş t ı rab il irs in iz . A ş ağ ı da b as it b ir ö rn ek gö rü l ü y o r.
c l as s den 1{
p u b l ic s t at ic vo id M ain (){
S y s t em .Co n s o l e.W rit eL in e(" den em edir." );
S y s t em .Co n s o l e.R eadL in e();
}
}
Ş e k i l 1 : M o no v e V S . N E T i l e d e r l e ne n u y g u l a m a l a r .
V S .N E T U y gu l am as ı n ı in dirm ek iç in t ı kl ay ı n .
M o n o il e derl en en u y gu l am ay ı in dirm ek iç in t ı kl ay ı n .
"
1) 1 s ay ı s ı n ı en ü s t s at ı rı n o rt as ı n daki karey e y erl eş t irerek b aş l ay al ı m .
4) 2 . ve 3 . b as am akl arı u y gu l am ay ı s ü rdu rerek s ih irl i karedeki diğ er s ay ı l arı n y erl erin i
b u l al ı m ."
[" Y aş ay an M at em at ik" , s .5 3 ]
T a v s iy e l e r
M o n o ' n u n res m i s ay f as ı
M o n o s em in eri s l ay t l arı
R e f e ra n s
R ec t an gl e rec t = Cl ien t R ec t an gl e;
if (M ax im u m ! =M in im u m )
{
rec t .W idt h =(V al u e-M in im u m )* 100/(M ax im u m -M in im u m )* rec t .W idt h /100;
}
if (S t y l e==S t y l es .N o rm al )
{
Co n t ro l P ain t .D raw B o rder3 D (e.G rap h ic s , Cl ien t R ec t an gl e, B o rder3 D S t y l e.S u n ken );
D ikkat edec eğ in iz gib i s t an dart b ir P ro gres s B ar’ ı n y ap ac ağ ı iş l em l eri gerç ekl eş t irdik. Ş im di
as ı l am ac ı m ı z X P s it il l erin in u y gu l an m as ı o l du ğ u n a gö re b u aş am ay a geç el im .
b o o l I s T h em edo s ()
{
if (E n viro n m en t .O S V ers io n .P l at f o rm ! = P l at f o rm I D .W in 3 2 N T
ret u rn f al s e;
ret u rn t ru e;
}
BO O L I s Ap p T h e m e d ( V O I D) ;
B u A p i b ir ko n t ro l f o n ks iy o n u du r. u y gu l am am ı z ı n vis u al s it il l eri u y gu l ay ı p
u y gu l am ay ac ağ ı n ı s o rgu l ar.
BO O L I s T h e m e Ac tiv e ( V O I D) ;
B u da b aş ka b ir ko n t ro l f o n ks iy o n u du r. V is u al s it il l erin u y gu l am am ı z iç in akt if o l u p
o l m adı ğ ı n ı den et l er.
H R E S U L T Dra w T h e m e Ba c k g ro un d (
H T H E M E h T h em e,
H DC h d c,
in t iP a rtI d ,
in t iS ta teI d ,
c o n s t R E CT *pR ect,
c o n s t R E CT *pC l ipR ect
) ;
U y gu l am am ı z ı n b el ki de en c an al ı c ı A p i s i b u du r. B u f o n ks iy o n l a vis u al s it il l erin ç iz im
iş l em in i gerç ekl eş t iriy o ru z . D ö n ü ş değ eri in t eger dir. P aram et rel erin e gel in c e:
h T h em e: O p en T h em eD at a f o n ks iy o n u il e el de et t iğ im iz I n t P t r değ erin i ku l l an ac ağ ı z .
in t Co u n t = ((rc .W idt h )/(s egw idt h + 2 ))+ ((rc .W idt h < =0)? 0: 1);
K ey değ erl eri t ekt ir ve değ iş t iril em ez l er. Y an i b ir key -val u e ç if t in i ko l eks iy o n u m u z a
ekl ediğ im iz de, b u değ er ç if t in in val u e değ erin i değ iş t ireb il irken , key değ erin i
değ iş t irem ey iz . A y rı c a key değ erl eri b en z ers iz o l du kl arı n da t am an l am ı y l a b irer an ah t ar
al an vaz if es i gö rü rl er. D iğ er y an dan val u e değ erl in e n u l l değ erl er at ay ab il irken , an ah t ar
al an n it el iğ in deki K ey değ erl erin e n u l l değ erl er at ay am ay ı z . Ş ay et u y gu l am am ı z da
varo l an b ir K ey değ erin i ekl em ek is t ers ek A rgu m en t E x c ep t io n is t is n as ı il e karş ı l aş ı rı z .
Ş e k il 1 . F o r m T a s a r ım ım ız .
Ş im di ko dl arı m ı z a b ir gö z at al ı m .
S y s t em .Co l l ec t io n s .H as h t ab l e h t T ekn ikS o z l u k; /* H as h T ab l e ko l eks iy o n n es n em iz i
t an im l iy o ru z .* /
deger=h t T ekn ikS o z l u k[l s t A n ah t ar.S el ec t edI t em .T o S t rin g()] .T o S t rin g(); /*
H as h T ab l e' daki b ir degere u l as m ak iç in , kö s el i p aran t ez l er aras in da aran ac ak key
degerin i giriy o ru z . S o n u c u b ir s t rin g degis ken in e akt ariy o ru z .* /
Ş im di u y gu l am am ı z ı ç al ı ş t ı ral ı m .
Ş e k i l 2 . P r o g r a m ı n Ç a l ı ş m a s nı nı n s o nu c u .
S e k i l 1 . S t a c k K o l e k s i y o n S ı nı f ı nı n Ç a l ı ş m a Y a p ı s ı
S im di dil ers en iz , b as it b ir c o n s o l e u y gu l am as i il e b u ko n u y u an l am ay a ç al is al im .
u s in g S y s t em ;
u s in g S y s t em .Co l l ec t io n s ; /* U y gu l am al arim iz da ko l eks iy o n s in if l arin i ku l l an ab il m ek iç in
Co l l ec t io n s is im u z ay in i ku l l an m am iz gerekir.* /
n am es p ac e S t ac kS am p l e1
{
c l as s Cl as s 1
{
}
}
}
3 . S t a c k ile ilg ili p r o g r a m ın e k r a n ç ık t ıs ı
u s in g S y s t em ;
u s in g S y s t em .Co l l ec t io n s ;
n am es p ac e Q u eu eS am p l e1
{
c l as s Cl as s 1
{
s t at ic vo id M ain (s t rin g[] args )
{
Q u eu e q u =n ew Q u eu e(4 );
}
}
}
u s in g S y s t em ;
n am es p ac e R ef l ec t io n S am p l e1
{
c l as s Cl as s 1
{
s t at ic vo id M ain (s t rin g[] args )
{
T y p e t ip im iz =T y p e.G et T y p e(" S y s t em .I n t 3 2 " );/* Ö n c el ikl e S t rin g s in if in in t ip in i
ö gren iy o ru z . * /
T a b l o 1 . R e f l e c t i o n U z a y ı nı n D i ğ e r K u l l a nı ş l ı S ı nı f l a r ı
u s in g S y s t em ;
n am es p ac e R ef l ec t io n S am p l e2
{
c l as s Cl as s 1
{
s t at ic vo id M ain (s t rin g[] args )
{
S y s t em .D at a.D at aT ab l e dt =n ew S y s t em .D at a.D at aT ab l e(); /* B ir D at aT ab l e
ö rn egi(in s t an c e) y arat iy o ru z .* /
S y s t em .R ef l ec t io n .P aram et erI n f o []
p rm I n f o =t ip M et o dl ari[i] .G et P aram et ers ();
/* B u s at irda is e, i in deks l i m et o da ait p aram et re b il gil erin i G et P aram et ers
m et o du il e al iy o r ve R ef l ec t io n u z ay in da b u l u n an P aram et erI n f o s in if i t ip in den b ir diz iy e
akt ariy o ru z . B ö y l ec e il gil i m et o du n p aram et rel erin e ve p aram et re b il gil erin e
eris eb il ic ez .* /
R ef l ec t io n t ekn ikl eri y ardı m ı y l a ç al ı ş t ı rdı ğ ı m ı z p ro gram a ait s ı n ı f l arı n da b il gil erin i el de
edeb il iriz . İ z l ey en ö rn eğ im iz de, y az dı ğ ı m ı z b ir s ı n ı f a ait ü y e b il gil erin e b akac ağ ı z .
u s in g S y s t em ;
n am es p ac e R ef l ec t io n S am p l e3
{
p u b l ic c l as s O rn ekS in if
{
p rivat e in t deger;
p u b l ic in t D eger
{
get
{
ret u rn deger;
}
s et
{
deger=val u e;
}
}
in t y as =2 7 ;
s t rin g do gu m =" is t an b u l " ;
}
}
ikin c i s ı n ı f ı m ı z ı n ko dl arı ;
u s in g S y s t em ;
u s in g S y s t em .R ef l ec t io n ;
n am es p ac e R ef l ec t io n S am p l e3
{
c l as s Cl as s 1
{
s t at ic vo id M ain (s t rin g[] args )
{
T y p e t ip im iz =T y p e.G et T y p e(" R ef l ec t io n S am p l e3 .O rn ekS in if " );
f o r(in t i=0;i< T I P U Y E L E R I .L E N G T H ;+ + I )
{
Co n s o l e.W rit eL in e(" U y e adi: " + t ip U y el eri[i] .N am e.T o S t rin g()+ " | U y e
T ip i: " + t ip U y el eri[i] .M em b erT y p e.T o S t rin g());
}
}
}
}
Ş im di u y gu l am am ı z ı ç al ı ş t ı ral ı m .
Ş e k i l 3 . K e nd i y a z d ı ğ ı m ı s ı nı f ü y e l e r i ne d e b a k a b i l i r i z .
u s in g S y s t em ;
u s in g S y s t em .R ef l ec t io n ;
u s in g S y s t em .D at a;
u s in g S y s t em .D at a.S q l Cl ien t ;
n am es p ac e R ef l ec t D o l du r
{
p u b l ic c l as s K it ap
{
p u b l ic s t rin g B as im E vi
{
get
{
ret u rn y ay im c i;
}
s et
{
y ay im c i=val u e;
}
}
f o r(in t i=0;i< P R O P I N F O S .L E N G T H ;+ + I )
{
if (p ro p I n f o s [i] .Can W rit e) /* B u rada ö z el l igim iz in b ir S et b l o gu n a s ah ip o l u p
o l m adigin a b akil iy o r. Y an i ö z el l igim iz en y az il ab il ir o l u p o l m adigin a. B u n u s agl ay an
ö z el l igim iz Can W rit e. E ger ö z el l ik y az il ab il ir is e (y ada b as ka b ir dey is l e reado n l y degil is e)
t ru e degerin i dö n dü rü r.* /
{
t ry
{
if (dr[p ro p I n f o s [i] .N am e] ! =n u l l ) /* dat aR o w degis ken in de, ö z el l igim in
adin daki al an in degerin e b akil iy o r. N u l l deger degil is e S et V al u e il e al an in degeri
ö z el l igim iz e y az diril iy o r. * /
{
p ro p I n f o s [i] .S et V al u e(t h is , dr[p ro p I n f o s [i] .N am e] , n u l l );
}
el s e
{
p ro p I n f o s [i] .S et V al u e(t h is , n u l l , n u l l );
}
}
c at c h
{
p ro p I n f o s [i] .S et V al u e(t h is , n u l l , n u l l );
}
}
}
}
}
f o reac h (D at aR o w dro w in dt K it ap .R o w s )
{
t h is .I n n erL is t .A dd(n ew K it ap (dro w ));
}
}
V e iş t e f o rm u m u z da ku l l an dı ğ ı m ı z t ek s at ı rl ı k ko d;
Ş im di u y gu l am am ı z ı ç al ı ş t ı ral ı m ve b akal ı m .
Ş e k i l 4 . P r o g r a m ı n Ç a l ı ş m a s ı nı n S o nu c u
C: \W I N D O W S \M ic ro s o f t .N E T \F ram ew o rk\v1.1.4 3 2 2
E ğ er o u t p aram et res in i ku l l an m ay ı p ko m u t u
P ro j e T ip l e ri v e ta rg e t p a ra m e tre s i
y ada
E ğ er kay n ak ko du m u z u ç al ı ş t ı rı l ab il ir b ir u y gu l am a y erin e b ir kü t ü p h an e do s y as ı o l ac ak
ş ekil de derl em ek is t iy o rs ak aş ağ ı daki ko m u t u ku l l an m al ı y ı z .
R e f e ra n s Bil g il e ri v e R e s p o n s e Do s y a l a rı
De rl e y ic i P a ra m e tre l e rin e T o p l u Ba k ı ş
A ş ağ ı daki l is t ede c s c derl ey ic is i il e ku l l an ı l ab il ec ek b ü t ü n p aram et rel erin ku l l an ı m ı ve
aç ı kl am as ı veril m iş t ir.
P a ra m e tre K ul l a n ı m ı
K ay n ak ko du n derl en m es in i s ağ l ar an c ak h erh an gi b ir
/n o o u t p u t ç al ı ş t ı rı l ab il ir do s y a o l u ş t u rm az . B u p aram et re dah a ç o k
kay n ak ko dda h at a ay ı kl am a iç in ku l l an ı l m akt adı r.
D erl em e z am an ı n da ö n iş l em c i s em b o l ü o l u ş t u rm ak iç in
/def in e: S E M B O L
ku l l an ı l ı r. K ay n ak ko d iç eris in den y ap ı l an # def in e ö n iş l em c i
/d: S E M B O L
ko m u t u n a karş ı l ı k gel m ekt edir.
H at a ay ı kl am ada ku l l an ı l ac ak do s y al arı n o l u ş t u ru l m as ı iç in
ku l l an ı l an p j aram et redir. E ğ er deb u ggin g iş l em in i akt if h al e
get irm ek is t iy o rs ak b u p aram et rey i ku l l an m am ı z gerekir.
/deb u g /deb u g ve /deb u g+ p aram et rel eri eş değ erdedir. H at a
/deb u g+ ay ı kl am a iş l em i vars ay ı l an o l arak akt if du ru m da değ il dir.
/deb u g- /deb u g p aram et res in in ay rı c a f u l l ve p db o n l y ş ekl in de iki
s eç en eğ i vardı r. E ğ er f u l l s eç ec eğ i /deb u g: f u l l ş ekl in de
y az ı l ı rs a h at a ay ı kl ac ı p ro gram ı ç al ı ş t ı rı l an p ro gram il e
il iş kil en diril ir.
A rit m et ik t aş m a iş l em l erin de is t is n ai b ir du ru m u n o l u ş u p
o l u ş m ay ac ağ ı n ı b il diren p aram et redir. V ars ay ı l an o l arak b u
/c h ec ked
akt if du ru m da değ il dir. K ay n ak ko d iç eris in de b u iş l em i
/c h ec ked+
c h ec ked an ah t ar s ö z c ü kl erin i ku l l an arakt a y ap ab il iriz . E ğ er
/c h ec ked-
t aş am o l du gu n da is t is n ai du ru m u n o l u ş m as ı n ı is t iy o rs ak
/c h ec ked y ada /c h ec ked+ p aram et res in i ku l l an m al ı y ı z .
/h el p
D erl ey ic i p aram et rel eri il e il gil i y ardı m b il gil erin in
y ada
gö rü n t ü l en m es in i s ağ l ay an p aram et rel erdir.
/?
/in c rem en t al
D erl em e iş l em in in o p t im iz e edil m iş b iç im de m ey dan a
/in c rem en t al +
gel m es in i s ağ l ay an p aram et rel erdir. Ş ö y l eki, b ir ö n c eki
/in c rem en t al -
derl em e b il gil eri .db g ve .p db do s y l arı n da t u t u l arak y en i
derl em e iş l em l erin de s adec e değ iş t iril en m et o t l arı n
y ada
y en in den derl en m es i s ağ l an ı r. F arkl ı iki derl em e iş l em i
aras ı n daki f arkl ar is e .in c r do s y as ı n da s akl an ı r. V ars ay ı l an
/in c r
o l arak b u p aram et re akt if du ru m da değ il dir. /in c rem en t al
/in c r+
il e /in c rem en t al + p aram et rel eri eş değ erdedir.
/in c r-
/l in kres o u rc e: do s y a_ adi
B el irt il en .N E T kay n ak(res o u rc e) do s y as ı n a b ir b ağ l an t ı
o l u ş t u rm ak iç in b u p aram et rel er ku l l an ı l ab il ir.
/l in kres : do s y a_ adi
V a l ue ty p e ( De ğ e r T ip l e r)
b o o l lo n g
b y t e s b y t e
c h ar s h o rt
dec im al S t ru c t ( Y ap ı l ar )
do u b l e u in t
E n u m ( N u m aral an dı rı c ı l ar ) u lo n g
f l o at u s h o rt
in t
T a b lo 1 . D e ğ e r T ip le r i
ş e k i l 1 . D e ğ e r T i p l e r i ni n B e l l e k t e T u t u l u ş u
R e f e re n c e T y p e (
Ba ş v uru T ip l e ri )
Cl as s ( s ı n ı f l ar )
I n t erf ac e
(aray ü z l er )
D el egat e (
del egel er )
O b j ec t
S t rin g
T a b lo 2 . B a ş v u r u T ip le r i
ş e k i l 2 . B a ş v u r u t i p l e r i ni n b e l l e k t e t u t u l u ş u .
G ö rü l dü ğ ü gib i, b aş vu ru t ip l eri h akikat en de is im l erin in l ay ı ğ ı n ı verm ekt el er. N it ekim as ı l
veril er ö b ek’ t e t u t u l u rken y ı ğ ı n da b u veril ere b ir b aş vu ru y er al m akt adı r.
İ ki veri t ü rü aras ı n daki b ir f arkt a b u veril erl e iş im iz b it t iğ in de geri iade edil iş ş ekil l eridir.
D eğ er t ü rl eri il e iş im iz b it t iğ in de b u n l arı n y ı ğ ı n da kap l adı kl arı al an l ar o t o m at ik o l arak
y ı ğ ı n a geri veril ir. A n c ak ref eran s t ü rl erin de s adec e y ı ğ ı n daki b aş vu ru s is t em e geri
veriril ir. V eril erin t u t u l du ğ u ö b ekt eki al an l ar, G arb age Co l l ec t o r’ u n den et im in dedirl er ve
n e z am an s is t em e iade edil ic ekl eri t am o l arak b il in m ez . B u ay rı b ir ko n u o l m akl a b erab er
o l du kç a karm aş ı kt ı r. İ l erl ey en m akal el erim iz de b u ko n u dan da b ah s et m ey e ç al ı ş ac ağ ı m .
u s in g S y s t em ;
n am es p ac e b o x u n b o x
{
c l as s Cl as s 1
{
s t at ic vo id M ain (s t rin g[] args )
{
do u b l e db =5 09 8 09 2 3 2 3 2 3 ;
o b j ec t o b j;
o b j =db ;
ş e k i l 3 B o x i ng İ ş l e m i
G ö rü l dü ğ ü gib i db değ iş ken in e y ap ı l an art t ı rı m o b j ec t t ü rü n den o b j n es n em iz e
y an s ı m am ı ş t ı r. Ç ü n kü b o x in g iş l em i s o n u c u , o b j n es n es i , db değ erin in ö b ekt eki
ko p y as ı n a b aş vu rm akt adı r. O y s aki art ı m db değ iş ken in in y ı ğ ı n da y er al an o rj in al değ eri
ü z erin de gerç ekl eş m ekt edir. B u iş l em i aç ı kl ay an ş ekil aş ağ ı da y er al m akt adı r.
ş e k i l 4 . B o x i ng İ ş l e m i
u s in g S y s t em ;
n am es p ac e b o x u n b o x
{
c l as s Cl as s 1
{
s t at ic vo id M ain (s t rin g[] args )
{
do u b l e db =5 09 8 09 2 3 2 3 2 3 ;
o b j ec t o b j;
o b j =db ;
in t in t D b ;
in t D b =(in t )o b j ;
Co n s o l e.W rit eL in e(in t D b .T o S t rin g());
}
}
}
B u ko du ç al ı ş t ı rdı ğ ı m ı z da I n val idCas t E x c ep t io n is t is n as ı n ı n f ı rl at ı l ac ağ ı n ı gö rü c eks in iz .
Ç ü n ü ref eren as t ip im iz in ö b ekt e b aş vu rdu ğ u veri t ip i in t eger b ir değ er iç in f az l a b ü y ü kt ü r.
B u n o kt ada (in t ) il e aç ı kç a dö n ü ş ü m ü b il dirm iş o l s ak dah i b u h at ay ı al ı rı z .
ş e k i l 5 . I nv a l i d C a s t E x c e p t i o n İ s t i s na s ı
u s in g S y s t em ;
n am es p ac e b o x u n b o x
{
c l as s Cl as s 1
{
s t at ic vo id M ain (s t rin g[] args )
{
do u b l e db =5 09 8 09 2 3 2 3 2 3 ;
o b j ec t o b j;
o b j =db ;
/* in t in t D b ;
in t D b =(in t )o b j ;
Co n s o l e.W rit eL in e(in t D b .T o S t rin g());* /
do u b l e do b D b ;
do b D b =(do u b l e)o b j ;
Co n s o l e.W rit eL in e(do b D b .T o S t rin g());
}
}
}
Ş im di ko dl arı m ı z ı y az al ı m .
p u b l ic vo id z 1()
{
p u b l ic vo id z 2 ()
{
f o r(in t k=1;k< 100;+ + k)
{
z am an 2 .V al u e+ =1;
p u b l ic vo id z 1()
{
p u b l ic vo id z 2 ()
{
f o r(in t k=1;k< 100;+ + k)
{
z am an 2 .V al u e+ =1;
T h readS t art t s 1;
T h readS t art t s 2 ;
T h read t 1;
T h read t2 ;
t s 2 =n ew T h readS t art (z 2 );
t 2 =n ew T h read(t s 2 );
t 2 .S t art ();
b t n B as l at .E n ab l ed=f al s e;
}
t 2 .S u s p en d();
}
t 2 .R es u m e();
}
Ş ekil 2 . S u s p en d m et o du s o n ras ı .
p u b l ic s t at ic vo id S l eep (in t );
p u b l ic s t at ic vo id S l eep (T im eS p an );
B iz b u gü n kü u y gu l am am ı z da il k vers iy o n u ku l l an ac ağ ı z . B u vers iy o n da m et o du m u z
p aram et re o l arak in t t ip in de b ir değ er al m akt adı r. B u değ er m il is an iy e c in s in den s ü rey i
b il dirir. M et o du n S t at ic b ir m et o d o l du ğ u dikkat in iz i ç ekm iş o l m al ı dı r. S t at ic b ir m et o d
o l m as ı n eden i il e, S ı n ı f adı il e b irl ikt e ç ağ ı rı l m ak z o ru n dadı r. Y an i h erh an gib ir t h read
n es n es in in ardı n dan S l eep m et o du n u y az am as s ı n ı z . P eki o h al de b ekl em e s ü res in in h an gi
iş p arç ac ı ğ ı iç in geç erl i o l ac ağ ı n ı n ereden b il ec eğ iz . B u n eden l e, b u m et o d iş p arç ac ı ğ ı
o l arak t an ı m l an an m et o d b l o kl arı iç eris in de ku l l an ı l ı r. K o n u y u ö rn ek ü z erin den in c el ey in c e
dah a iy i an l ay ac ağ ı z . M et o d ç al ı ş t ı rı l dı ğ ı n da p aram et res in de b el irt il en s ü re b o y u n c a
geç erl i iş p arç ac ı ğ ı n ı b ekl et ir. B u b ekl em e diğ er p arç ac ı kl arı n ç al ı ş m as ı n ı en gel l em ez .
S ü re s o n a erin c e, iş p arç ac ı ğ ı m ı z ç al ı ş m as ı n a devam edic ekt ir. Ş im di dil ers en iz ö rn ek b ir
u y gu l am a gel iş t irel im ve ko n u y a aç ı kl ı k get irm ey e ç al ı ş al ı m .
p u b l ic vo id p b 1I l eri()
{
f o r(in t i=1;i< 100;+ + i)
{
p b 1.V al u e+ =1;
T h read.S l eep (8 00);
}
}
p u b l ic vo id p b 2 I l eri()
{
f o r(in t i=1;i< 100;+ + i)
{
p b 2 .V al u e+ =1;
T h read.S l eep (5 00); /* M et o du m u z iş p arç ac ı ğ ı o l arak b aş l adı kt an s o n ra dö n gü
iç in c e h er b ir art ı m dan s o n ra 5 00 m il is an iy e b ekl er. * /
}
}
p u b l ic vo id p b 3 I l eri()
{
f o r(in t i=1;i< 100;+ + i)
{
p b 3 .V al u e+ =1;
T h read.S l eep (3 00);
}
}
T h readS t art t s 1;
T h readS t art t s 2 ;
T h readS t art t s 3 ;
T h read t 1;
T h read t 2 ;
T h read t 3 ;
t 2 =n ew T h read(t s 2 );
t 3 =n ew T h r e a d (t s 3 ) ;
/* T h read n es n el erim iz i s t art m et o du il e b aş l at ı y o ru z . * /
t 2 .S t art ();
t 3 .S t art ();
}
K o dl arı m ı z a geç el im .
p u b l ic vo id p b 1I l eri()
{
t ry
{
f o r(in t i=1;i< 100;+ + i)
{
p b 1.V al u e+ =1;
T h read.S l eep (8 00);
}
}
c at c h (T h readA b o rt E x c ep t io n h at a)
{
}
f in al l y
{
}
}
p u b l ic vo id p b 2 I l eri()
{
f o r(in t i=1;i< 100;+ + i)
{
p b 2 .V al u e+ =1;
T h read.S l eep (5 00); /* M et o du m u z iş p arç ac ı ğ ı o l arak b aş l adı kt an s o n ra dö n gü
iç in c e h er b ir art ı m dan s o n ra 5 00 m il is an iy e b ekl er. * /
}
}
p u b l ic vo id p b 3 I l eri()
{
f o r(in t i=1;i< 100;+ + i)
{
p b 3 .V al u e+ =1;
T h read.S l eep (3 00);
}
}
T h readS t art t s 1;
T h readS t art t s 2 ;
T h readS t art t s 3 ;
T h read t 1;
T h read t 2 ;
T h read t 3 ;
{
/* T h readS t art t em s il c il erim iz i ve T h read n es n el erim iz i o l u ş t u ru y o ru z . * /
t 2 =n ew T h read(t s 2 );
t 3 =n ew T h read(t s 3 );
t 2 .S t art ();
t 3 .S t art ();
b t n B as l at .E n ab l ed=f al s e;
b t n D evam .E n ab l ed=f al s e;
}
t 2 .S u s p en d();
t 3 .S u s p en d();
b t n D evam .E n ab l ed=t ru e;
}
t 2 .R es u m e();
t 3 .R es u m e();
b t n D evam .E n ab l ed=f al s e;
}
U y gu l am am ı z ı den ey el im .
//B u b ir s at ı rl ı k y o ru m du r.
/* B u da b l o k h al in de
H az ı rl an m ı ş b ir y o ru m du r.* /
D eğ iş ken l erim iz i V B ' y e gö re f arkl ı ş ekil l erde t an ı m l ı y o ru z . V B ' de değ iş ken l erl e aran ı z da
p ro b l em y o ks a em in o l u n C# ' t a da o l m ay ac akt ı r.
int a ;
int a , b , c;
int a = 3 ;
T u ğ ru l A R A S
C# ile Ç ok K anallı (M ultith read ) U ygulamalar – 3
Ö zelliğimiz T h readP rio rit y numaralandırıcısı (enumerat o r) t ipinden değerler almakt adır. B u değerler
aşağıdaki t ablo da v erilmişt ir.
Ö n ce lik D e ğ e r i
H ig h e s t
A bo v e N o r m a l
N o r m a l
B e lo w N o r m a l
L o w e s t
D ah a ö nceden sö ylediğimiz g ibi, bir iş parçacığının P rio rit y ö zelliğine h er h ang ibir değer v ermez
isek, st andart o larak N o rmal kabul edilir. B uda t üm iş parçacıklarının v arsayılan o larak eşit
ö nceliklere sah ip o lacakları anlamına g elmekt edir. Ş imdi aşağıdaki f o rmumuzu o luşt uralım.
U yg ulamamız iki iş parçacığına sah ip. B u parçacıkların işaret et t iği met o dlardan birisi 1 ' den 1 0 0 0 ' e
kadar sayıp bu değerleri bir label ko nt ro lüne yazıyo r. D iğeri ise 1 0 0 0 ' den 1 ' e kadar sayıp bu
değerleri başka bir label ko nt ro lüne yazıyo r. F o rmumuzun g ö rünt üsü aşağıdakine benzer o lmalıdır.
/ * B u met o d 1 ' den 1 0 0 0 ' e kadar sayar v e değerleri lblS ayac1 isimli label ko nt ro lüne yazar. * /
public v o id S ay1 ()
{
f o r(int i= 1 ;i< 1 0 0 0 ;+ + i)
{
l b l S ay ac 1.T ex t =i.T o S t rin g();
lblS ayac1 . R ef resh (); / * R ef resh met o du ile label ko nt ro lünün g ö rünt üsünü t azeleriz. B ö ylece
h erbir i değerinin label ko nt ro lünde g ö rülebilmesini sağlamış o luyo ruz. * /
f o r(int j = 1 ;j < 9 0 0 0 0 0 0 0 ;+ + j )
{
j + =1;
}
}
} / * B u met o d 1 0 0 0 ' den 1 ' e kadar sayar v e değerleri lblS ayac2 isimli label ko nt ro lüne yazar. * /
public v o id S ay2 ()
{
f o r(int i= 1 0 0 0 ;i> = 1 ;i- - )
{
l b l S ay ac 2 .T ex t =i.T o S t rin g();
l b l S ay ac 2 .R ef res h (); f o r(int j = 1 ;j < 4 5 0 0 0 0 0 0 ;+ + j )
{
j + =1;
}
}
}/ * T h readS t art v e T h read nesnelerimizi t anımlıyo ruz. * / T h readS t art t s 1;
T h readS t art t s 2 ;
T h read t 1;
T h read t 2 ;
/ * İş parçacıklarımızı, ilg ili met o dların t emsil eden T h readS t art nesnelerimiz ile o luşt uruyo ruz. * /
t 1 = new T h read(t s1 );
t 2 = new T h read(t s2 );
/ * İş parçacıklarımızı çalışt ırıyo ruz. * /
t 1.S t art ();
t 2 .S t art ();
bt nB aslat 1 . E nabled= f alse;
bt nI pt al. E nabled= t rue;
}
U yg ulamamızda şu an için bir yenilik yo k aslında. N it ekim iş parçacıklarımız için bir ö ncelik
ayarlaması yapmadık. Ç ünkü size g ö st ermek ist ediğim bir h usus v ar. B ir iş parçacığı için
h erh ang ibir ö ncelik ayarı yapmadığımızda bu değer v arsayılan o larak N o rmal dir. D o layısıyla h er iş
parçacığı eşit ö nceliğe sah ipt ir. Ş imdi ö rneğimizi çalışt ıralım v e kaf amıza g ö re bir yerde ipt al
edelim.
B en 1 1 ye 9 8 4 değerinde işlemi ipt al et t im. T ekrar iş parçacıklarını B aşlat başlıklı but o na t ıklayıp
çalışt ırırsak v e yine aynı yerde işlemi ipt al edersek, ya aynı so nucu alırız yada yakın değerleri elde
ederiz. N it ekim pro g ramımızı çalışt ırdığımızda arka planda çalışan işlet im sist emine ait pek ço k iş
parçacığıda çalışma so nucunu et kiler. A ncak aşağı yukarı aynı v eya yakın değerle ulaşırız. O ysa bu
iş parçacıklarının ö ncelik değelerini değişt irdiğimizde so nuçların ço k dah a f arklı o labilieceğini
sö yleyebiliriz. B unu dah a iyi anlayabilmek için ö rneğimizi g elişt irelim v e iş parçacıklarının ö ncelik
değerleri ile o ynayalım. F o rmumuzu aşağıdaki g ibi t asarlayalım.
Şekil 3 . Formu mu zu n y en i t asarımı.
/ * B u met o d 1 ' den 1 0 0 0 ' e kadar sayar v e değerleri lblS ayac1 isimli label ko nt ro lüne yazar. * /
public v o id S ay1 ()
{
f o r(int i= 1 ;i< 1 0 0 0 ;+ + i)
{
lblS ayac1 . T ex t = i. T o S t ring ();
lblS ayac1 . R ef resh (); / * R ef resh met o du ile label ko nt ro lünün g ö rünt üsünü t azeleriz.
B ö ylece h erbir i değerinin label ko nt ro lünde g ö rülebilmesini sağlamış o luyo ruz. * /
f o r(int j = 1 ;j < 9 0 0 0 0 0 0 0 ;+ + j )
{
j+ = 1 ;
}
}
}
/ * B u met o d 1 0 0 0 ' den 1 ' e kadar sayar v e değerleri lblS ayac2 isimli label ko nt ro lüne yazar. * /
public v o id S ay2 ()
{
f o r(int i= 1 0 0 0 ;i> = 1 ;i- - )
{
lblS ayac2 . T ex t = i. T o S t ring ();
lblS ayac2 . R ef resh ();
f o r(int j = 1 ;j < 4 5 0 0 0 0 0 0 ;+ + j )
{
j+ = 1 ;
}
}
}
T h readP rio rit y t p2 ; / * O ncelikB elirle met o du, kullanıcının T rackB ar' da seçt iği değerleri g ö z ö nüne
alarak, iş parçacıklarının P rio rit y ö zelliklerini belirlemekt edir. * /
public v o id O ncelikB elirle()
{
case 4 :
{
t p1 = T h readP rio rit y. A bo v eN o rmal; / * N o rmalin biraz üst ü ö ncelik değeri. * /
break;
}
case 5 :
{
t p1 = T h readP rio rit y. H ig h est ; / * E n üst düzey ö ncelik değeri. * /
break;
}
sw it ch (t bO ncelik2 . V alue)
{
case 1 :
{
t p2 = T h readP rio rit y. L o w est ; / * E n düşük ö ncelik değeri. * /
break;
}
case 2 :
{
t p2 = T h readP rio rit y. B elo w N o rmal; / * N o rmalin biraz alt ı. * /
break;
}
case 3 :
{
t p2 = T h readP rio rit y. N o rmal; / * N o rmal ö ncelik değeri. V arsayılan değer budur. * /
break;
}
case 4 :
{
t p2 = T h readP rio rit y. A bo v eN o rmal; / * N o rmalin biraz üst ü ö ncelik değeri. * /
break;
}
case 5 :
{
t p2 = T h readP rio rit y. H ig h est ; / * E n üst düzey ö ncelik değeri. * /
break;
}
t 1 . P rio rit y= t p1 ;
t 2 . P rio rit y= t p2 ;
}
T h readS t art t s1 ;
T h readS t art t s2 ;
T h read t 1 ;
T h read t 2 ;
/ * İş parçacıklarımızı, ilg ili met o dların t emsil eden T h readS t art nesnelerimiz ile
o luşt uruyo ruz. * /
t 1 = new T h read(t s1 );
t 2 = new T h read(t s2 );
O ncelikB elirle(); / * Ö ncelik ( P rio rit y ) değerleri, iş parçacıkları S t art met o du ile başlat ılmadan
ö nce belirlenmelidir. * /
t 1 . S t art ();
t 2 . S t art ();
t 1 . A bo rt ();
t 2 . A bo rt ();
/ * U yg ulamayı kapat mak ist ediğimizde, çalışan iş parçacığı o lup o lmadığını ko nt ro l ediyo ruz.
B unun için iş parçacıklarının I sA liv e ö zelliğinin değerlerine bakıyo ruz. N it ekim kullanıcının,
h erh ang ibir iş parçacığı so nlanmadan uyg ulamayı kapat masını ist emiyo ruz. Y a ipt al et meli yada
so nlanmalarını beklemeli. İpt al et t iğimizde yani A bo rt met o dları çalışt ırıldığında h at ırlayacağınız
g ibi, iş parçacıklarının I sA liv e değerleri f alse durumuna düşüyo rdu, yani ipt al o lmuş o luyo rlardı. * /
Ş imdi ö rneğimizi çalışt ıralım v e birinci iş parçacığımız için en yüksek ö ncelik değerini (H ig h est )
ikinci iş parçacığımız içinde en düşük ö ncelik değerini (L o w est ) seçelim. S o nuçlar aşağıdakine
benzer o lucakt ır.
Şekil 4 . Ö n c eliklerin et kisi.
G ö rüldüğü g ibi ö ncelikler iş parçacıklarının çalışmasını o ldukça et kilemekt edir. G eldik bir
makalemizin dah a so nuna. B ir so nraki makalemizde iş parçacıkları h akkında ilerlemeye dev am
edeceğiz. G ö rüşmek dileğiyle h epinize mut lu g ünler dilerim.
X O R O p eratö rü ile T emel B ir Ş if releme Algoritması
X O R ( Bits e l Ö z e l V e y a ) O p e ra tö rü
" Ö z el vey a" o p erat ö rü iki o p eran dı o l an b ir o p erat ö rdü r. Ö z el vey a o p erat ö rü al dı ğ ı
o p eran dl arı n ı n b ü t ü n b it l erin i karş ı l ı kl ı o l arak " ö z el vey a(X O R )" iş l em in e t u t ar. İ s t ers en iz
b irç o ğ u m z u n m at em at ik ders l erin den h at ı rl ay ac ağ ı " ö z el vey a" y an i X O R iş l em in in
t an ı m ı n ı gö rel im . Ö z el vey a o p erat ö rü iki o p eran d al dı ğ ı iç in dö rt f arkl ı du ru m
s ö z ko n u s u du r. B u du ru m l ar ve s o n u ç l arı aş ağ ı daki t ab l o da b el irt il m iş t ir.
O p eran d 1 O p eran d 2 S o n u ç
1 1 0
1 0 1
0 1 1
0 0 0
Ö n c el ikl e 1 ve 2 s ay ı s ı n ı n b it s el aç ı l ı m ı n ı y az al ı m :
N o t : 1 b y t e b ü y ü kl ü ğ ü n ü n 8 b it e den k dü ş t ü ğ ü n ü h at ı rl ay al ı m .
1 --> 0000 0001
x =z ^ b ;
y =x ^ b ;
is e
z = y dir.
X O R iş l em in in b u ö z el l i y az dı ğ ı m ı z p ro gram a h em ş if re ç ö z ü c ü h em de ş if rel ey ic i o l m a
ö z el l iğ i kat ac akt ı r.
Ş if re l e y ic i v e Ş if re Ç ö z üc ü P ro g ra m
u s in g S y s t em ;
u s in g S y s t em .I O ;
n am es p ac e X O R
{
c l as s c s h arp n edir
{
s t at ic vo id M ain (s t rin g[] args )
{
if (args .L en gt h ! = 2 )
{
Co n s o l e.W rit eL in e(" H at al ı ku l l an ı m " );
Co n s o l e.W rit eL in e(" Ö rn ek ku l l an ı m : S if rel e x x .t ex t an ah t ar" );
ret u rn ;
}
in t X O R = 0;
f o r(in t i = 0; i
X O R =X O R + (in t )(an ah t ar[i] );
H em en p ro gram ı n s o n u c u n u gö rel im :
X O R S if rel iM es aj O rj in al M es aj .t x t
A n ah t arı G irin : X ku ks A h
S o n uç l a r
f o r(in t i = 0; i
X O R =X O R + (in t )(an ah t ar[i] * 10);
in t X O R = 0;
f o r(in t i = 0; i
X O R =X O R + (in t )(an ah t ar[i] );
B undan ö nceki üç makalemizde iş parçacıkları h akkında bilg iler v ermeye çalışt ım, bu makalemde
ise işimize yarayacak t arzda bir uyg ulama g elişt irecek v e bilg ilerimizi pekişt ireceğiz. B ir iş
parçacığının belkide en ço k işe yarayacağı yerlerden birisi v erit abanı uyg ulamalarıdır. B azen
pro g ramımız ço k uzun bir so nuç kümesi dö ndürecek so rg ulara v eya uzun sürecek g üncelleme
if adeleri içeren sq l cümlelerine sah ip o labilir. B ö yle bir durumda pro g ramın diğer ö ğeleri ile o lan
akt iv it emizi dev am et t irebilmek ist eyebiliriz. Y a da aynı anda bir den f azla iş parçacığında, birden
f azla v erit abanı işlemini yapt ırarak bu işlemlerin t amamının dah a kısa sürelerde bit mesini
sağlıyabiliriz. İşt e bu g ibi nedenleri g ö z ö nüne alarak bu g ün birlikt e basit ama f aydalı o lacağına
inandığım bir uyg ulama g elişt ireceğiz.
O layı iyi anlayabilmek için ö ncelikle bir milat ko ymamız g erekli. İş parçacığından ö nceki durum v e
so nraki durum şeklinde. B u nedenle uyg ulamamızı ö nce iş parçacığı kullanmadan o luşt uracağız.
S o nrada iş parçacığı ile. Ş imdi pro g ramımızdan kısaca bah sedelim. U yg ulamamız aşağıdaki sq l
so rg usunu çalışt ırıp, bellekt eki bir D at aS et nesnesinin ref erans et t iği bö lg eyi, so rg u so nucu dö nen
v eri kümesi ile do lduracak.
D at aS et ds;
public v o id B ag la()
{
public v o id D o ldur()
{
S q lC o nnect io n co nN o rt h w ind= new S q lC o nnect io n(" dat a so urce= lo calh o st ;init ial
cat alo g = N o rt h w ind;int eg rat ed securit y= sspi" );
c o n N o rt h w in d.O p en ();
c o n N o rt h w in d.Cl o s e();
D o l du r();
}
B agl a();
}
Y azdığımız ko dlar g ayet basit . S o rg umuz bir S q lD at aA dapt er nesnesi ile, S q lC o nnect io n' ımız
kullanılarak çalışt ırılıyo r v e dah a so nra elde edilen v eri kümesi D at aS et ' e akt arılıyo r. Ş imdi
uyg ulamamızı bu h aliyle çalışt ıralım v e so rg umuzu Ç alışt ır başlıklı but o n ile çalışt ırdıkt an so nra,
t ex t B o x ko nt ro lüne mo use ile t ıklayıp bir şeyler yazmaya çalışalım.
Şekil 2 . İ ş p arç ac ığ ı olmad an p rog ramın ç alış ması.
G ö rüldüğü g ibi so rg u so nucu elde edilen v eri kümesi D at aS et ' e do ldurulana kadar T ex t B o x
ko nt ro lüne bir şey yazamadık. Ç ünkü işlemcimiz sat ır ko dlarını işlet mek ile meşg uldü v e bizim
T ex t B o x ko nt ro lümüze o lan t ıklamamızı ele almadı. D emekki buradaki so rg umuzu bir iş parçacığı
içinde t anımlamalıyız. N it ekim pro g ramımız do nmasın v e başka işlemleride yapabilelim. Ö rneğin
T ex t B o x ko nt ro lüne bir şeyler yazabilelim (bu no kt ada pek ço k şey sö ylenebilir. Ö rneğin başka bir
t ablo nun g üncellenmesi g ibi). B u durumda yapmamız g ereken ko dlamayı inanıyo rumki ö nceki
makalelerden edindiğiniz bilg iler ile biliyo rsunuzdur. B u nedenle ko dlarımızı det aylı bir şekilde
açıklamadım. Ş imdi g elin yeni ko dlarımızı yazalım.
D at aS et ds ;
p u b l ic vo id B agl a()
{
if (! t 1.I s A l ive)
{
dat aG rid1.D at aS o u rc e=ds .T ab l es [0] ;
}
}
p u b l ic vo id D o l du r()
{
c o n N o rt h w in d.O p en ();
c o n N o rt h w in d.Cl o s e();
T h readS t art t s 1;
T h read t 1;
el s e
{
M es s ageB o x .S h o w (" I s p arç ac igi h en ü z s o n l an diril m adi...D ah a s o n ra
t ekrar den ey in ." );
}
}
G ö rüldüğü g ibi bu yo ğun so rg u çalışırken T ex t B o x ko nt ro lüne bir t akım yazılar yazabildik. Ü st elik
pro g ramın çalışması h iç kesilmeden. Ş imdi G ö st er başlıklı but o na t ıkladığımızda v eri kümesinin
D at aG rid ko nt ro lüne alındığını g ö rürüz.
G eldik bir makalemizin dah a so nuna. İlerliyen makalelerimizde T h red' leri dah a derinlemesine
incelemeye dev am edeceğiz. H epinize mut lu g ünler dilerim.
Arayü z(I nterf ace) K ullanı mı na G iriş
Ara y üz Ü y e l e ri
B. M et o dl ar (m et h o ds )
C. O l ay l ar (even t s )
D. İ n deks l ey ic il er (in dex ers )
T a b lo 1 . A r a y ü z le r in s a h ip o la b ile c e ğ i ü y e le r
Ara y üz l e rd e K ul l a n ı l a m a y a n
Ü y e le r
i. Y ap ı c ı l ar (c o n s t ru c t o rs )
iii. A l an l ar (f iel ds )
T a b l o 2 . A r a y ü z l e r d e k u l l a nı l a m a y a n ü y e l e r .
double isim
{
get;
set;
}
string soyisim
{
get ;
}
void yaz();
4 Ara y üz e l e m a n l a rı n ı s ta tic o l a ra k ta n ı m la y a m a y ız .
string isim
{
get;
set;
}
}
Ş i mdi sı nı fı mı z ı dü z gü n bi r ş e ki l de ge l i ş ti re l i m:
private int y;
private string i;
public Kisiler()
{
y=18;
i="Yok";
}
y=yas;
i=ad;
}
set
{
y=value;
}
}
set
{
i=value;
}
}
class Arayuz_Deneme
{
{
Kisiler kisi=new Kisiler("Burak",27);
Console.WriteLine("Yaşım "+kisi.Yas.ToString());
Console.WriteLine("Adım "+kisi.Isim);
Console.WriteLine("-----------");
kisi.EkranaYaz();
}
}
T e msi l c i (de l e gate ), pro gram i ç e ri si nde bi r v e ya daha faz l a me to du gö ste re n(i ş are t
e de n), re fe rans tü rü nde n bi r ne sne di r. Pro graml arı mı z da te msi l c i l e r ku l l anmak
i ste di ği mi z de , ö nc e l i kl e bu te msi l c i ni n tanı mı nı yaparı z . T e msi l c i tanı ml arı , arayü z l e rde ki
me to d tanı ml amal arı i l e ne re de yse aynı dı r. T e k fark de l e gate anahtar sö z c ü ğü nü n ye r
al ması dı r. B u nu nl a bi rl i kte , bi r te msi l c i tanı ml andı ğı nda, asl ı nda i ş are t e de bi l e c e ği
me to d(l arı n) i mz al arı nı da be l i rl e mi ş o l u r. D o l ayı sı yl a, bi r te msi l c i yi sade c e tanı ml adı ğı
me to d i mz ası na u ygu n me to dl ar i ç i n ku l l anabi l i c e ği mi z i sö yl e ye bi l i ri z . T e msi l c i tanı ml arı
tasarı m z amanı nda yapı l ı r. B i r te msi l c i yi , bi r me to du i ş are t e tme si i ç i n ku l l anmak
i ste di ği mi z de i se , ç al ı ş ma z amanı nda o nu ne w yapı l andı rı c ı sı i l e o l u ş tu ru r v e i ş are t
e tme si ni i ste di ği mi z me to du o na parame tre o l arak v e ri ri z . B i r te msi l c i tanı mı ge ne l
hal i yl e , aş ağı daki ş e ki l de ki gi bi di r.
u si ng Syste m;
pu bl i c v o i d M e to d1(C al i sti r. te mc i l c i t)
{
t(a);
}
}
c l ass C l ass1
{
u si ng Syste m;
name spac e D e l e gate s2
{
pu bl i c c l ass te msi l c i l e r
{
pu bl i c de l e gate v o i d dgT e msi l c i (); /* T e msi l c i mi z tanı ml anı yo r. G e ri dö nü ş de ğe ri
o l mayan v e parame tre al mayan me to dl arı te msi l e de bi l i r. */
pu bl i c stati c v o i d M e to d2()
{
C o nso l e . W ri te L i ne (" PI de ğe ri 3. 14 al ı nsı n" );
}
pu bl i c stati c v o i d M e to d3()
{
C o nso l e . W ri te L i ne (" M ai l gö nde ri l di . . . " );
}
c l ass C l ass1
{
stati c v o i d M ai n(stri ng[ ] args)
{
/* Ü ç me to du mu z i ç i nde te msi l c i ne sne l e ri mi z o l u ş tu ru l u yo r . */
Ş e ki l 4. M u l ti -C ast te msi l c i l e r.
H u ffman sı kı ş tı rma te kni ği nde fre kans tabl o su nu e l de e tme k i ç i n stati k v e di nami k
yakl aş ı ml arı nı n o l du ğu nu sö yl e di k. E ğe r stati k yö nte m se ç i l mi ş se i ki yakl aş ı m daha
v ardı r. B i ri nc i yakl aş ı m, me ti n do syası nı n di l i ne gö re sabi t bi r fre kans tabl o su nu
ku l l anmaktı r. Ö rne ği n T ü rkç e bi r me ti n do syası nda " a" v e " e " harfl e ri ne ç o k sı k
rastl anı rke n " ğ" harfi ne ç o k az rastl anı r. D o l ayı sı yl a " ğ" harfi daha faz l a bi tl e " a" v e " e "
harfi daha az bi tl e ko dl anı r. F re kans tabl o su nu e l de e tme k i ç i n ku l l anı l an di ğe r bi r yö te m
i se me tni baş tan so na tarayarak he r bi r karakte ri n fre kansı nı bu l maktı r. Si z de takdi r
e de rsi ni z ki i ki nc i yö nte m daha ge rç e kç i bi r ç ö z ü m ü re tme kl e be rabe r me ti n do syası nı n
di l i nde n bağı msı z bi r ç ö z ü m ü re tme si i l e de ö n pl andadı r. B u yö nte mi n de z av antaj ı i se
sı kı ş tı rı l an v e ri l e rde ge ç e n se mbo l l e ri n fre kansı nı n da bi r ş e ki l de sakl anma
z o ru nl u l u ğu nu n o l ması dı r. Sı kı ş tı rı l an do syada he r bi r se mbo l ü n fre kansı da sakl anmal ı dı r.
B u da kü ç ü k bo yu tl u do syal arda sı kı ş tı rma ye ri ne ge ni ş l e tme e tki si yaratabi l i r. A nc ak bu
du ru m H u ffman yö nte mi ni n ku l l anı l abi l i l i ği ni z e de l e me z . N i te ki m kü ç ü k bo yu tl u do syal arı n
sı kı ş tı rı l maya pe k faz l a i hti yac ı yo ktu r z ate n.
H uf f m an Ağ ac ı nı n O luş t urulm as ı
a 50
b 35
k 20
m 10
d 8
ğ 4
50 a 1 0
35 b 2 10
20 k 3 110
10 m 4 1110
8 d 5 11111
4 ğ 5 11110
H uf f m an K o d unun Ç ö zülm es i
aab k d ğ m m a
0 0 10 110 11111 11110 1110 1110 0 --> 00101101111111110111011100
ş e kl i nde se mbo l i z e e di l i r. Ö rne k pro gramda fre kans tabl o su aş ağı daki me to t i l e e l de
e di l e bi l i r. Sı kı ş tı rı l ac ak do sya baş tan so na taranarak fre kansl ar hashtabl e ne sne si ne
ye rl e ş ti ri l i r.
i nt i C har;
c har c h;
whi l e ((i C har = sr. R e ad()) ! = -1)
{
c h = (c har)i C har;
i f(! C harF re q u e nc i e s. C o ntai nsK e y(c h. T o Stri ng()))
{
C harF re q u e nc i e s. A dd(c h. T o Stri ng(), 1);
}
e l se
{
i nt o l dF re q = (i nt)C harF re q u e nc i e s[ c h. T o Stri ng()] ;
i nt ne wF re q ;
ne wF re q = o l dF re q + 1;
C harF re q u e nc i e s[ c h. T o Stri ng()] = ne wF re q ;
}
}
sr. C l o se ();
fs. C l o se ();
sr = nu l l ;
fs = nu l l ;
}
u si ng Syste m;
pu bl i c H u ffmanN o de L e ftN o de
{
ge t{re tu rn l e ftN o de ;}
se t{l e ftN o de = v al u e ;}
}
pu bl i c H u ffmanN o de R i ghtN o de
{
ge t{re tu rn ri ghtN o de ;}
se t{ri ghtN o de = v al u e ;}
}
pu bl i c stri ng Symbo l
{
ge t{re tu rn symbo l ;}
se t{symbo l = v al u e ;}
}
pu bl i c stri ng C o de
{
ge t{re tu rn c o de ;}
se t{c o de = v al u e ;}
}
pu bl i c i nt F re q u e nc y
{
ge t{re tu rn fre q u e nc y;}
se t{fre q u e nc y = v al u e ;}
}
pu bl i c bo o l I sL e af
{
ge t{re tu rn i sL e af;}
se t{i sL e af = v al u e ;}
}
pu bl i c H u ffmanN o de ()
{
}
}
pu bl i c i nt C o mpare (o bj e c t x , o bj e c t y)
{
H u ffmanN o de no de 1 = (H u ffmanN o de )x ;
H u ffmanN o de no de 2 = (H u ffmanN o de )y;
Y u karı daki tanı ml ar ı ş ı ğı nda H u ffman ağac ı aş ağı daki me to t yardı mı yl a bu l u nabi l i r. D i kkat
e tti yse ni z , me to du n i c rası bi tti ği nde N o de s ko l e ksi yo nu nda te k bi r dü ğü m ne sne si
kal ac aktı r, bu da hu ffman ağac ı ndaki kö k dü ğü mde n(ro o t no de ) baş kası de ği l di r.
pu bl i c v o i d M ake H u ffmanT re e ()
{
N o de s = ne w A rrayL i st();
//B aş l angı ç dü ğü ml e ri o l u ş tu ru l u yo r.
fo re ac h(O bj e c t K e y i n C harF re q u e nc i e s. K e ys)
{
H u ffmanN o de no de = ne w H u ffmanN o de ();
no de . L e ftN o de = nu l l ;
no de . R i ghtN o de = nu l l ;
no de . F re q u e nc y = (i nt)(C harF re q u e nc i e s[ K e y] );
no de . Symbo l = (stri ng)(K e y);
no de . I sL e af = tru e ;
no de . Pare ntN o de = nu l l ;
N o de s. A dd(no de );
}
whi l e (N o de s. C o u nt > 1)
{
H u ffmanN o de no de 1 = (H u ffmanN o de )N o de s[ 0] ;
H u ffmanN o de no de 2 = (H u ffmanN o de )N o de s[ 1] ;
N o de s. R e mo v e (no de 1);
N o de s. R e mo v e (no de 2);
i f(ri ghtN o de ! = nu l l )
ri ghtN o de . C o de = " 1" ;
}
e l se
{
i f(l e ftN o de ! = nu l l )
l e ftN o de . C o de = l e ftN o de . Pare ntN o de . C o de + " 0" ;
i f(ri ghtN o de ! = nu l l )
ri ghtN o de . C o de = ri ghtN o de . Pare ntN o de . C o de + " 1" ;
}
i f(l e ftN o de ! = nu l l )
{
i f(! l e ftN o de . I sL e af)
F ind C o d eW o rd s ( lef t N o d e);
e l se
{
C o de W o rds. A dd(l e ftN o de . Symbo l [ 0] . T o Stri ng(), l e ftN o de . C o de );
}
}
i f(ri ghtN o de ! = nu l l )
{
i f(! ri ghtN o de . I sL e af)
F ind C o d eW o rd s ( rig h t N o d e);
e l se
{
C o de W o rds. A dd(ri ghtN o de . Symbo l [ 0] . T o Stri ng(), ri ghtN o de . C o de );
}
}
}
do sya. hu ff
-----------
1- ) İ l k 4 byte --> O rj i nal v e ri de ki to pl am se mbo l sayı sı . (i l k byte yü kse k anl aml ı byte
o l ac ak ş e ki l de )
2 -) So nraki 1 byte --> D ata bö l ü mü nde bu l u nan so n byte ' taki i l k kaç bi ti n data' ya dahi l
o l du ğu nu be l i rti r. (D ata bö l ü mü nde ki bi tl e ri n sayı sı 8' i n katı o l mayabi l i r. )
3 -) 2 byte Se mbo l + 4 byte se mbo l fre kansı (bu bö l ü m i l k 4 byte ' ta be l i rti l e n se mbo l
sayı sı kadar te krar e de c e kti r. -i l k byte yü kse k anl aml ı byte o l ac ak ş e ki l de -)
4 -) So n bö l ü mde i se sı kı ş tı rı l mı ş v e ri bi t di z i si ş e kl i nde ye r al ı r.
/*K = 4 i se
*
* byte [ 0] = 0 0 0 0 0 1 0 0
* byte [ 1] = 0 0 0 0 0 0 0 0
* byte [ 2] = 0 0 0 0 0 0 0 0
* byte [ 3] = 0 0 0 0 0 0 0 0
*
* K (bi ts) = 00000100 00000000 00000000 00000000
* */
byte [ ] C o mpre sse dB yte Stre am = G e ne rate C o mpre sse dB yte Stre am();
W ri te B yte A rrayT o Stre am(byte K , fs);
fs. W ri te B yte (R e mai nde rB i ts);
W ri te B yte A rrayT o Stre am(C o mpre sse dB yte Stre am, fs);
fs. F l u sh();
fs. C l o se ();
}
fo r(i nt i =0 ; i < 4 ; i + + )
{
byte K [ i ] = (byte )fs. R e adB yte ();
}
bo o l [ ] bi ts = ne w bo o l [ 8] ;
bi ts = G e tB i tsO fB yte (b);
B i tA rray ba = ne w B i tA rray(bi ts);
fs. F l u sh();
fs. C l o se ();
}
Syste m. T e x t. Stri ngB u i l de r O ri gi nal D ata = ne w Syste m. T e x t. Stri ngB u i l de r(" " );
i f(fo u nd)
{
O ri gi nal D ata. A ppe nd(symbo l );
sb. R e mo v e (0, sb. L e ngth);
}
}
sw. F l u sh();
fs. F l u sh();
sw. C l o se ();
fs. C l o se ();
}
//Sı kı ş tı rma
H u ffman hf1 = ne w H u ffman(" de ne me . tx t" );
hf1. C o mpre ss();
//A ç ma
H u ffman hf2 = ne w H u ffman(" de ne me . hu ff" );
hf2. D e c o mpre ss();
U ygu l amayı 7 5 K ' l ı k bi r İ ngi l i z c e me ti n tabanl ı do sya ü z e ri nde ç al ı ş tı rdı ğı mda do syanı n 43
K ' ya dü ş tü ğü nü aş ağı daki gi bi gö z l e ml e di m.
Ö nc e l i kl e u ygu l amamı z ı n amac ı ndan bahse de l i m. U ygu l amamı z ı bi r W i ndo ws u ygu l aması
ş e kl i nde ge l i ş ti re c e ği z . K u l l anac ağı mı z v e ri tabl o su nda arkadaş l arı mı z l a i l gi l i bi r kaç v e ri yi
tu tu yo r o l ac ağı z . K u l l anı c ı , W i ndo ws fo rmu nda, bu tabl o daki al anl ar i ç i n Pri mary K e y
ni te l i ği taş ı yan bi r I D de ğe ri ni gi re re k, bu na karş ı l ı k ge l e n tabl o satı rı na ai t v e ri l e ri ni e l de
e di c e k. İ ste di ği de ği ş i kl i kl e ri yaptı ktan so nra i se bu de ği ş i kl i kl e ri te krar v e ri tabanı na
gö nde re c e k. B u rada ku l l anac ağı mı z te kni k makal e mi z i n e sas amac ı o l u c ak. B u ke z v e ri
tabl o su ndan ç e ki p al dı ğı mı z v e ri satı rı nı n pro gramdaki e ş de ğe ri , o l u ş tu rac ağı mı z sı nı f
ne sne si o l u c ak. B u sı nı fı mı z i se , yaz mı ş o l du ğu mu z arayü z ü u ygu l ayan bi r sı nı f o l u c ak.
V e ri l e r sı nı f ne sne si ne , satı rdaki he r bi r al an de ğe ri , aynı i si ml i ö z e l l i ğe de nk ge l i c e k
ş e ki l de yü kl e ne c e k. Y apı l an de ği ş i kl i kl e r yi ne bu sı nı f ne sne si ni n ö z e l l i kl e ri ni n sahi p
o l du ğu de ğe rl e ri n v e ri tabl o su na gö nde ri l me si i l e ge rç e kl e ş ti ri l e c e k.
Ş ek il 1. F orm tasarı mı mı z .
Ş ek il 2 . T ablomu z u n y apı sı .
pu bl i c i nte rfac e I K i si
{
/* Ö nc e l i kl e tabl o mu z daki he r al ana karş ı l ı k ge l e n ö z e l l i kl e r i ç i n tanı ml amal arı mı z ı
yapı yo ru z . */
i nt K i si I D /* K i si I D , tabl o mu z da o to mati k artan v e pri mary ke y o l an bi r al andı r.
D o l ayı sı yl a pro gramc ı nı n v ar o l an bi r K i si I D ’ si ni de ği ş ti rme me si ge re ki r. B u ne de nl e
sade c e o ku nabi l i r bi r ö z e l l i k o l arak tanı ml anması na i z i n v e ri yo ru z . */
{
ge t;
}
stri ng A d /* T abl o mu z daki c har ti pi nde ki A d al anı mı z i ç i n stri ng ti pte bi r al an. */
{
ge t;se t;
}
stri ng So yad
{
ge t;se t;
}
D ate T i me D o gu mT ari hi /* T abl o mu z da, D o gu mT ari hi al anı mı z date ti me ti pi nde
o l du ğu ndan, D ate T i me ti pi nde bi r ö z e l l i k tanı ml anması na i z i n v e ri yo ru z . */
{
ge t;se t;
}
stri ng M e sl e k
{
ge t;se t;
}
v o i d B u l (i nt K I D ); /* B u l me to d, K I D parame tre si ne gö re , tabl o dan i l gi l i satı ra ai t
v e ri l e ri al ı c ak v e al anl ara karş ı l ı k ge l e n ö z e l l i kl e re atayac ak me to du mu z du r. */
}
C K i si ki si =ne w C K i si ();
pu bl i c v o i d D o l du r()
{
tx tA d. T e x t=ki si . A d. T o Stri ng(); /* tx tA d ko ntro l ü ne , ki si ne sne mi z i n A d ö z e l l i ği ni n ş u
anki de ğe ri yü kl e ni yo r. Y ani i l gi l i v e ri satı rı nı n i l gi l i al anı bu ko ntro l e bağl amı ş o l u yo r. */
tx tSo yad. T e x t=ki si . So yad. T o Stri ng();
tx tM e sl e k. T e x t=ki si . M e sl e k. T o Stri ng();
tx tD o gu mT ari hi . T e x t=ki si . D o gu mT ari hi . T o Sho rtD ate Stri ng();
l bl K i si I D . T e x t=ki si . K i si I D . T o Stri ng();
}
u si ng Syste m;
name spac e I nte rfac e s2
{
pu bl i c i nte rfac e I M u ste ri /* İ l k arayü z ü mü z ü tanı ml ı yo ru z . */
{
v o i d M u ste ri D e tay();
i nt I D {ge t;}
stri ng I si m{ge t;se t;}
stri ng So yi si m{ge t;se t;}
stri ng M e sl e k{ge t;se t;}
}
pu bl i c i nte rfac e I Si pari s /* İ ki nc i arayü z ü mü z ü tanı ml ı yo ru z . */
{
i nt Si pari sI D {ge t;}
stri ng U ru n{ge t;se t;}
do u bl e B i ri mF i yat{ge t;se t;}
i nt M i ktar{ge t;se t;}
v o i d Si pari sD e tay();
}
pu bl i c c l ass Se pe t: I M u ste ri , I Si pari s /* Se pe t i si ml i sı nı fı mı z he m I M u ste ri
arayü z ü nü he mde I Si pari s arayü z ü nü u ygu l ayac aktı r. */
{
pri v ate i nt i d, si pI d, mkt;
pri v ate stri ng ad, so y, me s, u r;
pri v ate do u bl e bf;
pu bl i c i nt I D
{
ge t{re tu rn i d;}
}
pu bl i c stri ng I si m
{
ge t{re tu rn ad;}
se t{ad=v al u e ;}
}
pu bl i c stri ng So yi si m
{
ge t{re tu rn so y;}
se t{so y=v al u e ;}
}
pu bl i c stri ng M e sl e k
{
ge t{re tu rn me s;}
se t{me s=v al u e ;}
}
pu bl i c v o i d M u ste ri D e tay()
{
C o nso l e . W ri te L i ne (ad+ " " + so y+ " " + me s);
}
pu bl i c i nt Si pari sI D
{
ge t{re tu rn si pI d;}
}
pu bl i c stri ng U ru n
{
ge t{re tu rn u r;}
se t{u r=v al u e ;}
}
pu bl i c do u bl e B i ri mF i yat
{
ge t{re tu rn bf;}
se t{bf=v al u e ;}
}
pu bl i c i nt M i ktar
{
ge t{re tu rn mkt;}
se t{mkt=v al u e ;}
}
pu bl i c v o i d Si pari sD e tay()
{
C o nso l e . W ri te L i ne (" ----Si pari sl e r----" );
C o nso l e . W ri te L i ne (" U ru n: " + u r+ " B i ri m F i yat" + bf. T o Stri ng()+ "
M i ktar: " + mkt. T o Stri ng());
}
}
c l ass C l ass1
{
stati c v o i d M ai n(stri ng[ ] args)
{
Se pe t spt1=ne w Se pe t();
spt1. I si m=" B u rak" ;
spt1. So yi si m=" So ftware " ;
spt1. M e sl e k=" M at. M ü h" ;
spt1. U ru n=" M o de m 56 K " ;
spt1. B i ri mF i yat=50000000;
spt1. M i ktar=2;
spt1. M u ste ri D e tay();
spt1. Si pari sD e tay();
}
}
}
m. B asl at();
s. B asl at();
u si ng Syste m;
name spac e I nte rfac e 3
{
pu bl i c i nte rfac e I K u l l ani l mayan
{
v o i d Y az ();
v o i d B u l ();
}
pu bl i c i nte rfac e I K u l l ani l an
{
v o i d A rayu z A di ();
}
pu bl i c c l ass A Si ni fi : I K u l l ani l an
{
pu bl i c v o i d A rayu z A di ()
{
C o nso l e . W ri te L i ne (" A rayü z adl : I K u l l ani l an" );
}
}
c l ass C l ass1
{
stati c v o i d M ai n(stri ng[ ] args)
{
A Si ni fi a=ne w A Si ni fi ();
I K u l l ani l an K u l =(I K u l l ani l an)a;
K u l . A rayu z A di ();
I K u l l ani l mayan anK u l =(I K u l l ani l mayan)a;
anK u l . Y az ();
}
}
}
nesne is tip
Ş ek il 2 . B ir sı nı fı n ü y eleri.
u si ng Syste m;
u si ng Syste m. D ata. Sq l C l i e nt;
name spac e V e ri l e r /* Sı nı fı mı z V e ri l e r i si ml i i si m u z ayı nda ye r al ı yo r. Ç o ğu z aman aynı
i sme sahi p sı nı fl ara sahi p o l abi l i ri z . İ ş te bu gi bi du ru ml arda i si m u z ayl arı bu sı nı fl arı n
bi rbi ri nde n farkl ı o l du ğu nu anl amamı z a yardı mc ı o l u rl ar. */
{
pu bl i c c l ass V e ri /* Sı nı fı mı z ı n adı V e ri */
{
/* İ z l e ye n satı rl arda al an tanı ml amal arı nı n yapı l dı ğı nı gö rme kte yi z . B u al anl ar
pri v ate o l arak tanı ml anmı ş tı r. Y ani sade c e bu sı nı f i ç e ri si nde n e ri ş i l e bi l i r v e de ğe rl e ri
de ği ş ti ri l e bi l i r. B u al anl arı tanı ml adı ğı mı z ö z e l l i kl e ri n de ğe rl e ri ni tu tmak amac ı yl a
tanı ml ı yo ru z . A mac ı mı z bu de ğe rl e re sı nı f dı ş ı ndan do ğru dan e ri ş i l me si ni e nge l l e me k. */
pri v ate stri ng Su nu c u A di ;
pri v ate stri ng V e ri tabani A di ;
pri v ate stri ng K u l l ani c i ;
pri v ate stri ng Paro l a;
pri v ate Sq l C o nne c ti o n K o n; /* B u rada Sq l C o nne c ti o n ti pi nde n bi r de ği ş ke n
tanı ml adı k. */
pri v ate bo o l B agl anti D u ru mu ; /* Sq l su nu c u mu z a o l an bağl antı nı n aç ı k o l u p
o l madı ğı na bakı c ağı z . */
pri v ate stri ng H ataD u ru mu ; /* Sq l su nu c u su na bağl anı rke n hata o l u p o l madı ğı na
bakac ağı z . */
/* A ş ağı da su nu c u adı nda bi r ö z e l l i k tanı ml adı k. H e rbi r ö z e l l i k, ge t v e ya se t
bl o kl arı ndan e n az bi ri ni i ç e rme k z o ru ndadı r. */
pu bl i c stri ng su nu c u /* pu bl i c ti pte ki ü ye l e re sı nı f i ç i nde n, sı nı f dı ş ı ndan v e ya
tü re ti l mi ş sı nı fl ardan yani kı sac a he rye rde n e ri ş i l e bi l me kte di r. */
{
ge t
{
re tu rn Su nu c u A di ; /* G e t i l e , su nu c u i si ml i ö z e l l i ğe bu sı nı fı n bi r
ö rne ği nde n e ri ş i l di ği nde o ku nac ak de ğe ri n al ı nabi l me si sağl anı r . B u de ğe r bi z i m pri v ate
o l arak tanı ml adı ğı mı z Su nu c u A di de ği ş ke ni ni n de ğe ri di r. */
}
se t
{
Su nu c u A di =v al u e ; /* Se t bl o ğu nda i se , bu ö z e l l i ğe , bu sı nı fı n bi r
ö rne ği nde n de ğe r atamak i ste di ği mi z de yani ö z e l l i ği n gö ste rdi ği pri v ate Su nu c u A di
al anı nı n de ğe ri ni de ği ş ti rme k i ç i n ku l l anı rı z . Ö z e l l i ğe sı nı f ö rne ği nde n atanan de ğe r,
v al u e o l arak taş ı nmakta v e Su nu c u A di al anı na aktarı l maktadı r. */
}
}
pu bl i c stri ng v e ri tabani
{
ge t
{
re tu rn V e ri tabani A di ;
}
se t
{
V e ri tabani A di =v al u e ;
}
}
pu bl i c stri ng ku l l ani c i /* B u ö z e l l i k sade c e se t bl o ğu na sahi p o l du ğu i ç i n sade c e
de ğe r atanabi l i r ama i ç e ri ği gö rü ntü l e ne me z . Y ani ku l l ani c i ö z e l l i ği ni bi r sı nı f ö rne ği nde ,
K u l l ani c i pri v ate al anı nı n de ğe ri ni ö ğre nme k i ç i n ku l l anamayı z . */
{
se t
{
K u l l ani c i =v al u e ;
}
}
pu bl i c stri ng paro l a
{
se t
{
Paro l a=v al u e ;
}
}
pu bl i c Sq l C o nne c ti o n c o n /* B u radaki ö z e l l i k Sq l C o nne c ti o n ne sne tü rü nde ndi r v e
sade c e o ku nabi l i r bi r ö z e l l i kti r. N i te ki m sade c e ge t bl o ğu na sahi pti r. */
{
ge t
{
re tu rn K o n;
}
}
pu bl i c bo o l bagl anti D u ru mu
{
ge t
{
re tu rn B agl anti D u ru mu ;
}
se t /* B u rada se t bl o ğu nda baş ka ko dl ar da e kl e di k. K u l l anı c ı mı z bu sı nı f
ö rne ği i l e bi r Sq l bağl antı sı yarattı ktan so nra e ğe r bu bağl antı yı aç mak i ste rse
bagl anti D u ru mu ö z e l l i ği ne tru e de ğe ri ni gö nde rme si ye te rl i o l u c aktı r. E ğe r fal se de ğe ri
gö nde ri rse bağl antı kapatı l ı r. B u i ş l e ml e ri ge rç e kl e ş ti rme k i ç i n i se B agl anti A c v e
B agl anti K apat i si ml i sade c e bu sı nı fa ö z e l o l an pri v ate me to dl arı mı z ı ku l l anı yo ru z . */
{
B agl anti D u ru mu =v al u e ;
i f(v al u e ==tru e )
{
B agl anti A c ();
}
e l se
{
B agl anti K apat();
}
}
}
pu bl i c stri ng hataD u ru mu
{
ge t
{
re tu rn H ataD u ru mu ;
}
}
pu bl i c V e ri () /* H e r sı nı f mu tl aka hi ç bi r parame tre si o l mayan v e yandaki satı rda
gö rü l dü ğü gi bi , sı nı f adı i l e aynı i sme sahi p bi r me to d i ç e ri r. B u me to d sı nı fı n yapı c ı
me to du du r. Y ani C o nstru c to r me to du du r. B i r yapı c ı me to d i ç e rsi nde ç o ğu nl u kl a, sı nı f
i ç i nde ku l l anı l an al anl ara baş l angı ç de ğe rl e ri atanı r v e ya i l k atamal ar yapı l ı r. E ğe r si z bi r
yapı c ı me to d tanı ml amaz i se ni z , de rl e yi c i ayne n bu me to d gi bi bo ş bi r yapı c ı o l u ş tu rac ak
v e sayı sal al anl ara 0, mantı ksal al anl ara fal se v e stri ng al anl ara nu l l baş l angı ç
de ğe rl e ri ni atayac aktı r. */
{
}
/* B u rada bi z bu sı nı fı n yapı c ı me to du nu aş ı rı yü kl ü yo ru z . B u sı nı ftan bi r ne sne yi
i z l e ye n yapı l andı rı c ı i l e o l u ş tu rabi l i ri z . B u du ru mda yapı c ı me to d i ç e rdi ği dö rt
parame tre yi al ı c aktı r. M e to du n amac ı i se be l i rti l e n de ğe rl e re gö re bi r Sq l bağl antı sı
yaratmaktı r. */
pu bl i c V e ri (stri ng su nu c u A di , stri ng v e ri tabani A di , stri ng ku l l ani c i A di , stri ng si fre )
{
Su nu c u A di =su nu c u A di ;
V e ri tabani A di =v e ri tabani A di ;
K u l l ani c i =ku l l ani c i A di ;
Paro l a=si fre ;
B agl an();
}
/* B u rada bi r me to d tanı ml adı k. B u me to d i l e bi r Sq l bağl antı sı o l u ş tu ru yo ru z .
E ğe r bi r me to d ge ri ye he rhangi bi r de ğe r gö nde rmi ye c e k i se yani v b. ne t te ki
fo nksi yo nl ar gi bi ç al ı ş mayac ak i se v o i d o l arak tanı ml anı r. A yrı c a me to du mu z u n sade c e
bu sı nı f i ç e ri si nde ku l l anı l ması nı i ste di ği mi z i ç i n pri v ate o l arak tanı ml adı k. B u saye de bu
sı nı f dı ş ı ndan ö rne ği n fo rmu mu z dan u l aş amamal arı nı sağl amı ş o l u yo ru z . */
pri v ate v o i d B agl an()
{
Sq l C o nne c ti o n c o n=ne w Sq l C o nne c ti o n(" data so u rc e =" + Su nu c u A di + " ;i ni ti al
c atal o g=" + V e ri tabani A di + " ;u se r i d=" + K u l l ani c i + " ;passwo rd=" + Paro l a);
K o n=c o n;
}
/* B u me to d i l e Sq l su nu c u mu z a o l an bağl antı yı aç ı yo ru z v e B agl anti D u ru mu
al anı na tru e de ğe ri ni aktarı yo ru z . */
pri v ate v o i d B agl anti A c () /* B u me to d pri v ate tanı ml anmı ş tı r. Ç ü nkü sade c e bu
sı nı f i ç e ri si nde n ç ağı rı l abi l si n i sti yo ru z . */
{
K o n. O pe n();
try
{
B agl anti D u ru mu =tru e ;
H ataD u ru mu =" B agl anti sağl andi " ;
}
c atc h(E x c e pti o n h)
{
H ataD u ru mu =" B agl anti Sağl anamdı . " + h. M e ssage . T o Stri ng();
}
}
/* B u me to d i l e de Sq l bağl antı mı z ı kapatı yo r v e B agl anti D u ru mu i si ml i al anı mı z a
fal se de ğe ri ni akatarı yo ru z . */
pri v ate v o i d B agl anti K apat()
{
K o n. C l o se ();
B agl anti D u ru mu =fal se ;
}
}
}
Ş i mdi i se sı nı fı mı z ı ku l l andı ğı mı z ö rne k u ygu l ama fo rmu nu tasarl ayal ı m . B u u ygu l amamı z
aş ağı daki fo rm v e ko ntro l l e ri nde n o l u ş u yo r.
Ş ek il 3 . F orm T asarı mı mı z .
F o rmu mu z a ai t ko dl ar i se ş ö yl e .
V e ri l e r. V e ri v ;
pri v ate v o i d btnB agl an_ C l i c k(o bj e c t se nde r, Syste m. E v e ntA rgs e )
{
/* B i r sı nı f ö rne ği yaratmak i ç i n ne w anahtar ke l i me si ni ku l l anı rı z . N e w anahtar
ke l i me si bi z e ku l l anabi l e c e ği mi z tü m yapı c ı me to dl arı gö ste re c e kti r. (I nte l l i Se nse
ö z e l l i ği ). */
v =ne w V e ri (tx tSu nu c u . T e x t, tx tV e ri tabani . T e x t, tx tK u l l ani c i . T e x t, tx tParo l a. T e x t);
}
pri v ate v o i d btnA c _ C l i c k(o bj e c t se nde r, Syste m. E v e ntA rgs e )
{
v . bagl anti D u ru mu =tru e ;
stbD u ru m. T e x t=" Su nu c u B ağl antı sı A ç ı k? " + v . bagl anti D u ru mu . T o Stri ng();
}
pri v ate v o i d btnK apat_ C l i c k(o bj e c t se nde r, Syste m. E v e ntA rgs e )
{
v . bagl anti D u ru mu =fal se ;
stbD u ru m. T e x t=" Su nu c u B ağl antı sı A ç ı k? " + v . bagl anti D u ru mu . T o Stri ng();
}
B u rak Se l i m Ş E N Y U R T