You are on page 1of 364

C Sharp Programlama Dili/C Sharp hakknda temel bilgiler

Vikikitap, zgr ktphane


< C Sharp Programlama Dili

C# (si arp diye okunur) Microsoft tarafndan gelitirilmi olan bir programlama dilidir. C++ ve Java dillerine olduka benzer, ancak C#'n bu dillere benzerlii yannda farklar da vardr. rnein C#, C++'dan farkl olarak % 100 nesne ynelim tekniine sahiptir. Java'dan farkl olarak ise C#'ta gsterici (pointer) kullanlabilir. Bylelikle eski yazlm bileenleriyle uyumlu bir ekilde allabilir.

[dzenle].NET

Framework

C# kodlar, C++ veya Visual Basic'ten farkl olarak direkt makine koduna derlenmez. nce IL dediimiz bir ara koda derlenir. Bu derlenen ilk kodun dosyasna assembly denir ve uzants exe'dir. Bu dosya altrlmak istendiinde ise .Net Framework devreye girer ve IL kodu makine koduna dntrr, (alttaki ekle baknz) bylelikle artk kodu bilgisayar anlayabilir. te bu yzden de yazdmz programn bir bilgisayarda almas iin o bilgisayarda .Net Framework programnn kurulu olmas gerekir, nk .Net Framework IL kodu bilgisayarn anlayabilecei koda evirir. .Net Framework, oluturduu makine kodlarn geici bir sreliine bellee koyar, eer ayn kodlar tekrar altrlmak istenirse tekrar IL koddan makine koduna dnm yapmak yerine bu bellee kaydettii makine kodlarn kullanr. Bu yzden oluturduumuz programmz ilk altrdmz zaman programmz biraz yava alabilir, ancak daha sonraki almalarda olduka hzlanacaktr. C#'ta kodun direkt makine kodu yerine, nce IL koda evrilmesinin baz avantajlar vardr. Bunlardan en nemlisi programmzn farkl iletim sistemlerinde almasnn eskiye oranla ok daha kolay olmasdr. nk makine kodu tanabilir deildir, programlar direkt makine koduna derlediimiz zaman ilgili programn belirli bir iletim sistemine gre derlenmesi gerekir. Halbuki IL kod tanabilirdir, ortak bir koddur, iletim sistemlerindeki eitli programlar vastasyla makine koduna dntrlebilir. rnein Windows'ta bu ii .Net Framework yaparken, Linux'ta Mono yapabilir. Bu kitap C#' Windows zerinden anlatacaktr. Ancak kitabn Linux'ta C# kullanm ksmnda ayrca Linux'ta C# ile program gelitirme de anlatlacaktr.

[dzenle]C#

kodlarn derleme

Son bir-iki blm dndaki btn kodlar Not Defteri'nde (notepad) yazacaz. Aslnda Visual Studio adnda son derece gelimi ve iimizi son derece kolaylatran bir editr yazlm var. Ancak bizim buradaki

amacmz gelimi kurumsal yazlmlar gelitirmek yerine C#' tam anlamyla renmek olduu iin bu gelimi yazlm kullanmayacaz. Not Deferi'nde yazdmz kod dosyasna "cs" uzants verip .Net Framework programyla birlikte gelen csc.exe derleyicisi ile derleyeceiz. Bu derleyici komut satrnd a alyor ve dolaysyla da kodumuzun derlenmesi iin komut satrnda kod yazacaz. Yani .Net Framework program hem kodumuzu derlemek iin, hem de programmzn almas iin gerekli. .Net Framework'u herhangi bir download sitesinden ya da Microsoft'un resm sitesinden cretsiz olarak indirip bilgisayarnza kurabilirsiniz. Vista kullanyorsanz ok byk ihtimalle, XP kullanyorsanz da bir ihtimalle .Net Framework siz de zaten kuruludur. Ancak iinizi garantiye almak isterseniz veya son srmn edinmek isterseniz tekrar kurabilirsiniz. .Net Framework'u kurduktan sonra bilgisayarmza bir ayar yapmamz gerekecek. Bu ayara "path ayarlama" diyoruz. Bu ayar yapmamzn sebebi komut satrnda hangi klasrde olursak olalm csc.exe'ye eriebilmemiz. Bunun iin unlar yapn:

Bilgisayarm'a sa tklayn. "zellikler"i sein. "Gelimi" sekmesine gelin. "Ortam Deikenleri" butonuna tklayn. "Sistem deikenleri" ksmndaki "Path"a ift tklayn. Bu pencere burada kalsn, imdi C:\WINDOWS\Microsoft.NET\Framework klasrne gidin. Oradaki klasrlerin herbirinin iine tek tek bakn. Hangisinin iinde csc.exe varsa o klasrn adres ubuundaki yolu kopyalayn.

imdi nceki atmz "Sistem Deikenini Dzenle" penceresinin "Deiken Deeri" ksmnn sonuna ; iaretini koyup yolu yaptrn.

Btn pencerelerden "tamam" diyerek kn.

Artk Not Defteri'nde yazdmz kodu csc.exe derleyicisi ile derleyebiliriz. rnein "cs" uzants verdiimiz kaynak kodumuzun ad "deneme.cs" olsun. Komut satrn ap, kaynak kod dosyamzn olduu klasr aktif hle getirip, csc

deneme.cs yazp entera basarak kodumuzu derleriz. Oluan exe dosyamz kaynak

kodumuzla ayn klasrde ve deneme.exe adyla oluur. Eer aktif klasrde zaten deneme.exe diye bir dosya varsa eski dosya silinip yeni dosyamz kaydedilir. Programmzn kaynak kodun adndan farkl bir adla olumasn istiyorsak

csc /out:YeniAd.exe deneme.cs


komutunu veririz. Bu rnekte programmz YeniAd.exe adyla oluacaktr.

[dzenle]C#'la

yapabileceklerimiz

C#'la unlar yapabilirsiniz:

Konsol uygulamas gelitirme Windows uygulamas gelitirme ASP.NET uygulamas gelitirme Web servisleri yazma Mobil uygulama gelitirme (PDA, cep telefonlar vb. iin) DLL yazma

Biz kitap boyunca konsol uygulamalar, son blmlerde de form tabanl uygulamalar gelitireceiz. Ancak kullandnz dilin ne kadar gl bir dil olduunu renmeniz asndan bunlar bilmenizde fayda var.

C Sharp Programlama Dili/lk programmz


Vikikitap, zgr ktphane
< C Sharp Programlama Dili

Artk kod yazmaya balyoruz. lk programmz u ekilde:

class ilkprogram { static void Main() { System.Console.WriteLine("Merhaba dnya!"); } }


Bu program konsol ekranna Merhaba

dnya! yazp kapanr. Program geen derste anlatld gibi

derleyin, sonra da programmz altrmak iin komut satrnda kod dosyanza verdiiniz ad girip entera basn.

[dzenle]lk

programmzn satr satr incelenmesi

class ilkprogram satryla ilkprogram adnda yeni bir snf olutururuz. C#'ta yazdmz her
programn en az bir snf iermesi zorunludur.

{ veya } iaretleri herhangi bir snfn veya metodun ieriini belirtmek iin kullanlr. lk { karakteriyle
nceki satrda atmz ilkprogram adl snfmzn ieriine alnacak kodlarn baladn, programn son satrndaki } karakteriyle de snfmzn ieriine alnacak kodlarn sona erdiini belirtiyoruz.

static void Main() satryla snfmzn iine Main adl bir metot yerletirdik. Bu metodun
ad mutlaka Main olmal, yoksa programmz almaz. Ayrca bu metot mutlaka oluturduumuz snfn iinde olmal. Yine { ve } karakterleriyle metodumuzun ieriini belirledik. Dikkat ettiyseniz bir i ie { ve } karakterleri sz konusu. Bu durumda koyulan ilk } karakteri son alan { karakterini kapatr.

Programmzn pratikte i yapan tek ksm ise System.Console.WriteLine("Merhaba

dnya!"); satr. Bu satrla ekrana Merhaba dnya! yazdrdk, peki nasl yaptk? Bunun iin

.Net Framework ktphanesindeki hazr bir metottan yararlandk. Bu metot,

System isim alannn

altndaki Console snfnda bulunuyor, ismiWriteLine ve konsol ekranna yaz yazdrmaya yaryor. Parantezler arasndaki ift trnaklar arasna alnan metni ekrana yazdryor. Satrn sonundaki ; karakterini ise { ve }karakterleri ap kapatmayan btn C# satrlarnda kullanmamz gerekiyor.

[dzenle]Programmzn

ikinci versiyonu

using System; class ilkprogram { static void Main() { Console.WriteLine("Merhaba dnya!"); } }


Bu programmzn ilevsel olarak ilk programmzdan herhangi bir fark yok. Yani ikisi de ayn eyi yapyor. Ancak kodda bir farkllk var. Using

System; satr olumu

veSystem.Console.WriteLine("Merhaba

dnya!"); satrndaki System kalkm. using deyimi C#'ta isim alan kullanma hakk elde etmek
iin kullanlan bir anahtar szcktr. Yani ayn isim alannda kullanacamz birden fazla metot varsa bu isim alann using anahtar szcyle belirtmemiz son derece mantkl.

[dzenle]Programmzn

nc versiyonu

using System; class ilkprogram { static void Main() { Console.WriteLine("Entera basn!"); Console.ReadLine(); Console.WriteLine("Entera bastnz!"); } }
Bu programmz nce ekrana Entera

basn! yazar. Kullanc entera bastnda da Entera

bastnz! yazp kendini kapatr. Console snfna ait olan ReadLinemetodu programmzn
kullancdan bilgi girii iin beklemesini salar, yani programmz entera baslana kadar bekletir. Kullanc entera bastnda da dier satra geilir. Dikkat ettiyseniz ReadLine metodunda parantezlerin arasna hibir ey yazmyoruz. C#'ta baz metotlarn parantezleri arasna bireyler yazmamz gerekirken, baz metotlarda da hibir ey yazlmamas gerekir.

C Sharp Programlama Dili/Deikenler


Vikikitap, zgr ktphane
< C Sharp Programlama Dili

Program yazarken her zaman sabit verilerle almayz, ou zaman programmzda bir verinin kullancnn davranna gre deimesi gerekir. Kullancdan bir metin alp bunu ekrana yazdran bir program buna rnek verilebilir. Deiken ksaca bellek gzeneklerinin programlamadaki karlklardr.
Konu balklar
[gizle]

1 C#'ta deiken tanmlama 2 Deikenlere deer atama 3 Deiken trleri

o o

3.1 bool 3.2 object

4 Deikeni programmz iinde kullanma 5 Deiken adlandrma kurallar 6 Sk yaplan hatalar 7 Sabit deikenler 8 Escape sequence kullanm 9 Ek bilgiler

[dzenle]C#'ta deiken tanmlama


ou programlama dilinde deikenler kullanlmaya balanmadan nce tanmlanrlar. Aadaki ekli inceleyiniz.

Yukardaki ekilde C#'ta deiken tanmlamann nasl yapld anlatlmtr. Deiken tr bellekte ayrlan gzenein bykln belirtmemizi salar. Deiken ad da bu gzenee verdiimiz ad belirtir. Doal olarak bu gzenekteki veriye erimek istediimizde veya bu gzenekteki veriyi deitirmek istediimizde bu ad kullanacaz. Yukardaki ekilde -2,147,483,648 ile 2,147,483,647 arasnda (snrlar dhil) bir deer tutabilen ve ad "ad" olan bir bellek gzenei oluturduk.

[dzenle]Deikenlere deer atama

ou programlama dilinde deikenler tanmlandktan sonra direkt olarak programda kullanlabilirler. Ancak C#'ta deikeni tanmladktan sonra ayrca bir de ilk deer atamak zorundayz. Aksi bir durumda deikeni programmz iinde kullanamayz. Deikenlere deer atama yle yaplr:

ad=5;
Burada ad deikenine 5 deerini atadk. Bu en basit deer atama yntemidir. Ayrca unlar da mmkndr:

int a=5; int b, c, d, e; int f=10, g, m=70;


Birinci satrda tanmlama ve deer vermeyi ayn satrda yaptk. kincisinde ayn trden birden fazla deiken tanmladk. nc satrda ise tanmladmz deikenlerin bazlarna deer verirken bazlarna vermedik.

[dzenle]Deiken trleri
Yukarda deiken tanmlarken deiken tr iin int kullanmtk. C#'ta bunun gibi farkl kapasitelere sahip bir hayli daha deiken tr vardr. Ayrca baz deiken trleri saysal, bazlar da metinseldir. Saysal trler aadaki tabloda listelenmitir:

Tr byte sbyte short

Boyut

Kapasite

rnek

1 bayt 0, ..., 255 (tam say) 1 bayt -128, ..., 127 (tam say) 2 bayt -32768, ..., 32767 (tam say)

byte a=5; sbyte a=5; short a=5; ushort a=5; int a=5; uint a=5; long a=5; ulong a=5; float a=5F; veya float a=5f; double a=5; veya double a=5d; veya double a=5D; decimal a=5M; veya decimal a=5m;

ushort 2 bayt 0, ..., 65535 (tam say) int uint long ulong float 4 bayt -2147483648, ..., 2147483647 (tam say) 4 bayt 0, ..., 4294967295 (tam say) 8 bayt -9223372036854775808, ..., 9223372036854775807 (tam say)

8 bayt 0, ..., 18446744073709551615 (tam say) 4 bayt 1.5*10 , ..., 3.4*10 (reel say)
-324 308 -45 38

double 8 bayt 5.0*10

, ..., 1.7*10

(reel say)

decimal

16 bayt

1.5*10 , ..., 7.9*10 (reel say)

-28

28

Dikkat ettiyseniz baz deiken trlerinde deer atarken deerin sonuna bir karakter eklenmi, bu deiken trlerindeki deikenlere deer atarken siz de bunlara dikkat etmelisiniz. Sra geldi metinsel trlere:

Tr Boyut char 2 bayt

Aklama Tek bir karakteri tutar.

rnek

char a='h'; string a="Ben bir zaman kaybym, beni bover hocam";

string Snrsz Metin tutar.

String trne ayrca char ve/veya string sabit ya da deikenler + iaretiyle eklenip atanabilir. rnekler:

char a='g'; string b="deneme"; string c=a+b+"Viki"+'m';


C#'ta hem metinsel hem de saysal olmayan trler de vardr:

[dzenle]bool
Koullu yaplarda kullanlr. Bool trnden deerlere true, false veya 2<1 gibi ifadeler rnek verilebilir. rnekler:

bool b1=true; bool b2=false; bool b3=5>4;

[dzenle]object
Bu deiken trne her trden veri atanabilir. rnekler:

object object object object

a=5; b='k'; c="metin"; d=12.7f;

Aslnda C#'taki btn deiken trleri object trnden tremitir. Bu yzden object tr dierlerinin tad btn zellikleri tar. Ancak imdilik bunu dnmenize gerek yok. Bu, nesneye dayal programlamann zellikleriyle ilgili.

[dzenle]Deikeni programmz iinde kullanma


imdiye kadar deikenleri tanmlayp ilk deer verdik. imdi deikenleri programmzda kullanmann zaman geldi. Bir rnek:

using System; class degiskenler { static void Main() { byte a=5;

Console.WriteLine(a); } }
Burada a deikeninin deerini ekrana yazdrdk. Baka bir rnek:

using System; class degiskenler { static void Main() { byte a=5; byte b=8; Console.WriteLine(a+b); } }
Bu programda iki deikenimizin deerlerinin toplamn ekrana yazdrdk.

using System; class degiskenler { static void Main() { string a="Viki", b="kitap"; Console.WriteLine(a+b); } }
Bu programda ayn satrda iki tane string deikeni tanmladk ve deer verdik. Bu deikenlerin deerlerini WriteLine metoduyla ekrana yan yana yazdrdk. WriteLinemetodu + iaretini grdnde saysal deiken ve deerleri toplar, string trnden deiken ve deerleri yan yana yazar, char trnden deiken ve deerlerin Unicode karlklarn toplar. Ancak tabii ki + karakterinin ayrd deiken veya deerler char ile stringse char karakterle string metni yan yana yazar.

using System; class degiskenler { static void Main() { string a; a=Console.ReadLine(); Console.WriteLine(a+" metnini yazdnz."); } }
Sanrm imdiye kadar yazdmz en gelimi program buydu. Bu program kullancdan bir metin alp bunu ekrana "... metnini yazdnz." eklinde yazyor. Geen dersteReadLine metodunu kullanc entera basana kadar program bekletmek iin kullanmtk. Aslnda

ReadLine metodunun en yaygn kullanm

kullancnn bilgi girii yapmasn salamaktr. Dikkat ettiyseniz programmzda kullancnn girdii

bilgi a deikenine atanyor. Sonra da WriteLine metoduyla ekrana bu deiken ve "

metnini

yazdnz." metni yan yana yazdrlyor. Burada asl nemsememiz gereken


ey Console.ReadLine() ifadesinin string trnden bir deer gibi kullanlabilmesidir. C#'ta bunun gibi birok metot bir deer gibi kullanlabilir. Tahmin edebileceiniz zere da bir deer gibi kullanlamaz. Baka bir rnek:

WriteLine gibi birok metot

using System; class degiskenler { static void Main() { int a, b; a=20; b=a; Console.WriteLine(b); } }
Bu programda da grebileceiniz gibi deikenlere deer olarak baka bir deikeni atayabiliriz. Ancak deerini atadmz deikene daha nceden bir deer atanm olmas gerekiyor. Burada b deikenine a deikeninin deeri atanyor. Ancak aadaki gibi bir kullanm kesinlikle hataldr.

using System; class degiskenler { static void Main() { Console.ReadLine()="metin"; string a=Console.ReadLine(); Console.WriteLine(a); } }
Burada Console.ReadLine() ifadesi bir deikenmi gibi kullanlmaya allyor, ancak hatal. nk Console.ReadLine() ifadesi yalnzca bir deermi gibi kullanlabilir.

[dzenle]Deiken adlandrma kurallar


imdiye kadar deikenlere ad, a veya b gibi basit adlar verdik. Ancak aadaki kurallar ihlal etmemek artyla deikenlere istediiniz ad verebilirsiniz.

Deiken adlar boluk, simge ieremez. Deikenler bir numerik karakterle balayamaz. C#'n dier btn komut, metot ve benzerlerinde olduu gibi deiken adlarnda byk -kk harf duyarll vardr. Yani degisken isimli bir deikenle Degisken isimli bir deiken birbirinden farkldr.

Deiken adlar Trke karakterlerden(,,,,,) oluamaz.

[dzenle]Sk yaplan hatalar


C#'ta deikenlerle ilgili sk yaplan hatalar unlardr:

Ayn satrda farkl trden deikenler tanmlamaya alma. rnein aadaki rnek hataldr:

int a, string b;

Deikene uygunsuz deer vermeye alma. rnek:

int a; a="metin";

Deikeni tanmlamadan ve/veya deikene ilk deer vermeden deikeni kullanmaya alma. Aadaki rnekte iki deikenin de kullanm hataldr.

using System; class degiskenler { static void Main() { int b; Console.WriteLine(a); Console.WriteLine(b); } }

Deiken tanmlamas ve/veya deer vermeyi yanl yerde yapma. rnek:

using System; class degiskenler { int a=5; static void Main() { Console.WriteLine(a); } }
Dier using dndaki btn komutlarda da olduu gibi deiken tanm ve deer vermelerini de Main blounun iinde yapmalyz.

Baz deiken trlerindeki deikenlere deer verirken eklenmesi gereken karakteri eklememek. rnek:

using System; class degiskenler { static void Main() {

float a=12.5; Console.WriteLine(a); } }

Ondalk saylarn ondalk ksmn ayrrken nokta (.) yerine virgl (,) kullanmak. rnek:

using System; class degiskenler { static void Main() { float a=12,5f; Console.WriteLine(a); } }

Metinsel deikenlerle matematiksel ilem yapmaya almak. rnek:

using System; class degiskenler { static void Main() { string a="1", b="2"; int c=a+b; Console.WriteLine(a); } }

Bir deikeni birden fazla kez tanmlamak. rnek:

using System; class degiskenler { static void Main() { string a; string a="deneme"; Console.WriteLine(a); } }

Deikenlere deer verirken yanl ekilde deer vermek. rnek:

using System; class degiskenler { static void Main() { string a=deneme;

Console.WriteLine(a); } }

[dzenle]Sabit deikenler
Programmzda bazen deeri hi deimeyecek deikenler tanmlamak isteyebiliriz. rnein pi isimli float trnden bir deiken tanmlayp buna 3.14 deerini verip programmzda pi saysna ihtiya duyulduunda bu deikeni kullanabiliriz. Sabit deikenlerin normal deikenlerden fark deikeni deitirmek istediimizde ortaya kar, sabit olarak belirtilen deikeni deitirirsek derleyici hata verip programmz derlemez. Bu daha ok uzun program kodlarnda ie yarayabilir. Ayrca sabit deikenlere tanmland satrda deer vermeliyiz. Herhangi bir deikeni sabit olarak belirtmemiz iin deiken trnden nce const anahtar szc kullanlr. rnekler:

const int a = 5; const string b ="deneme"; const char c ='s';


Aadaki gibi bir durum, deikene tanmland satrda deer verilmedii iin hataldr.

const int a; a=5;


Sabit deikenlere deer olarak sabit, sabit deiken ya da sabit ve/veya sabit deikenlerden oluan matematiksel ifadeler verilebilir. rnek:

const int a=5; const int b=a+7; const int c=a*b;


Aadaki gibi bir durum hataldr.

int a=5; const int b=a+8;

[dzenle]Escape sequence kullanm


Bir string sabitin iinde zel karakterler olmas iin escape sequence kullanlr. rnekler:

string ad="Deneme\"Deneme"; Console.WriteLine(ad);


Bu satrda " karakterinin ad deikenine atanan string sabitin iine koyulmasn saladk. Yukardaki kod ekrana Deneme"Deneme yazar. Baka bir rnek:

string yol="Windows\\Program Files";


Burada bir illegal karakter olan \ karakterinin bana tekrar \ koyarak stringin bir tane \ almasn saladk.

string yol=@"Windows\Program Files";


Burada yol deikenine trnak ierisindeki metin olduu gibi aktarlr, ancak doal olarak " karakterinde ie yaramaz.

Console.WriteLine("Satr\nYeni satr\nYeni satr");


rnekte de grdnz zere C#'ta \n yeni satr yapmak iin kullanlr.

[dzenle]Ek bilgiler
Burada deikenlerle ilgili olan ancak herhangi bir balkta incelenemeyecek olan nemli bilgiler bulunmaktadr. Bunlarn bazlar kendiniz karabileceiniz mantksal bilgilerdir.

ReadLine() metodunun tuttuu deer string trndedir. WriteLine() metodunda parantezler arasna girilen deer object trnden olmaldr. Yani
herhangi bir trden deer yazlabilir. Btn deikenler bir deermi gibi kullanlabilir ancak deerler deikenmi gibi kullanlamaz. Eer bir deikeni tanmlam veya tanmlayp deer vermi, ancak programmzn hibir yerinde kullanmamsak derleyici hata vermez, sadece bir uyar verir.

"deneme"+"yalnzlk"+'d'+'m' gibi bir ifade aslnda string trnden bir sabittir.


(3+8/9)*6 gibi bir ifade, byte, sbyte, short, ushort, int, uint, long, ulong veya double trnden deikenlere atanabilir.

Aslnda C#'ta sabitlerin de trleri vardr. Mesela:

"5" string trnden '5' char trnden 5f float trnden 12.7 veya 5d veya 5D double trnden (C# harfi olmayan ondalkl saylar double sayar.) 5m decimal trnden 5 ise int trndendir. n C# herhangi bir ayrt edici zellii bulunmayan tam say sabitleri int trnden sayar. Ancak 5'in trnn int olmas 5'in byte trnden bir deikene atanamayaca anlamna gelmez. int trnden sabitler byte, sbyte, short, ushort ve uint trnden deikenlere de atanabilirler.

5+"deneme"+6.7f gibi bir ifade aslnda object trnden bir sabittir.


C#'ta herhangi bir sabit ya da deikenin trn anlamak iin x.GetType() metodu kullanlr. rnek:

Console.WriteLine(5.GetType()); Console.WriteLine(14.4.GetType()); Console.WriteLine("deneme".GetType()); byte a=2; Console.WriteLine(a.GetType());


Ancak GetType() metodunun tuttuu deer Type trndedir, dolaysyla herhangi bir string trndeki deikene vs. atanamaz, ayrca da GetType() metodu deikenin CTS'deki karln verir. Deikenlerin CTS karlklar bir sonraki dersimizin konusudur.

Sabitin dier ad deerdir.

a=b ifadesi atama ilemidir. b'nin deeri a'ya atanr. b sabit ya da deiken olabilir. Ancak a kesinlikle
deiken olmaldr.

C Sharp Programlama Dili/Tr dnm


Vikikitap, zgr ktphane
< C Sharp Programlama Dili

Modern programlamada birok kez deikenlerde tr dnmne ihtiya duyulur. rnein string trnd eki saylarla ("5" veya "2" gibi) matematiksel ilem yapmamz gerektiinde tr dnm yapmamz gerekir. Aslnda bahsettiimiz tam olarak tr dnm deildir, sadece bir deikenin deiik trdeki hlinin baka bir deikene atanmasdr. Tr dnmleri bilinli tr dnm ve bilinsiz tr dnm olmak zere ikiye ayrlr.
Konu balklar
[gizle]

1 Bilinsiz tr dnm 2 Bilinli tr dnm

o o

2.1 checked 2.2 unchecked

3 object tryle ilgili kurallar 4 string tryle ilgili dnmler

4.1 x.ToString()

5 System.Convert snf ile tr dnm

[dzenle]Bilinsiz tr dnm
Aslnda bunu nceki derste grmtk. Bu derste sadece adn koyuyoruz ve tanmlyoruz: C#'ta dk kapasiteli bir deiken, sabit ya da deiken ve sabitlerden oluan matematiksel ifade daha yksek kapasiteli bir deikene atanabilir. Buna bilinsiz tr dnm denir, bunun iin herhangi bir zel kod gerekmez.

using System; class TurDonusumu { static void Main() { byte a=5; short b=10; sbyte c=30;

int d=a+b+c; string e="deneme"; char f='k'; object g=e+f+d; long h=d; float i=h; double j=i; double k=12.5f; Console.WriteLine(j+k); } }
Bilinsiz tr dnmyle ilgili ilgin bir durum sz konusudur. char trn kendisinden daha kapasiteli bir saysal tre bilinsiz olarak dntrebiliriz. Bu durumda ilgili karakterin Unicode karl ilgili saysal deikene atanacaktr.

using System; class TurDonusumu { static void Main() { char a='h'; int b=a; Console.WriteLine(b); } }
Bilinsiz tr dnmyle ilgili dier ilgin bir nokta ise byte, sbyte, short ve ushort trndeki deikenlerle yaplan matematiksel ilemlerdir. Bu tr durumda oluan matematiksel ifade intleir. Yani aadaki durumda programmz hata verir:

using System; class TurDonusumu { static void Main() { byte a=5, b=10; short d=2, e=9; byte f=a+b; short g=d+e; Console.WriteLine(f+g); } }
nk artk 8. satrdaki a+b ifadesi intlemi, ayrca da 9. satrdaki d+e ifadesi de intlemitir, ve bunlar en az int trdeki bir deikene atayabiliriz. Size yardmc olmas asnda bilinsiz tr dnm yaplacabilecekler tablosu aada verilmitir:

Kaynak

Hedef

sbyte byte short ushort int uint

short, int, float, long, double, decimal short, ushort, int, uint, long, ulong, float, double, decimal int, long, float, double, decimal int, uint, long, ulong, float, double, decimal long, float, double, decimal long, ulong, float, double, decimal

long, ulong float, double, decimal char float ushort, int, uint, long, ulong, float, double, decimal double

[dzenle]Bilinli tr dnm
Bilinli tr dnm genellikle derleyicinin izin vermedii durumlarda kullanlr. Bilinli tr dnmyle kk trn byk tre dntrlmesi salanabilse de aslnda bu gereksizdir, nk ayn eyi bilinsiz tr dnmyle de yapabilirdik. Aadaki programda bilinli tr dnm gerekletirilmektedir.

using System; class TurDonusumu { static void Main() { int a=5; byte b=(byte)a; Console.WriteLine(b); } }
Programmzda da grebileceiniz gibi (byte)a ifadesi, a deikeninin byte hlini tuttu. Aadaki ekil bilinli tr dnmn anlatmaktadr.

Eer deiken ad ksmnda tek bir deiken yoksa, bir ifade varsa parantez iine alnmas gerekir. Bu ekilde tr dnm deikenlere uygulanabildii gibi sabitlere de uygulanabilir:

using System; class TurDonusumu {

static void Main() { byte b=(byte)12.5f; Console.WriteLine(b); } }



Reel trler tam say trlere dnrken ondalk ksm atlr. Bilinsiz tr dnmyle yalnzca kk trler byk trlere dnebiliyordu, yani veri kayb olmas imkanszd. Halbuki bilinli tr dnmnde veri kayb gerekleebilir, eer dnmn yaptmz deikenin tuttuu deer dntrlecek trn kapasitesinden bykse veri kayb gerekleir. Bu gibi durumlar iin C#'n checked ve uncheckedadl iki anahtar szc vardr.

[dzenle]checked
Kullanm aadaki gibidir:

using System; class TurDonusumu { static void Main() { int i=256; byte b; checked { b=(byte)i; } Console.WriteLine(b); } }
i, byte'a evrilirken veri kayb gerekletii iin programmz alma zamannda hata verecektir. Ayrca yeri gelmiken bir konuya deinmek istiyorum. Bu programmzda b deikeni

checked bloklarnn iinde

tanmlansayd checked bloklarnn dnda bu b deikenine eriemezdik, nk deikenler yalnzca tanmlandklar en i bloun iinde aktiftirler. Buradaki "en i" szne dikkat etmenizi neririm.

{ int b; { int a; } }
Burada a deikeni yalnzca en i blokta aktif olmasna karn, b deikeni hem dtaki hem iteki blokta aktiftir.

{ {

int a=0; } { int b=0; } Console.WriteLine(a+b); }


Burada her iki deiken de WriteLine satrnn olduu yerde geersiz olduu iin bu kod da geersizdir. nk her iki deiken de tanmlandklar en i bloun dnda kullanlmaya allyor.

[dzenle]unchecked
Eer programmzda veri kayb olduunda programn hata vermesini istemediimiz ksmlar varsa ve bu ksmlar checked bloklaryla evrilmise unchecked bloklarn kullanrz.unchecked, checked'n etkisini bloklarnn ierii erevesinde krar. Programmzn varsaylan durumu unchecked olduu iin, yalnzca eer programmzda checkededilmi bir ksm var ve bu ksm unchecked etmek istediimiz alan kapsyorsa gereklidir, dier durumlarda gereksizdir. rnek:

using System; class TurDonusumu { static void Main() { int i=256; int a=300; byte b, c; checked { b=(byte)i; unchecked { c=(byte)a; } } Console.WriteLine(b); } }
Programmz alma zamannda hata verir, ancak bunun sebebi deil, b=(byte)i; satrdr.

c=(byte)a; satr

[dzenle]object tryle ilgili kurallar


C#'taki en ilgin trn object olduunu geen derste sylemitik, ite bu ilgin trn daha baka kurallar:

object trndeki bir deikene baka herhangi bir trdeki deiken ya da sabit (string dnda) + iaretiyle eklenemez. rnein aadaki gibi bir durum hataldr:

using System; class TurDonusumu { static void Main() { object a='5'; int b=4; Console.WriteLine(a+b); } }

object trndeki bir deikene herhangi bir trdeki deiken ya da sabit atanabilir (bilinsiz tr dnm). Ancak object trndeki herhangi bir deikeni baka bir tre evirmek iin tr dntrme ilemi kullanlr. Ayrca da dntrlen trlerin uyumlu olmas gerekir. Yani object trne nasl deer atand nemlidir. rnein aadaki gibi bir durum hataldr:

using System; class TurDonusumu { static void Main() { object a="5"; int b=(int)a; Console.WriteLine(b); } }
Ancak aadaki gibi bir kullanm dorudur.

using System; class TurDonusumu { static void Main() { object a='k'; char b=(char)a; Console.WriteLine(b); } }
Ayn satrda ifte dnm yaplamaz. Aadaki gibi bir kullanm hataldr.

using System; class TurDonusumu { static void Main() {

object a='c'; int b=(int)a; Console.WriteLine(b); } }


Burada nce objectin chara, sonra da charn inte dnm ayr ayr yaplmalyd. Aadaki gibi bir kullanm hataldr:

using System; class TurDonusumu { static void Main() { object a=5; byte b=(byte)a; Console.WriteLine(b); } }
nk derleyici harfsiz tam say saylar int sayar, dolaysyla da burada uygunsuz bir tr dnmnden bahsedebiliriz. Yani 7. satrda a inte dntrlmeliydi. Ancak aadaki gibi bir kullanm dorudur:

using System; class TurDonusumu { static void Main() { byte m=5; object a=m; byte b=(byte)a; Console.WriteLine(b); } }
Bu program hata vermez. nk derleyici a'nn gizli trnn byte olduunu biliyor.

[dzenle]string tryle ilgili dnmler


Dikkat ettiyseniz imdilik sadece saysal trleri, char ve object (uygun ekilde deer verilmi olmas artyla) trn kendi aralarnda dntrebiliyoruz. imdi greceimiz metotlarla string trn bu trlere ve bu trleri de string trne dntrebileceiz.

[dzenle]x.ToString()
Bu metot x deiken ya da sabitini stringe evirip tutar. rnekler:

using System; class TurDonusumu { static void Main()

{ string b=3.ToString(); Console.WriteLine(b); } }


veya

using System; class TurDonusumu { static void Main() { int a=6; string b=a.ToString(); Console.WriteLine(b); } }
veya

using System; class TurDonusumu { static void Main() { string b=12.5f.ToString(); Console.WriteLine(b); } }
veya

using System; class TurDonusumu { static void Main() { string b='k'.ToString(); Console.WriteLine(b); } }

ToString() metodu System isim alannda olduu iin programmzn en banda using System; satrnn bulunmas bu metodu kullanabilmemiz iin yeterlidir. string tryle ilgili bilmeniz
gereken birey daha var:

using System; class TurDonusumu { static void Main() {

string b=5+"deneme"+'k'+12.5f; Console.WriteLine(b); } }


Byle bir kod mmkndr. Ayrca yle bir kod da mmkndr:

using System; class TurDonusumu { static void Main() { int a=5; char m='k'; string r="deneme"; float f=12.5f; string b=a+m+r+f; Console.WriteLine(b); } }
Burada dikkat etmemiz gereken ey yan yana gelen saysal ve char deer ve deikenlerle matematiksel toplama yaplmasna ramen bunlarn yan yana gelmemesi durumunda da normal yan yana yazma olaynn gereklemesidir. Ancak tabii ki yle bir durum hataldr:

using System; class TurDonusumu { static void Main() { int a=5; char m='k'; float f=12.5f; string b=a+m+f; Console.WriteLine(b); } }
Yani bir sabit ve/veya deiken grubunun bir stringe atanabilmesi iin ifadenin iinde en az bir string olmaldr.

[dzenle]System.Convert snf ile tr dnm


System isim alannn altndaki Convert snf iinde tr dnm yapabileceimiz birok metot
bulunur. Bu metotlarla hemen hemen her tr her tre dntrebiliriz. Ancak bunun iin deiken trlerinin CTS karlklarn bilmeliyiz. Deiken trleri ve CTS karlklar aadaki tabloda listelenmitir.

Tr

CTS karl

bool byte sbyte short

Boolean Byte Sbyte Int16

ushort UInt16 int uint long ulong float Int32 UInt32 Int64 UInt64 Single

double Double decimal Decimal char Char

imdi sra geldi bu metotlara:

Convert.ToBoolean(x) Convert.ToByte(x) Convert.ToSbyte(x) Convert.ToInt16(x) Convert.ToUInt16(x) Convert.ToInt32(x) Convert.ToUInt32(x) Convert.ToInt64(x) Convert.ToUInt64(x) Convert.ToSingle(x) Convert.ToDouble(x) Convert.ToDecimal(x) Convert.ToChar(x)

Bu metotlar x'i sz konusu tre dntrp o trde tutarlar. x bir deiken, sabit ya da ifade olabilir. x, ifade olduu zaman nce bu ifade mevcut tre gre ilenir, sonra tr dnm gerekleir. Kullanmna bir rnek:

using System; class TurDonusumu { static void Main() { string s1, s2; int sayi1, sayi2; int Toplam; Console.Write("Birinci say girin: "); s1=Console.ReadLine(); Console.Write("kinci sayy girin: "); s2=Console.ReadLine(); sayi1=Convert.ToInt32(s1); sayi2=Convert.ToInt32(s2); Toplam=sayi1+sayi2; Console.Write("Toplam= "+Toplam); } }
Bu programla kullancdan iki say alp bunlarn toplamn ekrana yazdrdk. Ayrca burada imdiye kadar kullanmadmz Write metodunu kullandk. Bu metodunWriteLine'dan tek fark ekrana yazy yazdktan sonra imlecin alt satra inmemesi.

C Sharp Programlama Dili/Yorum ekleme


Vikikitap, zgr ktphane
< C Sharp Programlama Dili

Yorumlar, programa etki etmeyen ancak kendimizin veya kodu inceleyen bir bakasnn nerede ne yapldn anlamasn salayacak yazlardr. Yorumlar tek satrlk ve ok satrlk olmak zere ikiye ayrlr.

[dzenle]Tek

satrlk yorumlar

C#, iki tane slash'ten (//) sonra gelen ayn satrdaki yazlar yorum sayar. rnek:

using System; class yorum { static void Main() { int a=0; //Burada a'y tanmladk ve sfr deerini verdik. int b=5; //Burada b'yi tanmladk ve be deerini verdik. Console.Write(a+b); //Burada toplamlarn ekrana yazdrdk. } }
[dzenle]ok

satrlk yorumlar

C#, /* ve */ arasna yazlan her eyi yorum sayar. Dolaysyla da ok satrlk yorumlar yazlabilir. rnek:

using System; class yorum { static void Main() { Console.Write("deneme"); /*Buras birinci satr, buras ikinci satr, ite burada bitti.*/ } }
Ayrca C#'n bu yorum zellii programmzda henz almasn istemediimiz kodlar varsa yararl olabilmektedir.

C Sharp Programlama Dili/Operatrler


Vikikitap, zgr ktphane
< C Sharp Programlama Dili

Programlama dillerinde tek balarna herhangi bir anlam olmayan ancak programn ileyiine katkda bulunan karakter ya da karakter topluluklarna operatr denir. rnein a+bifadesinde + iareti bir operatrdr. Operatrlerin etki ettikleri sabit ya da deikenlere ise operand denir. rnein a+b ifadesinde a ve b birer operanddr. C#'ta operatrlern bazlar tek, bazlar ift, bazlar da operand alr. Peki eer bir ifadede birden fazla operatr varsa ne olacak? rnein 2+3*7 gibi bir ifadede nce hangi ilem yaplacak? Burada nce toplama ilemi yaplrsa sonu 35 olur, ancak nce arpma ilemi yaplrsa sonu 23 olur. te C#'ta bu gibi durumlar nlemek iin operatr ncelii diye kavram bulunmaktadr. Operatr ncelikleri ile ilgili u kurallar bilmenizde fayda var: nce parantez ileri yaplr. rnein (3+5)*9 gibi bir ifadede nce toplama ilemi yaplr. ie parantezler sz konusuysa nce en iteki parantez yaplr, sra ile dtaki parantezlere gidilir. rnein (2+(9+2)*5)*2 gibi bir ifadede nce 9 ile 2 toplanp 11 deeri bulur, sonra 11 ile 5 arplp 55 deeri bulunur, sonra 55 ile 2 toplanp 57 deeri bulunur, en son da 57 ile 2 arplp 114 deeri bulunur. Dikkat ettiyseniz yukardaki rnekte bir parantez sz konusu olmamasna ramen nce toplama yerine arpmann yapld bir durumla karlatk. nk C#'ta farkl operatrlerin farkl ncelii vardr. Yani ifadede bir parantez yoksa nce ncelik sras daha nde olan operatrn ilemi yaplr. Aadaki tabloda operatrler ncelik srasna gre listelenmitir. Tablo, ncelik sras en nde olandan en geride olana gre sralanmtr. Yani ayn ifadede parantez sz konusu deilse bu tablodaki daha stte olan operatr daha nce iletilecektir. x++, x-+, -, !, ~, ++x, --x, (Tr)x *, /, % +, <<, >> <, >, <=, >=, is, as

Birinci ncelikliler Tek operand alan operatrler arpma ve blme Toplama ve karma Kaydrma operatrleri likisel ve tr testi operatrleri

Eitlik operatr Bitsel Ve (AND) Bitsel zel Veya (XOR) Bitsel Veya (OR) Mantksal Ve Mantksal Veya Koul operatr

==, != & ^ | && || ?:

Atama ve ilemli atama operatrleri =, *=, /=, %=, +=, -=, <<=, >>=, &=, ^=, |= Dikkat ettiyseniz yukardaki tablodaki baz operatrler ayn srada, yani bunlarn ncelik sras eit. C#'ta eer operatrler eit ncelikliyse, soldan saa ilem yaplr. Yani 2*6/5 ileminde nce 2 ile 6 arplr, sonra da sonu 5'e blnr. ou durumda bunun sonuca bir deiiklik yapmad dnlse de baz durumlarda ileme soldan balanmasnn sadan balamaya gre deiik sonular dourduu durumlara rastlanabilir. rnein:

using System; class Operatorler { static void Main() { int i=3*5/7; Console.Write(i); } }
Bu programda ekrana 2 yazlr. Ancak;

using System; class Operatorler { static void Main() { int i=3*(5/7); Console.Write(i); } }
Bu programda ekrana 0 (sfr) yazlr. nk C# sonunda herhangi bir harf olmayan tam say sabitleri int sayar ve intin kurallarna gre ilem yapar. int sabitlerle yaplan her ilemden sonra -oluursaondalk ksm atlr. Ancak program aadaki gibi deitirirsek sonu deimeyecektir.

using System; class Operatorler { static void Main() { int i=(int)(3f*(5f/7f)); Console.Write(i); }

}
Burada sabitleri floatlatrdk, dolaysyla da ilemin sonunda float bir sabit olutu. Sonra tr dntrme operatryle sonucu inte evirip i deikenine atadk ve bu deikeni de ekrana yazdrdk. imdi isterseniz btn operatrleri tek tek inceleyelim.
Konu balklar
[gizle]

1 Matematiksel operatrler 2 Bir artrma ve bir eksiltme operatrleri 3 Karlatrma operatrleri 4 as operatr 5 is operatr 6 Mantksal operatrler 7 Bitsel operatrler 8 Bitsel kaydrma operatrleri 9 Atama ve ilemli atama operatrleri 10 ?: operatr 11 aret deitirme operatr (-) 12 Stringleri yan yana ekleme operatr (+) 13 typeof operatr

[dzenle]Matematiksel

operatrler

+, -, / ve * operatrleri hakknda aklama yapma gereksinmi grmyorum. Burada henz grmediiniz bir operatr tantmak istiyorum. % operatr mod alma ilemi yapar, yani;

using System; class Operatorler { static void Main() { int i=5%2; Console.Write(i); } }
Bu program ekrana 1 yazar. Yani 5 saysnn 2'ye blmnden kalan i deikenine atand. Matematiksel operatrler hakknda unu eklemek istiyorum: eer ilem yaplan her iki operarand farkl trdeyse sonu daha st kapasiteli trde tutulur. rnek:

using System; class Operatorler { static void Main()

{ float i=5/2f; Console.Write(i); } }


Burada 5 says da float gibi davranm ve sonu ondalkl kmtr. Ancak,

using System; class Operatorler { static void Main() { float i=2/5/2f; Console.Write(i); } }
Burada sonu 0 kar. nk zaten ilem yaplrken sonu daha floata (2f) gelmeden sfrlanmt.

using System; class Operatorler { static void Main() { float i=2f/5/2; Console.Write(i); } }
Burada ise zincirleme olarak her ilemin sonucu floatlamakta ve sonu ondalkl kmaktadr. Daha arpc bir rnek:

using System; class Operatorler { static void Main() { float i=2f/5/2/2/4/8/4/5/3; Console.Write(i); } }
Burada da sonu ondalkldr. [dzenle]Bir

artrma ve bir eksiltme operatrleri

C#'n en ok kullanlan operatrlerindendir. nne veya sonuna geldii deikeni bir artrr veya bir eksiltirler, sabitlere uygulanamazlar. Hem uyguland deikenin deerini 1 artrr veya eksiltirler hem de tutucu vazifesi grrler. n ek ve son ek olmak zere iki ekilde kullanlabilirler. rnek;

using System;

class Operatorler { static void Main() { int a=5; int i=++a; Console.Write(i+" "+a); } }
Programda da grdnz gibi ++ operatr hem a'nn deerini bir artrd hem de bu deeri tuttu ve deer i'ye atand. te n ek ve son ek eklinde kullanmn fark burada ortaya kyor. rnei inceleyiniz.

using System; class Operatorler { static void Main() { int a=5; int i=a++; Console.Write(i+" "+a); } }
Bu programda ++ operatr n ek eklinde deil de son ek eklinde kullanlm. Bu durumda 7. satrda nce a'nn deeri i'ye atanr, sonra a'nn deeri 1 artrlr. Halbuki ilk rneimizde nce a'nn deeri 1 artrlm sonra bu deer i'ye atanmt. sterseniz imdi bu ++ ve -- operatrlerini bir rnekte hep beraber grelim;

using System; class Operatorler { static void Main() { int a=5; int i=a++; int b=i--; int c=10; int d=--c; Console.Write("{0}\n{1}\n{2}\n{3}",a,i,b,d); } }
Bu program ekrana alt alta 6, 4, 5 ve 9 yazacaktr. Dikkat ettiyseniz Write metodunu farkl ekilde kullandk. Siz de byle ok fazla deikeni daha kolay yazdrabilirsiniz. Ayrca bu yntemi WriteLine metodunda da kullanabilirsiniz. NOT: Bir artrma ve bir azaltma operatrleri byte, sbyte, short ve ushort trlerindeki deikenle rin trn deitirmez.

[dzenle]Karlatrma

operatrleri

Daha nceki derslerimizden birinde 2<5 gibi bir ifadenin aslnda bool trnden bir deer olduunu sylemitik. te bu operatrler bu bool trnden deerleri operandlar vastasyla retmek iin kullanlr. ki saynn birbirine gre bykln ve kkln kontrol ederler. Tabii ki yalnzca saysal trdeki (char da dhil) deiken ya da sabitlerle kullanlabilirler. Charla saysal trler karlatrldnda charn Unicode karl hesaba katlr. Bu operatrler unlardr: < (kktr), > (byktr), <= (kk eittir), >= (byk eittir), == (eittir), != (eit deildir),. rnekler:

using System; class Operatorler { static void Main() { bool a=4<6; bool b=6>5; bool c=7<=7; bool d=9>=12; bool e=10==12; bool f=1!=8; Console.Write("{0}\n{1}\n{2}\n{3}\n{4}\n{5}",a,b,c,d,e,f); } }
Bu program ekrana alt alta True, True, True, False, False ve True yazacaktr. [dzenle]as

operatr

Tm deiken trlerinden objecte ve string deerli olmak artyla objectten stringe dnm yapar. rnek:

using System; class Operatorler { static void Main() { object i="50"; string s=i as string; Console.Write(s); } }
veya

using System; class Operatorler { static void Main() { int i=50;

object s=i as object; Console.Write(s); } }


[dzenle]is

operatr

Verilen deiken, sabit ya da ifadenin trn kontrol eder. Eer sz konusu deiken, sabit ya da ifade verilen trle uyumluysa true deilse false deeri retir. Eer sz konusu deiken, sabit ya da ifadenin tr her zaman true ya da false retiliyorsa derleyici uyar verir, ancak bu uyar derlemeye engel deildir. Kullanmna bir rnek:

using System; class Operatorler { static void Main() { int i=50; bool b1=i is int; bool b2=i is double; bool b3=12 is byte; bool b4='c' is string; bool b5=12f+7 is int; Console.Write("{0}\n{1}\n{2}\n{3}\n{4}",b1,b2,b3,b4,b5); } }
Bu program alt alta True, False, False, False ve False yazacaktr. Dikkat ettiyseniz 12 sabitini byte saymad ve 12f+7 sabitini de int saymad. nk C#, harfsiz tam say sabitleri int sayar. 12f+7 sabiti de floatlamtr. [dzenle]Mantksal

operatrler

Bu operatrler true veya false sabit ya da deikenleri mantksal ve, veya, deil ilemine sokarlar. Bunlar && (ve), || (veya) ve ! (deil) operatrleridir. rnekler:

using System; class Operatorler { static void Main() { bool b1=35>10&&10==50; //false bool b2=35>10&&10!=50; //true bool b3=5 is int||12*3==200; //true bool b4=5<4||45/5==9; //true bool b5=!(5<4); //true Console.Write(b1+" "+b2+" "+b3+" "+b4+" "+b5); } }

Eer ! operatrnden sonra bir deiken ya da sabit yerine bir ifade geliyorsa ifadeyi parantez iine almak zorundayz. [dzenle]Bitsel

operatrler

Bitsel operatrler saylarn kendisi yerine saylarn bitleriyle ilgilenirler. Dier bir deyile saylar ikilik sisteme dntrp yle ilem yaparlar. Bu operatrler yalnzca tam say sabit, deiken ya da ifadelerle kullanlabilirler. Eer bitsel operatrler bool trnden deiken, sabit ya da ifadelerle kullanlrsa mantksal operatrlerin grd iin aynsn grrler. rnein aadaki iki kullanm da birbiyle ayn sonucu douracaktr:

bool b1=false&&false; bool b1=false&false;


~ (bitsel deil), & (bitsel ve), | (bitsel veya) ve ^ (bitsel zel veya) operatrleri bitsel operatrlerdir. rnekler:

using System; class Operatorler { static void Main() { byte a=5&3; // 00000101&00000011 -->sonu 00000001 kar. Yani 1 kar. byte b=5|3; // 00000101|00000011 -->sonu 00000111 kar. Yani 7 kar. byte c=5^3; // 00000101^00000011 -->sonu 00000110 kar. Yani 6 kar. byte d=5; byte e=(byte)~d; // 00000101'in deili -->sonu 11111010 kar. Yani 250 kar. byte f=(byte)~(a+b); // 00001000'n deili -->sonu 11110111 kar. Yani 247 kar. byte g=(byte)~(a+7); // 00001000'n deili --->sonu 11110111 kar. Yani 247 kar. Console.Write(a+" "+b+" "+c+" "+e+" "+f+" "+g); } }
Bitsel operatrler saylar ikilik sisteme dntrp karlkl basamaklar "ve", "veya" veya "zel veya" ilemine sokarlar ve sonucu operandlaryla birlikte tutarlar. & (ve) ilemi karlkl basamaklardan her ikisi de 1'se ilgili basamanda 1 tutar, dier durumlarda 0 tutar. | (veya) ilemi karlkl basamaklarndan herhangi birisi 1'se ilgili basamanda 1 tutar, dier durumlarda 0 tutar. ^ (zel veya) ilemi karlkl basamaklar farklysa ilgili basamanda 1 tutar, dier durumlarda 0 tutar. ~ (deil) operatr operandnn her basaman tersletirip tutar. Bu operatrlerin operandlar byte, sbyte, short, ushort olmas durumunda sonu intleir. NOT: Banda 0x veya 0X olan saylar 16'lk dzende yazlm demektir. rnek:

using System; class Operatorler {

static void Main() { int a=0xff; int b=0Xff; Console.Write(a+" "+b); } }


Bu program ff saysnn onluk dzendeki karl olan 255 saysn ekrana iki kere yazacaktr. [dzenle]Bitsel

kaydrma operatrleri

Bu operatrler (<< ve >>) saylarn bitlerini istenildii kadar kaydrmak iin kullanlr. << saylar sola kaydrrken, >> saa kaydrr. rnekler:

using System; class Operatorler { static void Main() { byte b=100; // 01100100 byte c=(byte)(b<<1); //b bir kez sola kaydrld ve 11001000 oldu. (200 oldu.) byte d=50; // 00110010 byte e=(byte)(d>>2); // d iki kez saa kaydrld ve 00001100 oldu. (12 oldu.) Console.Write(c+" "+e); } }
<< ve >> operatrlerinin operandlar deiken olabilecei gibi sabit ya da ifade de olabilir. Operand(lar) byte, sbyte, short, ushortsa sonu intleir. [dzenle]Atama

ve ilemli atama operatrleri

imdiye kadar ok kullandmz = operatryle ilgili bilmeniz gereken iki ey var. Sol tarafta kesinlikle yalnzca bir tane deiken olmal. rnein aadaki gibi bir kullanm hataldr.

int a=0, b=0; a+b=20;


= operatrnde ilemler sadan sola gerekleir ve = operatr operandlaryla birlikte atad deeri tutar. rnek:

using System; class Operatorler { static void Main() { byte b=7, a=1, c; c=a=b;

Console.Write(a+" "+b+" "+c); } }


Bu program ekrana yan yana tane 7 yazacaktr. c=a=b; satrnda nce b a'ya atanr ve a=b ifadesi 7 deerini tutar. nk a=b atamasnda 7 says atanmtr. Sonra a=b ifadesinin tuttuu 7 says c'ye atanr. Sonunda deikenin deeri de 7 olur. Ancak u rnek hataldr:

using System; class Operatorler { static void Main() { byte b=7, a=1, c; (c=a)=b; Console.Write(a+" "+b+" "+c); } }
Burada nce a c'ye atanyor ve c=a ifadesi 1 deeri tutuyor ve ifademiz 1=b ifadesine dnyor. Atama operatrnn prensibine gre byle bir ifade hatal olduu iin program derlenmeyecektir. Bir de ilemli atama operatrleri vardr. Aslnda bunlar = operatrnn yapt ii daha ksa kodla yaparlar:

a=a+b; yerine a+=b; a=a-b; yerine a-=b; a=a*b; yerine a*=b; a=a/b; yerine a/=b; a=a%b; yerine a%=b; a=a<<b; yerine a<<=b; a=a>>b; yerine a>>=b; a=a&b; yerine a&=b; a=a^b; yerine a^=b; a=a|b; yerine a|=b;

kullanlabilir. [dzenle]?:

operatr

?: operatr C#'ta operand alan tek operatrdr. Verilen koula gre verilen deerlerden (object trnden) birini tutar. Kullanm yledir:

koul?doruysa_deer:yanlsa_deer
rnek:

using System; class Operatorler { static void Main() {

Console.Write("Vikikitap' seviyor musunuz? (e, h): "); string durum=Console.ReadLine(); Console.Write(durum=="e"?"Teekkrler!!":"Salk olsun..."); } }
Tabii ki verilen deerlerin illa ki sabit olma zorunluluu yoktur, deiken ya da ifade de olabilir. [dzenle]aret

deitirme operatr (-)

- operatr bir deiken, sabit ya da ifadenin iaretini deitirmek iin kullanlr. rnekler:

using System; class Operatorler { static void Main() { int a=50; int b=-a; int c=-23; int d=-(a+b+c); int e=-12; Console.Write("{0}\n{1}\n{2}\n{3}\n{4}",a,b,c,d,e); } }
[dzenle]Stringleri

yan yana ekleme operatr (+)

+ operatr stringleri veya charlar yan yana ekleyip operandlaryla birlikte string olarak tutar. Ancak ifadedeki btn bileenlerin string olarak birleebilmesi iin ilk stringten nce charlarn yan yana gelmemesi gerekir. Yalnzca charlardan oluan bir ifade stringlemez. NOT: + ve - operatrleri ayn zamanda saysal (ve char) sabit, deiken ve ifadeleri toplamak ve karmak iin de kullanlr. Bunu daha nce grmtk. [dzenle]typeof

operatr

Herhangi bir deiken trnn CTS karln Type trnden tutar. rnek:

using System; class Operatorler { static void Main() { Type a=typeof(int); Console.Write(a); } }
Bu program ekrana System.Int32 yazar.

C Sharp Programlama Dili/Ak kontrol mekanizmalar


Vikikitap, zgr ktphane
< C Sharp Programlama Dili

Program yazarken ou zaman herey ak ve kara gibi net olmaz, ou zaman eitli koullara gre farkl komutlar altrmamz gerekir. Benzer ekilde ou komutun da yalnzca bir kez altrlmas bizim iin yeterli gelmez, belli koullar salad srece srekli altrlmasn istediimiz komutlar olabilir. te bu gibi durumlar iin C#'ta ak kontrol mekanizmalar vardr. Aslnda en basitinden en karmana kadar btn programlama dillerinde bu mekanizmalar mevcuttur ve programlama dillerinin en nemli gelerinden birisidir.
Konu balklar
[gizle]

1 if else 2 switch 3 for dngs

o o o

3.1 for dngsnn alma prensibi 3.2 for dngsyle ilgili rnekler 3.3 for dngsyle ilgili kurallar

4 while dngs

4.1 while dngsnn alma prensibi

5 do while dngs

o o

5.1 Kullanm 5.2 do while dngsnn alma prensibi

6 Dnglerde kullanlan anahtar szckler

o o o

6.1 break 6.2 continue 6.3 goto

7 Dnglerle ilgili kark rnekler

[dzenle]if else
if else deyimi sayesinde belli bir koul salandnda sz konusu komutlar altrlr, o belli koullar
salanmadnda altrlmaz ya da baka komutlar altrlr. Kullanl u ekildedir:

if(koul) komut1; else

komut2;
veya

if(koul) { komutlar1 } else { komutlar2 }


Yukardaki rneklerde eer koul salanrsa 1. komutlar, salanmazsa 2. komutlar altrlr. if veya else'in altnda birden fazla komut varsa bu komutlar parantez iine almak gerekir. if veya else'in altnda tek komut varsa bu komutlar parantez iine almak gerekmez. rnek bir program:

using System; class AkisKontrolMekanizmalari { static void Main() { int a=5, b=7; if(a<b) Console.Write("a b'den kk"); else Console.Write("a b'den kk deil"); } }
Baka bir rnek program:

using System; class AkisKontrolMekanizmalari { static void Main() { int a=5, b=7; if(a<b) { Console.WriteLine("a b'den kk"); Console.Write(a); } else { Console.WriteLine("a b'den kk deil"); Console.Write(b); } } }

if else yaplarnda else ksmnn bulunmas zorunlu deildir. Bu durumda sadece koul salandnda bir eyler yaplacak, koul salanmadnda bir eyler yaplmayacaktr. rnek:

using System; class AkisKontrolMekanizmalari { static void Main() { int a=5, b=7; if(a<b) Console.WriteLine("a b'den kk"); } }
if else bloklarnn aadaki gibi kullanm da mmkndr:

using System; class AkisKontrolMekanizmalari { static void Main() { Console.Write("Cinsiyetinizi girin (e, k): "); char cins=Convert.ToChar(Console.ReadLine()); if(cins=='e') Console.Write("Erkeksiniz"); else if(cins=='k') Console.Write("Kzsnz"); else Console.Write("Ltfen cinsiyetinizi doru giriniz!"); } }
Bu program kullancdan cinsiyetini girmesi istemekte, eer kullancnn girdii harf

e ise k m

ekrana Erkeksiniz yazmakta, eer girdii harf e deilse ise bu sefer kullancnn girdii harfi

deil mi diye incelemekte, eer k girmise ekrana Kzsnz yazmakta, bunlarn dnda bir harf girdiinde de ekrana Ltfen

cinsiyetinizi doru giriniz! yazmaktadr. Bu ekilde bu if satrnn bir tane olmas zorunlu deildir. Ancak tabii

bloklar daha da uzatlabilir. Yani else

ki else satrnn yalnzca bir tane olmas gerekir. C# i ie if else kullanlmasna izin verir:

if(koul1) { if(koul2) komut1; else { komut2; komut3; }

} else komut4;

[dzenle]switch
switch deyimi baz if else deyimlerinin yapt ii daha az kodla yapar. Genellikle baz karmak if else bloklarn kurmaktansa switch'i kullanmak programn anlalrln artrr. Ancak tabii ki basit if else bloklarnda bu komutun kullanlmas gereksizdir. Kuruluu:

switch(ifade) { case sabit1: komut1; break; case sabit2: komut2; break; default: komut3; break; }
Bu switch deyimiyle ilgili bilmeniz gerekenler:

fadenin rettii deer hangi case sabitinde varsa o "case"deki komutlar iletilir. Eer ifadenin rettii deer hibir case sabitinde yoksa default casedeki komutlar iletilir.

Ayn birden fazla case sabiti olamaz. rnein:

using System; class AkisKontrolMekanizmalari { static void Main() { int a=4; switch(a) { case 4: Console.Write("deneme1"); break; case 4: Console.Write("deneme2"); break; case 5: Console.Write("deneme3"); break; default: Console.Write("deneme4"); break;

} } }
Bu program hataldr.

C#'ta herhangi bir case'e ait komutlarn break; satr ile sonlandrlmas gerekmektedir. Eer break; satr ile sonlandrlmazsa programmz hata verir. rnein aadaki program hata vermez:

using System; class AkisKontrolMekanizmalari { static void Main() { int a=4; switch(a) { case 4: string b=Console.ReadLine(); Console.Write(b); break; default: Console.Write("deneme4"); break; } }
Ancak u program hata verir:

using System; class AkisKontrolMekanizmalari { static void Main() { int a=4; switch(a) { case 4: string b=Console.ReadLine(); Console.Write(b); default: Console.Write("deneme4"); break; } } }

Eer programmzn bir case'deyken farkl bir case'e gitmesini istiyorsak goto anahtar szcn kullanrz. rnek:

using System; class AkisKontrolMekanizmalari { static void Main() { int a=5; switch(a) { case 4: string b=Console.ReadLine(); Console.Write(b); break; case 5: Console.Write("imdi case 4'e gideceksiniz."); goto case 4; default: Console.Write("deneme4"); break; } } }

goto satr kullanlmsa break; satrnn kullanlmasna gerek yoktur. Eer farkl case sabitlerinin ayn komutlar altrmasn istiyorsak yle bir program yazlabilir:

using System; class AkisKontrolMekanizmalari { static void Main() { int a=5; switch(a) { case 4: case 5: string b=Console.ReadLine(); Console.Write(b); break; default: Console.Write("deneme4"); break; } } }

Bu programda a deikeni 4 olsa da 5 olsa da ayn komutlar altrlacaktr.

case anahtar szcnn yanndaki ifade mutlaka ya sabit ya da sabitlerden oluan bir ifade olmaldr. default durumunu istediiniz yere yazabilirsiniz, ayn ekilde istediiniz case'leri de istediiniz yere yazabilirsiniz. Yani case'lerin sras nemli deildir.

Bir switch blounda default durumu bulunmak zorunda deildir. switch'in parantez iindeki ifadesi bir deiken olabilecei gibi, bir sabit ya da ifade de olabilir.

[dzenle]for dngs
Eer programda -belli koullar salad srece- birden fazla altrlmasn istediimiz kodlar varsa dngler kullanlr. C#'ta en ok kullanlan dng "for"dur. Kullanm:

for(ifade1;kosul;ifade2) komut;
veya

for(ifade1;kosul;ifade2) { komut1; komut2; . . . }

[dzenle]for dngsnn alma prensibi


for(ifade1;kosul;ifade2) { komut1; komut2; . . . }
1) ifade1 altrlr. 2) Koula baklr. Eer koul salanyorsa; 2.1) kme parantezleri iindeki ya da -kme parantezleri yoksa- kendinden sonra gelen ilk satrdaki komut altrlr. 2.2) ifade2 altrlr. 2.3) 2. adma dnlr. 3) Eer koul salanmyorsa kme parantezleri dna ya da -kme parantezleri yoksa- kendinden sonra gelen ilk satrdaki komuttan hemen sonraki satra klr. Dolaysyla dngden klm olu r.

[dzenle]for dngsyle ilgili rnekler


using System; class AkisKontrolMekanizmalari { static void Main() { int toplam=0; for(int i=1;i<=3;i++) toplam+=i; Console.Write("toplam={0}",toplam); } }
Bu program 1'den 3'e kadar olan tam saylar (1 ve 3 dhil) toplayp toplam ekrana yazacaktr.

using System; class AkisKontrolMekanizmalari { static void Main() { float s; int si,f; bool a=true; for(;a;) { Console.Write("Ltfen faktoriyelinin alnmasn istediiniz sayy girin: "); s=Convert.ToSingle(Console.ReadLine()); si=(int)s; if(si!=s||s<1) { Console.WriteLine("Ltfen pozitif tam say girin."); a=true; } else { a=false; for(f=1;si>1;si--) f*=si; Console.Write("Faktriyeli={0}",f); } } } }
Bu program girdiimiz herhangi bir saynn faktriyelini bulup ekrana yazar. Eer girdiimizi say tam say deilse veya 1'den kkse "Ltfen pozitif tam say girin." diyerek tekrar veri girii ister.

UYARI: C# nokta (.) iaretini saylarn ondalk ksmlarn ayrmak iin kullanrken, DOS ayn ama iin virgl (,) iaretini kullanr.

[dzenle]for dngsyle ilgili kurallar

for dngsnn parantezleri iindeki "for(int i=0;i<5;i++)" iki ifade ve bir koulun istenirse bir tanesi, istenirse bazlar, istenirse de tamam bo braklabilir; ancak noktal virgller mutlaka yazlmaldr.

Tahmin edebileceiniz gibi for dngsnn iinde veya "for(int i=0;i<5;i++)" ksmnda tanmlanan herhangi bir deiken dngnn dnda kullanlamaz. Bir deikeni dngnn dnda kullanabilmemiz iin o deikenin dngden nce tanmlanp ilk deer verilmesi ve deikeni kullanacamz yerde de faaliyet alannn devam etmesi gerekmektedir. Bu btn dngler ve koul yaplar iin geerlidir. rnein:

using System; class AkisKontrolMekanizmalari { static void Main() { int a=0; for(int i=0;i<1;i++) a=5; Console.Write(a); } }
Bu program ekrana 5 yazacaktr. Ancak;

using System; class AkisKontrolMekanizmalari { static void Main() { int a; for(int i=0;i<1;i++) a=5; Console.Write(a); } }
Bu program almaz, nk a deikeni dngden nce tanmlanmasna ramen ilk deer verilmiyor. HATIRLATMA: Bir deikenin faaliyet alan tanmland en i bloun iidir. NOT: Console.Write("{0,3}",i); gibi bir ifadede i deikeni 3 birimlik bir genilikte saa yasl olarak yazlr. WriteLine ile de kullanlabilir. i; deiken, sabit ya da ifade olabilirken 3 yalnzca sabit olmaldr. i bir ifade olsa bile parantez iine almaya gerek yoktur.

[dzenle]while dngs
Komut ya da komutlarn bir koul saland srece altrlmasn salar. Kuruluu:

while(koul) komut; veya while(koul) { komut1; komut2; . . . }

[dzenle]while dngsnn alma prensibi


while(koul) { komut1; komut2; . . . }
1) Koula baklr. Eer koul salanyorsa; 1.1) kme parantezleri iindeki ya da -kme parantezleri yoksa- kendinden sonra gelen ilk satrdaki komut altrlr. 1.2) 1. adma dnlr. 2) Eer koul salanmyorsa kme parantezleri dna ya da -kme parantezleri yoksa- kendinden sonra gelen ilk satrdaki komuttan hemen sonraki satra klr. Dolaysyla dngden klm olur.

Aslnda while dngs for dngsnn yalnzca kouldan oluan hlidir. Yani for(;i<0;) ile while(i<0) ayn dngy balatr.

[dzenle]do while dngs


imdiye kadar grdmz dnglerde nce koula baklyor, eer koul salanrsa dng iindeki komutlar altrlyordu. Ancak bazen dngdeki komutlarn koul salanmasa da en az bir kez altrlmasn isteyebiliriz. Bu gibi durumlar iin C#'ta do

while dngs vardr.

[dzenle]Kullanm
do komut; while(koul) veya do { komut1; komut2;

. . . }while(koul)

[dzenle]do while dngsnn alma prensibi


do { komut1; komut2; . . . }while(koul)
1) Dngdeki komutlar bir kez altrlr. 2) Koula baklr. 2.1) Eer koul salanyorsa 1. adma dnlr. 2.2) Eer koul salanmyorsa dngden klr.

[dzenle]Dnglerde kullanlan anahtar szckler


[dzenle]break
Hatrlarsanz break komutunu switch'teki case'lerden kmak iin kullanmtk. Benzer ekilde break komutu btn dnglerden kmak iin kullanlabilir. rnek:

using System; class AkisKontrolMekanizmalari { static void Main() { for(char a;;) { a=Convert.ToChar(Console.ReadLine()); if(a=='q') break; } } }
Bu program, kullanc "q" harfini girene kadar kapanmamaktadr.

[dzenle]continue
break szcne benzer. Ancak break szcnden farkl olarak program continue'u grdnde dngden kmaz, sadece dngnn o anki iterasyonu sonlanr. rnek:

using System; class AkisKontrolMekanizmalari {

static void Main() { for(int a=0;a<51;a++) { if(a%2==1) continue; Console.WriteLine(a); } } }


Bu program 0'dan 50'ye kadar (0 ve 50 dhil) olan ift saylar ekrana alt alta yazmaktadr.

[dzenle]goto
Nesneye ynelik programlamada pek ho grlmese de kullanabileceiniz baka bir komut "goto"dur. Aslnda eskiden BASIC gibi dillerde her satrn bir numaras vard ve bu szck satrlar arasnda dolamay salyordu. Ancak byle bir yntem nesne ynelimli programlamaya terstir. O yzden ok fazla kullanmamanz tavsiye edilir. rnek kullanm:

using System; class AkisKontrolMekanizmalari { static void Main() { birinci: Console.WriteLine("Birinci blm"); goto ucuncu; ikinci: Console.WriteLine("kinci blm"); ucuncu: Console.WriteLine("nc blm"); } }
Bu programda ikinci blm hibir zaman altrlmayacaktr.

[dzenle]Dnglerle ilgili kark rnekler

1'den 1000'e (snrlar dhil) kadar olan saylar ierisinde 5'e tam blnen, ancak 7'ye tam blnemeyen saylar alt alta listeleyen, bu saylarn ka tane olduunu ve toplamn yazan bir program yaznz.

using System; class AkisKontrolMekanizmalari { static void Main() { int toplam=0, sayi=0, i=5; for(;i<1001;i+=5)

{ if(i%35==0) continue; sayi++; toplam+=i; Console.WriteLine(i); } Console.WriteLine("Says: "+sayi); Console.WriteLine("Toplam: "+toplam); } }

Girilen pozitif herhangi bir tam sayy ikilik dzene eviren program yaznz.

using System; class AkisKontrolMekanizmalari { static void Main() { string mod=""; Console.Write("Ltfen ikilik sisteme dntrlmesini istediiniz saynz girin: "); float a=Convert.ToSingle(Console.ReadLine()); int b=(int)a; if(a<=0||a!=b) mod="Bir pozitif tam say girmediiniz iin saynz ikilik sisteme dntrlmedi!"; else for(;b>0;b/=2) mod=b%2+mod; Console.Write(mod); } }

Konsol ekranna girilen 0 ile 100 (snrlar dhil) arasndaki 10 notun en byn, en kn ve ortalamasn yazan program yaznz.

using System; class AkisKontrolMekanizmalari { static void Main() { int bs=0, toplam=0, ks=0; for(int a=0, b;a<10;a++) { Console.Write(a+1+". notu giriniz: "); b=Convert.ToInt32(Console.ReadLine()); if(b>100||b<0) {

Console.Write("Yanl not girdiniz. Ltfen tekrar "); a--; continue; } if(a==0) { bs=b; ks=b; } else { if(b>bs) bs=b; if(b<ks) ks=b; } toplam+=b; } Console.Write("En byk: {0}\nEn kk: {1}\nOrtalama: "+toplam/10,bs,ks); } }

C Sharp Programlama Dili/Rastgele say retme


Vikikitap, zgr ktphane
< C Sharp Programlama Dili

C#'ta program yazarken (zellikle oyun programlarnda) rastgele deerlere ihtiya duyabiliriz. Rastgele say retebilmemiz iin ncelikle Random snf trnden bir nesne yaratmalyz:

Random rnd=new Random();


Buradaki yarattmz nesnenin ad rnd. imdi bu nesne zerinden Random snfnn metotlarna eriebileceiz.

int RastgeleSayi1=rnd.Next(10,20); int RastgeleSayi2=rnd.Next(50); int RastgeleSayi3=rnd.Next(); double RastgeleSayi4=rnd.NextDouble();


Birinci rnekte: 10 ile 20 arasnda int trden rastgele bir say retilir, 10 dhil ancak 20 dhil deildir. kinci rnekte: 0 ile 50 arasnda int trden rastgele bir say retilir, 0 dhil ancak 50 dhil deildir. nc rnekte: int trden pozitif herhangi bir say retilir. Drdnc rnekte: double trden 0.0 ile 1 arasnda rastgele bir say retilir . Random snf System isim alan iinde bulunduu iin programmzn banda using System; satrnn bulunmas rastgele say retme metotlarn kullanabilmemiz iin yeterlidir.

C Sharp Programlama Dili/Diziler


Vikikitap, zgr ktphane
< C Sharp Programlama Dili

imdiye kadar birok deiken tanmladk ve programlarmzn iinde kullandk. Bir program iinde tanmladmz deiken says imdiye kadar bir elin parmaklarn gemedi. Ancak her zaman bu byle olmayabilir. Baz programlarda 200-300 deikene ihtiya duyabiliriz. Bunlarn hepsinin teker teker tanmlanmas olduka zahmetlidir. te bu yzden programlama dillerinde dizi diye bir kavram vardr. Aslnda bir dizi, birbiriyle ilikili deikenlerin oluturduu bir gruptan baka bir ey deildir. Diyelim ki sayi1 ve sayi2 adl iki deiken tanmladk. Bunlarn adlar birbirine benzemesine ramen birbiriyle hibir ilikisi yoktur. Yani bir dng iinde sayiX yazarak bu deikenlere eriemeyiz. Halbuki dizilerde bu mmkndr.
Konu balklar
[gizle]

1 Dizilerin tanmlanmas ve elemanlarnn kullanlmas 2 foreach 3 ok boyutlu diziler

3.1 Matris diziler

3.1.1 ki boyutlu matris diziler 3.1.2 kiden fazla boyutlu matris diziler

3.2 Dzensiz diziler

4 Dizilerle kullanlabilen metotlar

o o o o o o

4.1 GetLength() 4.2 CreateInstance metodu ile dizi tanmlama 4.3 Dizileri kopyalamak 4.4 Dizileri sralama 4.5 Dizilerde arama 4.6 Dier metotlar

[dzenle]Dizilerin

tanmlanmas ve elemanlarnn kullanlmas

int[] dizi=new int[25];


veya

int[] dizi; dizi=new int[25];

Yukardaki iki kodda da int trnden 25 elemanl dizi adnda bir dizi tanmland ve dizinin her bir elemanna int trnn varsaylan deeri atand. Varsaylan deerler, saysal trler iin 0, object t r iin NULL (yokluk), string tr iin "", char iin ' ' (boluk) ve bool iin false deerleridir.

Btn dizilerin birinci eleman 0. indeksidir. dizi dizisinin birinci elemanna dizi[0], 10. elemanna dizi[9] yazarak eriebilir ve bu dizi elemanlarn bir deikenmi gibi kullanabiliriz. rnek:

using System; class Diziler { static void Main() { int[] dizi=new int[20]; dizi[5]=30; Console.Write(dizi[5]); } }
Bu program ekrana 30 yazacaktr.

C ve C++ programlama dillerinde olduu gibi dizilerin elemanlarna aadaki gibi de deer atayabiliriz:

string[] dizi1={"Bir","ki",""}; int[] dizi2={2,-4,6}; float[] dizi3={2f,1.2f,7f};


Diziler yukardaki ekilde tanmlandnda sz konusu dizilerin eleman says yazlan eleman says olur. rnein yukardaki rneklerde dizinin de eleman says tr ve drdnc elemana ulamak istersek programmz alma zamannda hata verir. Bu ekilde dizi elemanlarna deiken ve ifadeler de atanabilir.

int[] dizi=new int[20]; satrnda 20'nin illaki sabit olmasna gerek yoktur. Deiken ya
da ifade de olabilir. rnek:

using System; class Diziler { static void Main() { int a=Convert.ToInt32(Console.ReadLine()); int[] dizi=new int[a+5]; dizi[5]=30; Console.Write(dizi[5]); } }

Eleman says belirlenen bir dizinin eleman says daha sonra deitirilemez. Birden fazla dizi aadaki gibi tanmlanabilir:

int[] dizi1=new int[10], dizi2=new int[20];


veya

int[] dizi1, dizi2;


kincisinde tanmlanan dizinin elemanlarna henz eriilemez.

[dzenle]foreach
foreach yalnzca dizilere uygulanabilen bir dng yapsdr. Kullanm u ekildedir:

int[] dizi={3,2,6,7}; foreach(int eleman in dizi) Console.WriteLine(eleman);


Burada dizi dizisinin btn elemanlar teker teker ekrana yazdrlyor.

foreach dngsyle dizi elemanlarnn deerini deitiremeyiz, sadece ekrana yazdrmak gibi "readonly" iler yapabiliriz.

[dzenle]ok

boyutlu diziler

ok boyutlu diziler ksaca her bir eleman bir dizi eklinde olan dizilerdir, matris dizileri (dzenli diziler) ve dzensiz diziler olmak zere ikiye ayrlr.

[dzenle]Matris

diziler

Her bir dizi elemannn eit sayda dizi ierdii dizilerdir.

[dzenle]ki boyutlu matris diziler


3X2 boyutunda iki boyutlu bir matris dizi aadaki gibi tanmlanabilir:

int[,] dizi=new int[3,2];


veya

int[,] dizi={{1,2},{3,4},{5,6}};
kinci dizinin elemanlar indekslerine gre aadaki gibidir. dizi[0,0] 1 dizi[0,1] 2 dizi[1,0] 3 dizi[1,1] 4 dizi[2,0] 5 dizi[2,1] 6 Bu diziyi matris olarak aadaki gibi gsterebiliriz:

dizi[0,0] dizi[0,1] dizi[1,0] dizi[1,1]

dizi[2,0] dizi[2,1]

1 3

2 4 6

[dzenle]kiden fazla boyutlu matris diziler


boyutlu bir dizi:

int[,,] dizi=new int[3,2,2];


veya

int[,,] dizi={{{1,2},{3,4}},{{5,6},{7,8}},{{9,10},{11,12}}};
Bu dizinin indekslerine gre elemanlarysa; dizi[0,0,0] 1 dizi[0,0,1] 2 dizi[0,1,0] 3 dizi[0,1,1] 4 dizi[1,0,0] 5 dizi[1,0,1] 6 dizi[1,1,0] 7 dizi[1,1,1] 8 dizi[2,0,0] 9 dizi[2,0,1] 10 dizi[2,1,0] 11 dizi[2,1,1] 12

foreach dngsyle i ie dng kurmaya gerek kalmadan her eit boyutlu matris dizinin elemanlarna ulalabilir.

Eer dizilerin elemanlarn deitirmemiz gerekiyorsa i ie for dngs kurmamz gerekir. rnek:

int[,,] dizi={{{1,2},{3,4}},{{5,6},{7,8}},{{9,10},{11,12}}}; for(int i=0;i<3;i++) for(int j=0;j<2;j++) for(int k=0;k<2;k++) dizi[i,j,k]=20;


Bu programda dizinin btn elemanlarnn deerini 20 ile deitirdik.

[dzenle]Dzensiz

diziler

Her bir dizi elemannn farkl sayda eleman ierebilecei ok boyutlu dizilerdir.

int[][] dizi=new int[3][]; dizi[0]=new int[3]; dizi[1]=new int[4];

dizi[2]=new int[2];
Birinci satrda 3 satr olan ancak stun says belli olmayan iki boyutlu bir dizi tanmlanyor. kinci, nc ve drdnc satrda da bu iki boyutlu dizinin her bir satrnn ka stun ierdii ayr ayr belirtiliyor.

dizi[0][0] dizi[0][1]

dizi[0][2 ]

dizi[1][0] dizi[1][1] dizi[1][2] dizi[1][3] dizi[2][0] dizi[2][1]

Dzensiz dizilerin elemanlarna, rnein 0,0 indeksine dizi[0][0] yazarak eriebiliriz. Dzensiz dizilerde foreach dngs sadece dizi adn yazarak almaz. Ana dzensiz dizinin her bir eleman iin farkl bir foreach dngs balatlmaldr.

imdiye kadar rendiimiz ekilde dzensiz dizilerin elemanlarn i ie for dngsyle deitiremeyiz. nk her satr farkl sayda stun ierebilecei iin satrlarn stun says dinamik olarak elde edilmelidir. Bunun iin C#'n System isim alanndaki Array snfna ait metotlar vardr ve her diziyle kullanlabilirler.

[dzenle]Dizilerle

kullanlabilen metotlar

[dzenle]GetLength()

x.GetLength(y) eklinde kullanlr. Herhangi bir dizinin eleman saysn int olarak tutar. x diziyi, y o
dizinin hangi boyutunun eleman saysnn hesaplanacan belirtir. rnekler:

int[] dizi={1,4,7,9}; Console.Write(dizi.GetLength(0));


Bu program ekrana 4 yazar.

int[,] dizi={{2,4,2},{7,10,4},{7,12,6},{2,1,12}}; byte a=dizi.GetLength(1); Console.WriteLine(a);


Bu program ekrana 3 yazar.

int[][] dizi=new int[3][]; dizi[0]=new int[]{1,2,3}; dizi[1]=new int[]{4,5,6,7}; dizi[2]=new int[]{8,9}; for(int i=0;i<dizi.GetLength(0);i++) for(int j=0;j<dizi[i].GetLength(0);j++) Console.WriteLine("dizi[{0}][{1}]={2}",i,j,dizi[i][j]);
Bu program dizinin btn elemanlarn teker teker ekrana yazar.

[dzenle]CreateInstance

metodu ile dizi tanmlama

imdiye kadar rendiimiz dizi tanmlama yntemlerinin yannda baka dizi tanmlama yntemleri de vardr.

Array dizi=Array.CreateInstance(typeof(int),5);
Burada int trnden 5 elemanl dizi adnda bir dizi tanmland ve dizinin her bir elemanna int trnn varsaylan deeri atand.

Array dizi=Array.CreateInstance(typeof(int),3,2,5);
Burada 3X2X5 boyutunda int trnden 3 boyutlu bir dizi oluturduk.

int[] dizi1=new int[5]{2,3,6,8,7}; Array dizi2=Array.CreateInstance(typeof(int),dizi1);


Burada 2X3X6X8X7 boyutunda be boyutlu bir dizi oluturduk.

CreateInstance yntemiyle oluturulan dizilere DiziAdi[0,4] gibi bir yntemle eriilemez. imdi bir rnek yapalm:

using System; class Diziler { static void Main() { Array dizi=Array.CreateInstance(typeof(int),5,4,3); for(int i=0;i<=dizi.GetUpperBound(0);i++) for(int j=0;j<=dizi.GetUpperBound(1);j++) for(int k=0;k<=dizi.GetUpperBound(2);k++) dizi.SetValue(i+j+k,i,j,k); for(int i=0;i<=dizi.GetUpperBound(0);i++) for(int j=0;j<=dizi.GetUpperBound(1);j++) for(int k=0;k<=dizi.GetUpperBound(2);k++) Console.WriteLine(dizi.GetValue(i,j,k)); } }
Daha nce CreateInstance yntemiyle oluturulan dizilere DiziAdi[0,4] gibi bir yntemle eriilemeyeceini sylemitik. te bunun iin eitli metotlar vardr. GetUpperBound: Bir dizinin son indeks numarasn verir. SetValue: Bir dizinin belirli bir indeksini belirli bir deerle deitirir. GetValue: Bir dizinin belirli bir indeksini tutar.

Bu metotlarn kullanmlar yukardaki rnek programda verilmitir. Bu metotlar normal ekilde oluturulan dizilerle de kullanlabilir.

[dzenle]Dizileri

kopyalamak

int[] dizi1={1,2,3,4}; int[] dizi2=new int[10];

dizi1.CopyTo(dizi2,3);
Burada dizi1'in tm elemanlar dizi2'ye 3. indeksten itibaren kopyalanyor.

int[] dizi1={1,2,3,4}; int[] dizi2=new int[10]; Array.Copy(dizi1,dizi2,3);


Burada 3 tane eleman dizi1'den dizi2'ye kopyalanr. Kopyalama ilemi 0. indeksten balar.

int[] dizi1={1,2,3,4,5,6,7}; int[] dizi2=new int[10]; Array.Copy(dizi1,2,dizi2,7,3);


Burada dizi1'in 2. indeksinden itibaren 3 eleman, dizi2'ye 7. indeksten itibaren kopyalanyor.

[dzenle]Dizileri
rnek:

sralama

using System; class Diziler { static void Main() { Array metinsel=Array.CreateInstance(typeof(string),8); metinsel.SetValue("Bekir",0); metinsel.SetValue("Mehmet",1); metinsel.SetValue("Tahir",2); metinsel.SetValue("Yusuf",3); metinsel.SetValue("Yunus",4); metinsel.SetValue("Gken",5); metinsel.SetValue("heda",6); metinsel.SetValue("Arzu",7); Console.WriteLine("Srasz dizi:"); foreach(string isim in metinsel) Console.Write(isim+" "); Console.WriteLine("\n\nSral dizi:"); Array.Sort(metinsel); foreach(string isim in metinsel) Console.Write(isim+" "); } }
Baka bir rnek:

using System; class Diziler { static void Main() { Array sayisal=Array.CreateInstance(typeof(int),8); sayisal.SetValue(200,0);

sayisal.SetValue(10,1); sayisal.SetValue(6,2); sayisal.SetValue(3,3); sayisal.SetValue(1,4); sayisal.SetValue(0,5); sayisal.SetValue(-5,6); sayisal.SetValue(12,7); Console.WriteLine("Srasz dizi:"); foreach(int sayi in sayisal) Console.Write(sayi+" "); Console.WriteLine("\n\nSral dizi:"); Array.Sort(sayisal); foreach(int sayi in sayisal) Console.Write(sayi+" "); } }
[dzenle]Dizilerde
rnek:

arama

using System; class Diziler { static void Main() { string[] dizi={"aye","osman","mer","yakup","meltem"}; Array.Sort(dizi); Console.Write(Array.BinarySearch(dizi,"osman")); } }
BinarySearch metodu, bir nesneyi bir dizi iinde arar, eer bulursa bulduu nesnenin indeksini tutar, bulamazsa negatif bir say tutar. BinarySearch' kullanabilmek iin diziyi daha nce Sort ile sralamalyz. Baka bir rnek:

using System; class Diziler { static void Main() { string[] dizi={"aye","osman","mer","yakup","meltem","rabia","mahmut","zafer"," ylmaz","alayan"}; Array.Sort(dizi); Console.Write(Array.BinarySearch(dizi,3,4,"yakup")); } }
BinarySearch burada 3. indeksten itibaren 4 eleman iinde "yakup"u arar. Bulursa indeksini tutar. Bulamazsa negatif bir say tutar.

UYARI: Yalnzca tek boyutlu diziler Sort ile sralanabilir, dolaysyla da ok boyutlu dizilerde hem Sort ile sralama hem de BinarySearch ile arama yapmak imkanszdr.

[dzenle]Dier

metotlar

Array.Clear(dizi,1,3);
Bu kod dizi dizisinin 1. indeksinden itibaren 3 indeksini sfrlar (varsaylan deere dndrr).

Array.Reverse(dizi);
Bu kod dizi dizisinin tamamn ters evirir.

Array.Reverse(dizi,1,3);
Bu kod dizi dizisinin 1. indeksten itibaren 3 elemann ters evirir.

C Sharp Programlama Dili/Metotlar


Vikikitap, zgr ktphane
< C Sharp Programlama Dili

u ana kadarki rneklerde hep nceden hazrlanm ReadLine(), WriteLine() vb. gibi metotlar kullandk. Artk kendi metotlarmz yapmann zaman geldi. Bilmem farknda msnz, ama aslnda btn rneklerimizde birer metot yaratmtk. O da alabilir her programda bulunmas gereken Main metoduydu. Artk Main metodu gibi baka metotlar yaratp programmzn iinde kullanabileceiz. Metotlar oluturarak programmz paralara bler ve programmzn karmakln azaltrz. Ayrca baz kodlar bir metot iine alp ayn kodlara ihtiyacmz olduunda bu metodu arabiliriz. Bu sayede de kod hamall yapmaktan kurtuluruz.
Konu balklar
[gizle]

1 Metot yaratm ve kullanm 2 Metotlarla ilgili nemli zellikler 3 Metot parametresi olarak diziler 4 Dizi ve deiken parametreler arasndaki fark

o o

4.1 ref anahtar szc 4.2 out anahtar szc

5 Metotlarn ar yklenmesi 6 Deiken sayda parametre alan metotlar 7 Kendini aran metotlar 8 Main metodu

o o

8.1 Main metodunun deer tutmas 8.2 Main metodunun parametre almas

9 System.Math snf ve metotlar

[dzenle]Metot

yaratm ve kullanm

int MetotAdi(int a,int b) { return a+b; }


Bu metot, iki tane int trnden girdi alr ve bu girdilerin toplamn int trnden tutar. Ancak bu metodu programmz iinde kullanabilmemiz iin bu metodun iinde bulunduu snf trnden bir nesne yaratp "." operatryle bu nesne zerinden metodumuza erimeliyiz. rnek:

using System; class Metotlar { int Topla(int a,int b) { return a+b; } static void Main() { Metotlar nesne=new Metotlar(); int a=nesne.Topla(2,5); Console.Write(a); } }

static olarak tanmlanan metotlara erimek iin metodun iinde bulunduu snf trnden bir nesne yaratmaya gerek yoktur. static olarak tanmlanan metotlara sadece metodun adn yazarak eriilebilir. rnek:

using System; class Metotlar { static int Topla(int a,int b) { return a+b; } static void Main() { int a=Topla(2,5); Console.Write(a); } }

Btn programlarda nce Main metodu alr. Dier metotlar Main metodunun iinden arlmadka almaz.

Eer metot, iinde bulunduumuz snfta deil de, baka bir snf iinde yaratlmsa o metodu kullanabilmek iin nce snf yazmamz gerekir. rnek:

using System; class Metotlar1 { public static int Topla(int a,int b) { return a+b; } } class Metotlar2 { static void Main() { int a=Metotlar1.Topla(2,5); Console.Write(a); } }
Dikkat ettiyseniz bu metodun yaratlma satrnn (4. satr) bana

public anahtar szc

konmu. public szcyle derleyiciye bu metoda her snftan eriilebileceini sylyoruz. Eer public szc yazlmam olsayd bu metoda sadece Metotlar1 snfndan eriilebilirdi.

imdi de static olmayan bir metodu baka bir snf iinde yaratalm ve kullanalm:

using System; class Metotlar1 { public int Topla(int a,int b) { return a+b; } } class Metotlar2 { static void Main() { Metotlar1 nesne=new Metotlar1(); int a=nesne.Topla(3,9); Console.Write(a); } }

Btn deer tutan metotlar bir deermi gibi kullanlabilir, ancak deikenmi gibi kullanlamaz. Herhangi bir deer tutmayan (WriteLine gibi) metotlar void anahtar szcyle yaratrz. rnek:

using System;

class Metotlar1 { static void Yaz(object a,int b) { for(;b>0;b--) Console.Write(a); } static void Main() { Yaz("deneme",5); } }
Burada oluturduumuz Yaz metodu ald ilk parametreyi ikinci parametre kere ekrana yazar. rnein programmzda "deneme" stringi ekrana 5 kez yazdrlyor.

Herhangi bir deer tutmayan metotlarda return; komutu, yanna herhangi bir ifade olmadan kullanlabilir. Aslnda return; komutunun asl grevi metottan kmaktr, ancak yanna baz ifadeler koyularak metodun tuttuu deeri belirtme vazifesi de grr. rnein bir if koulu yaratp, eer koul salanrsa metottan klmasn, koul salanmazsa baka komutlar da altrlmasn salayabiliriz. Ancak doal olarak bir metodun son satrnda return; komutunun kullanlmas gereksizdir. rnek kullanm:

using System; class Metotlar1 { static void Yaz(object a,int b) { if(b>10) return; for(;b>0;b--) Console.Write(a); } static void Main() { Yaz('n',10); } }
Bu programda eer metoda verilen ikinci parametre 10'dan bykse metottan hibir ey yaplmadan klyor.

[dzenle]Metotlarla

ilgili nemli zellikler

Metotlar kullanrken parametrelerini doru sayda, doru srada ve doru trde vermeliyiz. Deer tutan metotlarda return satryla belirtilen ifade, metodu yaratrken verilen trle uyumlu olmaldr.

Deer tutmayan (void ile belirtilmi) metotlarda return komutunun herhangi bir ifadeyle kullanlmas yasaktr.

Deer tutmayan metotlarn bir deermi gibi kullanlmas yasaktr. Metotlar deer tutmayabilecei gibi, parametre de almayabilirler. rnek program:

using System; class Metotlar1 { static void Yaz() { Console.Write("deneme"); } static void Main() { Yaz(); } }
Buradaki ekrana "deneme" yazan metot herhangi bir parametre almaz. Dolaysyla da programda kullanrken de parantezlerin iine hibir ey yazlmaz.

Bir metodun iinde baka bir metot yaratlamaz. rnein aadaki gibi bir kullanm hataldr:

using System; class Metotlar1 { static void Yaz() { Console.Write("deneme"); static void Ciz() { Console.Write("\n"); } } static void Main() { Yaz(); } }

Metot yaratlrkenki metot parantezinde "static

void Yaz(object a,int b)" veya metot

kme parantezlerinin iinde tanmlanan deikenler metottan kldnda bellekten silinirler. Eer ayn metot tekrar arlrsa sz konusu deikenler tekrar tanmlanp tekrar deerler atanr.

Metot yaratlrkenki metot parantezindeki deikenlerin trleri tek tek belirtilmelidir. Virgl ile ortak tr belirtimi yaplamaz. Yani static

void Ornek(int a,int b)yerine static void

Ornek(int a, b) yazlamaz.
[dzenle]Metot

parametresi olarak diziler

rnek:

using System; class Metotlar1 { static void Yaz(int[] dizi) { foreach(int i in dizi) Console.WriteLine(i); } static void Main() { int[] dizi={1,2,4,7,9}; Yaz(dizi); } }
Buradaki Yaz metodu kendisine parametre olarak verilen dizinin elemanlarn alt alta yazd. Eer yalnzca int[] trndeki deil btn trlerdeki dizileri ekrana yazan bir metot yazmak istiyorsak:

using System; class Metotlar1 { static void Yaz(Array dizi) { foreach(object i in dizi) Console.WriteLine(i); } static void Main() { int[] dizi={1,2,4,7,9}; Yaz(dizi); } }
Bu kullanm dorudur. Ancak aadaki kullanm hataldr:

using System; class Metotlar1 { static void Yaz(object[] dizi) { foreach(object i in dizi) Console.WriteLine(i); } static void Main() { int[] dizi={1,2,4,7,9}; Yaz(dizi); }

}
nk dizilerde deikenlerdeki gibi bir bilinsiz tr dnmnden bahsetmek imkanszdr.

[dzenle]Dizi

ve deiken parametreler arasndaki fark

Aadaki iki program karlatrn:

using System; class Metotlar1 { static void Degistir(int[] dizi) { for(int i=0;i<5;i++) dizi[i]=10; } static void Yaz(Array dizi) { foreach(object a in dizi) Console.WriteLine(a); } static void Main() { int[] dizi={1,2,4,7,8}; Degistir(dizi); Yaz(dizi); } } using System; class Metotlar1 { static void Degistir(int sayi) { sayi=10; } static void Yaz(int sayi) { Console.WriteLine(sayi); } static void Main() { int sayi=1; Degistir(sayi); Yaz(sayi); } }
Bu iki program altrdnzda greceksiniz ki metoda parametre olarak aktarlan dizinin metot iinde bir elemannn deitirilmesi esas diziyi etkiliyor. Ancak metoda parametre olarak aktarlan deikenin metot

iinde deitirilmesi esas deikeni etkilemiyor. nk bir metoda parametre olarak bir dizi verildiinde derleyici metoda dizinin bellekteki adresini verir; metot o adresteki verilerle alr. Dolaysyla da dizinin herhangi bir elemanndaki deiiklik esas diziyi etkileyecektir. nk gerek es as program, gerekse de metot ayn adresteki verilere eriir. Halbuki bir metoda parametre olarak bir deiken verdiimizde metot iin deikenin bellekteki adresi nemli deildir, metot iin nemli olan deikenin deeridir. Metot, deikeni kullanabilmek iin geici bir bellek blgesi yaratr ve parametre olarak ald deikenin deerini bu geici bellek blgesine kopyalar ve o geici bellek blgesiyle alr. Metottan kldnda da o geici bellek blgesi silinir. Peki bir metoda aktarlan bir deikende yaplan bir deiikliin tpk dizilerdeki gibi esas deikeni etkilemesini ister miydiniz? te bunun iin C#'n ref ve out olmak zere iki anahtar szc vardr.

[dzenle]ref
rnek:

anahtar szc

using System; class Metotlar1 { static void Degistir(ref int sayi) { sayi=10; } static void Yaz(int sayi) { Console.WriteLine(sayi); } static void Main() { int sayi=1; Degistir(ref sayi); Yaz(sayi); } }

ref anahtar szc deikenlerin metotlara adres gsterme yoluyla aktarlmasn salar. Grdnz
gibi ref szcnn hem metodu arrken , hem de metodu yaratrken deikenden nce yazlmas gerekiyor. Bu program ekrana 10 yazacaktr. Ayrca ref szcyle bir deikenin metoda adres gsterme yoluyla aktarlabilmesi iin esas programda deikene bir ilk dee r verilmelidir. Yoksa program hata verir. rnein aadaki program hata verir:

using System; class Metotlar1 { static void Degistir(ref int sayi) { sayi=10; }

static void Yaz(int sayi) { Console.WriteLine(sayi); } static void Main() { int sayi; Degistir(ref sayi); Yaz(sayi); } }
[dzenle]out

anahtar szc

Kullanm ref anahtar szcyle tamamen ayndr. Tek fark out ile belirtilen deikenlere esas programda bir ilk deer verilmesinin zorunlu olmamasdr. rnein aadaki kullanm tamamen dorudur.

using System; class Metotlar { static void Degistir(out int sayi) { sayi=10; } static void Yaz(int sayi) { Console.WriteLine(sayi); } static void Main() { int sayi; Degistir(out sayi); Yaz(sayi); } }
NOT: ref szcnn dizilerle kullanm gereksiz olmasna ramen C# bunu kstlamamtr. Ancak out szc dizilerle kullanlamaz.

[dzenle]Metotlarn

ar yklenmesi

C#'ta parametre says ve/veya parametrelerin trleri farkl olmak artyla ayn isimli birden fazla metot yaratlabilir. Buna metotlarn ar yklenmesi denir. C#, bir metot arldnda ve arlanla ayn isimli birden fazla metot bulunduunda metodun arl biimine bakar. Yani ana programdaki metoda girilen parametrelerle yaratlm olan metotlarn parametrelerini kyaslar. nce parametre saysna bakar. Eer ayn isimli ve ayn sayda parametreli birden fazla metot varsa bu sefer parametre trlerinde tam uyumluluk arar, parametre trlerinin tam uyumlu olduu

bir metot bulamazsa bilinsiz tr dnmnn mmkn olduu bir metot arar, onu da bulamazsa programmz hata verir. rnekler:

using System; class Metotlar { static void Metot1(int x,int y) { Console.WriteLine("1. metot arld."); } static void Metot1(float x,float y) { Console.WriteLine("2. metot arld."); } static void Metot1(string x,string y) { Console.WriteLine("3. metot arld."); } static void Main() { Metot1("deneme","deneme"); Metot1(5,6); Metot1(10f,56f); } }
Bu programda metot da ayn sayda parametre alm. Bu durumda parametrelerin trlerine baklr. Ana programdaki Metot1("deneme","deneme"); satryla nc metot arlr. Metot1(5,6); metot armnn parametre trlerinin tam uyumlu olduu metot birinci metottur, o yzden birinci metot arlr. Eer birinci metot yaratlmam olsayd ikinci metot arlacakt. Son olarak Metot1(10f,56f); satryla da ikinci metot arlr. Baka bir rnek:

using System; class Metotlar { static void Metot1(float x,float y) { Console.WriteLine("1. metot arld."); } static void Metot1(double x,double y) { Console.WriteLine("2. metot arld."); } static void Main() { Metot1(5,6); } }

Bu programda iki metodun da parametre says eit, iki metotta da tam tr uyumu yok ve iki metotta da bilinsiz tr dnm mmkn. Bu durumda en az kapasiteli trl metot arlr. Yani bu programda birinci metot arlr. Baka bir rnek:

using System; class Metotlar { static void Metot1(float x,float y) { Console.WriteLine("1. metot arld."); } static void Metot1(int x,int y) { Console.WriteLine("2. metot arld."); } static void Main() { Metot1(5,6.4f); } }
Bu durumda birinci metot arlr. Baka bir rnek:

using System; class Metotlar { static void Metot1(float x,float y) { Console.WriteLine("1. metot arld."); } static void Metot1(int x,int y) { Console.WriteLine("2. metot arld."); } static void Main() { Metot1('f','g'); } }
Bu durumda ikinci metot arlr. nk char hem inte hem de floata bilinsiz olarak dnebilir. Ancak int daha az kapasitelidir. NOT: Metotlarn geri dn tipi (tuttuu deerin tipi) faydalanlabilecek ayrt edici zelliklerden deildir. Yani iki metodun parametre says ve parametre trleri ayn ise tuttuu deer tipleri farkl olsa bile bunlarn herhangi biri arlmak istendiinde programmz derlenmeyecektir.

using System; class Metotlar {

static void Metot1(int x,int y,int z) { Console.WriteLine("1. metot arld."); } static void Metot1(int x,int y) { Console.WriteLine("2. metot arld."); } static void Metot1(float x,int y) { Console.WriteLine("3. metot arld."); } static void Main() { Metot1(3,3,6); Metot1(3.4f,3); Metot1(1,'h'); } }
Burada srasyla 1., 3. ve 2. metotlar arlacaktr.

[dzenle]Deiken

sayda parametre alan metotlar

imdiye kadar metotlarmza gnderdiimiz parametre says belliydi ve bu parametre saysndan farkl bir miktarda parametre girersek programmz hata veriyordu. Artk istediimiz sayda parametre girebileceimiz metotlar yapmasn greceiz. rnek:

using System; class Metotlar { static int Toplam(params int[] sayilar) { if(sayilar.Length==0) return 0; int toplam=0; foreach(int i in sayilar) toplam+=i; return toplam; } static void Main() { Console.WriteLine(Toplam()); Console.WriteLine(Toplam(5)); Console.WriteLine(Toplam(5,10)); Console.WriteLine(Toplam(2,9,12)); Console.WriteLine(Toplam(7,12,45)); Console.WriteLine(Toplam(123,12,5,7,9,4,12)); }

}
Burada ald parametrelerin toplamn tutan bir metot yazdk. Eer metoda hi parametre girilmemise 0 deerini dndrmektedir. Grdnz gibi params anahtar szcyle girilen tm parametreleri int[] trndeki sayilar dizisine aktardk ve bu diziyi metotta gnlmzce kullandk. Bir de bu programmzda Length zelliini grdnz. zellikler metotlara benzerler, metotlardan tek farklar "()" ksmlar olmamasdr. Dolaysyla parametre almazlar. rneimizde dizisinin eleman saysn int trnden tutar. Baka bir rnek:

sayilar.Length satr sayilar

using System; class Metotlar { static int Islem(string a,params int[] sayilar) { if(a=="carp") { if(sayilar.Length==0) return 1; int carpim=1; foreach(int i in sayilar) carpim*=i; return carpim; } else if(a=="topla") { if(sayilar.Length==0) return 0; int toplam=0; foreach(int i in sayilar) toplam+=i; return toplam; } else return 0; } static void Main() { Console.WriteLine(Islem("topla",3,4,7,8)); Console.WriteLine(Islem("carp",5,23,6)); } }
Bu programdaki gibi metodumuzda deiken parametre yannda bir ya da daha fazla normal sabit parametre de olabilir. Ancak deiken parametre mutlaka en sonda yazlmaldr. NOT: Deer dndren metotlarmz mutlaka her durumda deer dndrmelidir. rnein metodumuzda sondaki else kullanlmazsa programmz derlenmez. nk else'i kullanmasaydk birinci parametre yalnzca "carp" veya "topla" olduunda metodumuz bir deer dndrecekti. Ve bu da C# kurallarna aykr.

NOT: Deiken sayda parametre alan metotlar ar yklenmi metotlar olduunda deerlendirilmeye alnmaz. rnek:

using System; class Metotlar { static void Metot1(int x,int y) { Console.WriteLine("1. metot arld."); } static void Metot1(int x,params int[] y) { Console.WriteLine("2. metot arld."); } static void Main() { Metot1(3,6); } }
Burada 1. metot arlr. Ancak,

using System; class Metotlar { static void Metot1(int x,int y) { Console.WriteLine("1. metot arld."); } static void Metot1(int x,params int[] y) { Console.WriteLine("2. metot arld."); } static void Main() { Metot1(3,6,8); } }
Burada 2. metot arlr.

[dzenle]Kendini

aran metotlar

C#'ta bir metodun iinde ayn metot arlabilir. rnek:

using System; class Metotlar { static int Faktoriyel(int a) { if(a==0)

return 1; return a*Faktoriyel(a-1); } static void Main() { Console.WriteLine(Faktoriyel(0)); Console.WriteLine(Faktoriyel(1)); Console.WriteLine(Faktoriyel(4)); Console.WriteLine(Faktoriyel(6)); } }
Programlamadaki metot kavram aslnda matematikteki fonksiyonlar konusunun aynsdr. Matematikteki fonksiyonlar konusunda rendiiniz btn kurallar metotlarda uygulayabilirsiniz. rnein yukardaki rnek, matematikteki fonksiyonlar iyi bilen birisi iin fazla karmak gelmeyecektir. rnein:

Matematikteki fonksiyonlar konusunu bilen birisi bilir ki bir fonksiyona parametre olarak o fonksiyonun tersini verirsek sonu x kacaktr. rnein f(x)=2x+5 olsun. f(x) fonksiyonunun tersi f -1(x)=(x-5)/2'dir. imdi f(x) fonksiyonuna parametre olarak (x-5)/2 verirsek sonu x olacaktr. Yani f(x)f-1(x)=x'tir. imdi bu kural bir metotla dorulayalm.

using System; class Metotlar { static float Fonksiyon(float x) { return 2*x+5; } static float TersFonksiyon(float x) { return (x-5)/2; } static void Main() { float x=10; Console.WriteLine(Fonksiyon(x)); Console.WriteLine(TersFonksiyon(x)); Console.WriteLine(Fonksiyon(TersFonksiyon(x))); } }
Bu program ekrana srasyla 25, 2.5 ve 10 yazacaktr. Eer ortada bir blme ilemi varsa ve matematiksel ilemler yapmak istiyorsak deikenler int trnden deil, float ya da double trnden olmaldr. nk int tr ondalk ksm almaz, dolaysyla da int tryle yaplan blme ilemlerinde hatal sonular kabilir. nk rnein 2 says 2.5 saysna eit deildir.

[dzenle]Main

metodu

Bildiiniz gibi alabilir her programda Main metodunun bulunmas gerekiyor. Btn programlarda nce Main metodu altrlr. Dier metotlar Main metodunun iinden arlmadka almaz. Bu zellikler dnda Main metodunun dier metotlardan baka hibir fark yoktur. Ancak imdiye kadar Main metodunu yalnzca static

void Main() eklinde yarattk. Yani herhangi bir parametre almad ve herhangi bir

deer tutmad. Ancak Main metodunun bir deer tutmasn veya parametre almasn salayabiliriz.

[dzenle]Main

metodunun deer tutmas


int Main() eklinde de yaratabiliriz. Peki bu ne iimize yarayacak?

Main metodunu static

Buradaki kritik soru "Main metodunu kim aryor?"dur. Biraz dnnce bu sorunun cevabnn iletim sistemi olduunu greceksiniz. Peki iletim sistemi Main metodunun tuttuu deeri ne yapacak? Programlar eitli ekillerde sonlanabilirler. rnein Main metodu 0 deerini dndrrse iletim sistemi programn dzgn ekilde sonlandrldn, 1 deerini dndrrse de hatal sonlandrldn anlayabilecektir. Ancak imdilik bunlar kullanmamza gerek yok.

[dzenle]Main

metodunun parametre almas

Tahmin edeceiniz gibi Main metoduna parametreler iletim sisteminden verilir. Main metodu, komut satrndan girilen argmanlar string trnden bir diziye atayp programmzda gnlmzce kullanmamza izin verir.

static void Main(string[] args)


Burada komut satrndan girilen argmanlar string[] trndeki args dizisine aktarlyor. Bu diziyi programmzda gnlmzce kullanabiliriz. rnein programmz deneme.exe olsun. Komut satrndan

deneme aye bekir rabia


girilirse ilk szck olan deneme ile programmz altrlr ve aye, bekir ve rabia szckleri de string[] trndeki args dizisine aktarlr. rnek bir program:

using System; class Metotlar { static void Main(string[] args) { Console.WriteLine("Komut satrndan unlar girdiniz: "); foreach(string i in args) Console.WriteLine(i); } }
Bu program komut satrndan girilen argmanlar ekrana alt alta yazacaktr. Komut satrnda program adndan sonra girilen ilk szck args dizisinin 0. indeksine, ikinci szck 1. indeksine, nc szck 2. indeksine vs. aktarlr.

[dzenle]System.Math

snf ve metotlar

.Net snf ktphanesinde belirli matematiksel ilemleri yapan birok metot ve iki tane de zellik vardr. System.Math snfndaki metotlar static olduklar iin bu metotlar kullanabilmek iin iinde bulunduklar snf trnden bir nesne yaratmaya gerek yoktur. System.Math snfndaki iki zellik matematikteki pi ve e saylardr. imdi bu iki zellii rnek bir programda grelim:

using System; class Metotlar { static void Main() { double e=Math.E; double pi=Math.PI; Console.Write("e->"+e+" pi->"+pi); } }
PI ve E zellikleri double trnden deer tutarlar. imdi System.Math snfndaki btn metotlar bir tablo hlinde verelim:

Metot Abs(x) Cos(x) Sin(x) Tan(x)

Aklama Bir saynn mutlak deerini tutar. Bir saynn kosinsn tutar. Bir saynn sinsn tutar. Bir saynn tanjantn tutar.

Ceiling(x) x saysndan byk en kk tam sayy tutar (yukar yuvarlama). Floor(x) x saysndan kk en byk tam sayy tutar (aa yuvarlama).

Max(x,y) x ve y saylarnn en byn tutar. Min(x,y) x ve y saylarnn en kn tutar. Pow(x,y) x zeri y'yi tutar. Sqrt(x) Log(x) Exp(x) x'in karekkn tutar. x saysnn e tabannda logaritmasn tutar. e zeri x'in deerini tutar.

Log10(x) x saysnn 10 tabanndaki logaritmasn tutar.

imdi bir rnek verelim:

using System;

class Metotlar { static void Main() { int a=Math.Max(10,34); int b=Math.Abs(-3); double c=Math.Ceiling(12.67); Console.Write("Max:"+a+" Abs"+b+" Ceiling:"+c); } }
Bu metotlar eitli trlerden deer dndrebilirler. rnein Ceiling metodu double trnden deer dndrrken baka bir metot int trnden deer dndrebilir. Bunlar deneyerek bulabilirsiniz. Aklama yapma gereksinimi grmyorum.

C Sharp Programlama Dili/Snflar


Vikikitap, zgr ktphane
< C Sharp Programlama Dili

Snflar nesne ynelimli programlamann en nemli gesidir. Snflar sayesinde programlarmz parala ra blp karmakln azaltrz. C#'ta metotlar ve zellikler mutlaka bir snfn iinde olmaldr. Metotlar bir veya daha fazla komutun bir araya getirilmi halidir; parametre alabilirler, geriye deer dndrebilirler. zellikler ise bellek gzeneklerinin programlamadaki karlklardr. Bu bakmdan zellikler deikenlere benzerler. Aradaki en temel fark deikenlerin bir metot iinde tanmlanp yalnzca tanmland metot iinde etkinlik gsterebilmesine ramen zelliklerin tpk metotlar gibi bir ye eleman olmasdr. Bu bakmdan zelliklerin tuttuu deerlere daha fazla yerden eriilebilir.
Konu balklar
[gizle]

1 Snf Oluturmak 2 Ayn snf trnden birden fazla nesne oluturma 3 rnekler 4 this anahtar szc 5 get ve set anahtar szckleri 6 Yapc metotlar

6.1 Varsaylan yapc metot

7 Ykc metotlar 8 Static ye elemanlar

9 Static snflar 10 readonly anahtar szc

[dzenle]Snf

Oluturmak

zellii ve iki metodu olan rnek bir snf oluturulmas:

class SinifIsmi { public int ozellik1; private string ozellik2; float ozellik3; public int metot1(int a,int b) { return a+b; } private void metot2(string a) { Console.WriteLine(a); } }
Burada dikkatinizi public ve private anahtar szckleri ekmi olmal. Bir metot ya da zellie bulunduu snfn dndan da eriilebilmesini istiyorsak public szc kullanlr. private szc kullanmakla hibir ey yazmamak ayn etkiye sahiptir ve iki durumda da metot ya da zellie yalnzca bulunduu snfn iinden eriilebilir. Bu snftaki yalnzca

ozellik1 zelliine

ve metot1 metoduna SinifIsmi snfnn dndan eriilebilir. Dier zellik ve metotlara eriilemez. imdi bu snf programmzda kullanalm:

using System; class SinifIsmi { public int ozellik1; public string ozellik2; public float ozellik3; public int metot1(int a,int b) { return a+b; } public void metot2(string a) { Console.WriteLine(a); } } class EsasSinif { static void Main()

{ SinifIsmi nesne=new SinifIsmi(); Console.WriteLine(nesne.ozellik1); Console.WriteLine(nesne.ozellik2); Console.WriteLine(nesne.ozellik3); Console.WriteLine(nesne.metot1(2,5)); nesne.metot2("deneme"); } }


Bu programda SinifIsmi snfndaki btn zellik ve metotlarn public anahtar szc ile belirtildiine dikkat edin. Oluturduumuznesne nesnesiyle snfn btn zellik ve metotlarna eritik. ozellik1, ozellik2 ve ozellik3 zelliklerine hibir deer atanmam, ancak programmz hata vermedi, sadece derleme sonunda uyar verdi. nkSinifIsmi

nesne=new

SinifIsmi(); satrndaki new anahtar szc sayesinde snftaki btn zellikler nesne nesnesi
iin trlerine gre varsaylan deere atand. Eer SinifIsmi

nesne=new

SinifIsmi(); yerine SinifIsmi nesne; yazsaydk programmz hata verirdi. Ayrca


programmzda metot2 metodu deer tutan deil, i yapan bir metot, o yzden tek bana kullanld. Baka bir rnek:

using System; class SinifIsmi { public int ozellik1=55; public string ozellik2="deneme"; public float ozellik3=123.78f; public int metot1(int a,int b) { return a+b; } public void metot2(string a) { Console.WriteLine(a); } } class EsasSinif { static void Main() { SinifIsmi nesne=new SinifIsmi(); Console.WriteLine(nesne.ozellik1); Console.WriteLine(nesne.ozellik2); Console.WriteLine(nesne.ozellik3); Console.WriteLine(nesne.metot1(2,5)); nesne.metot2("Vikikitap"); } }

Bu programda ise zelliklere nce deer verdik ve esas programda da bu deerler ekrana yazld.

[dzenle]Ayn

snf trnden birden fazla nesne oluturma

Tahmin edebileceiniz gibi C#'ta ayn snf trnden birden fazla nesne oluturulabilir ve bu nesnelerle snfn zellik ve metotlarna eriilebilir. rnek:

using System; class KrediHesabi { public ulong HesapNo; } class AnaSinif { static void Main() { KrediHesabi hesap1=new KrediHesabi(); KrediHesabi hesap2=new KrediHesabi(); hesap1.HesapNo=3456; hesap2.HesapNo=1111; Console.WriteLine(hesap1.HesapNo); Console.WriteLine(hesap2.HesapNo); } }
Burada KrediHesabi snf trnden hesap1 ve hesap2 adl iki nesne tanmland ve bu nesnelerle KrediHesabi snfnn HesapNo zelliine eriildi. Burada bilmemiz gereken ey farkl nesnelerle bir snfn zelliine eriip zelliin deerini deitirdiimizde aslnda birbirinden farkl deikenlerin deerini deitirmi olmamzdr. Bu program ekrana alt alta 3456 ve 1111 yazacaktr. nk KrediHesabi

hesap1=new KrediHesabi(); ve KrediHesabi hesap2=new

KrediHesabi(); satrlaryla birbirinden farkl iki nesne oluturduk ve bu iki nesne iin bellekte ayr
ayr alan tahsisat yaptk. Eer program yle deitirirsek,

using System; class KrediHesabi { public ulong HesapNo; } class AnaSinif { static void Main() { KrediHesabi hesap1=new KrediHesabi(); KrediHesabi hesap2=hesap1; hesap1.HesapNo=3456; hesap2.HesapNo=1111; Console.WriteLine(hesap1.HesapNo); Console.WriteLine(hesap2.HesapNo);

} }
Bu durumda alt alta 1111 ve 1111 yazlacaktr. nk KrediHesabi

hesap2=hesap1; satryla KrediHesabi snf trnden yeni bir nesne oluturduk ancak bu nesne
iin bellekte ayr bir alan tahsisat yapmadk. Nesneyi

hesap1 nesnesinin bellekteki adresine ynlendirdik.

Dolaysyla hesap1'in zelliinde yaplan bir deiiklik hesap2'yi,hesap2'nin zelliinde yaplan bir deiiklik de hesap1'i etkileyecektir. Baka bir rnek program:

using System; class EsasSinif { int a; static void Main() { EsasSinif nesne=new EsasSinif(); Console.WriteLine(nesne.a); } }
Grdnz gibi zellik ve metot tanmlamalar iin ayr bir snf oluturmak zorunda deiliz. Main() metodunun olduu snfa istediimiz ye elemanlar ekleyebiliriz. Bu durumda a zelliine eriebilmek iin a zelliini public olarak belirtme zorunluluundan da kurtulmu olduk. NOT: Farkndaysanz imdiye kadar hibir metot ya da zelliimizi

static anahtar szcyle

belirtmedik. static anahtar szcyle belirttiimiz metot ya da zellikleri direkt olarak sz konusu metot ya da zelliin adn yazarak kullanabilriz. rnek:

using System; class EsasSinif { static int a; static void Main() { Console.WriteLine(a); } }
Bu program ekrana 0 yazacaktr. Eer a'ya bir deer verseydik o deer yazacakt. NOT: Diziler tpk deikenler gibi birbirine atanabilirler. rnek:

int[] a={1,6,7,12}; int[] b=a;


Burada b dizisine a dizisi adres gsterme yoluyla aktarlmtr, dolaysyla da a dizisinin bir elemannda yaplan bir deiiklik b dizisini, b dizisinin bir elemannda yaplan bir deiiklik a dizisini etkileyecektir. nk diziler birbirlerine adres gsterme yoluyla atanr. Ayrca aadaki gibi bir kullanm da dorudur:

int[] a={1,6,7,12}; int[] b={1,5}; b=a;


Burada b dizisi sahip olduu elemanlar kaybedip a dizisinin adresine ynlendi. Bu ve benzer ekilde diziler birbirlerine atanabilir. Yani ayn adrese ynlendirilebilirler.

[dzenle]rnekler
Bu program bir metoda girilen iki parametreyi ve bunlarn arpmn ekrana yazar. Eer bir dikdrtgen sz konusu olduunu dnrsek dikdrtgenin enini, boyunu ve alann ekrana yazar.

using System; class Dortgen { public int En; public int Boy; public int Alan() { int Alan=En*Boy; return Alan; } public void EnBoyBelirle(int en,int boy) { En=en; Boy=boy; } public void Yaz() { Console.WriteLine("***************"); Console.WriteLine("En:{0,5}",En); Console.WriteLine("Boy:{0,5}",Boy); Console.WriteLine("Alan:{0,5}",Alan()); Console.WriteLine("***************"); } } class AnaSinif { static void Main() { Dortgen d1=new Dortgen(); d1.EnBoyBelirle(20,50); d1.Yaz(); Dortgen d2=new Dortgen(); d2.EnBoyBelirle(25,12); d2.Yaz(); } }

Bu program Main bloundan almaya balar. nce Dortgen snf trnden d1 nesnesi oluturulur. Bu nesneyle Dortgen snfndaki EnBoyBelirle metodu altrlr. Bu metot geerli nesne iin En ve Boy zelliini metoda girilen parametreler yapar. Sonra ayn nesneyle Yaz metodu altrlyor. Yaz metodu da geerli nesnenin zelliklerini veAlan metodunun sonucunu ekrana yazdryor. Sonra ayn olaylar d2 nesnesi iin de gerekleiyor. Burada nemli olan bir snf trnden oluturduumuz her bir nesne iin bellekte o snftaki tm metot ve zellikler iin bir yer almas ve tm ilemlerin o bellek blgesinde yaplmas olayn kavramamz. Ayrca grdnz gibi static olmayan metotlarn gvdesinde ayn snftaki zellik ve metotlar static olsun olmasn direkt olarak kullanlabiliyor. Ancak program yle deitirseydik hata kacakt.

using System; class Dortgen { public int En=20; public int Boy=5; public int Alan() { int Alan=En*Boy; return Alan; } static void Main() { Console.WriteLine("***************"); Console.WriteLine("En:{0,5}",En); Console.WriteLine("Boy:{0,5}",Boy); Console.WriteLine("Alan:{0,5}",Alan()); Console.WriteLine("***************"); } }
nk burada En ve Boy zellikleriyle Alan() metodu tek bana kullanlamaz. nce Dortgen snf trnden bir nesne oluturup bu nesne zerinden bu zellik ve metotlara eriilmelidir. nk Main metodu static bir metottur. Baka bir rnek:

using System; class Dortgen { public int En; public int Boy; public int Alan() { int Alan=En*Boy; return Alan; } public void EnBoyBelirle(int en,int boy) { En=en;

Boy=boy; } public void Yaz() { Console.WriteLine("***************"); Console.WriteLine("En:{0,5}",En); Console.WriteLine("Boy:{0,5}",Boy); Console.WriteLine("Alan:{0,5}",Alan()); Console.WriteLine("***************"); } static void Main() { Dortgen d1=new Dortgen(); d1.EnBoyBelirle(20,50); d1.Yaz(); Dortgen d2=new Dortgen(); d2.EnBoyBelirle(25,12); d2.Yaz(); } }
Bu program da geerlidir. Baka bir rnek:

using System; class Dortgen { public int En=30; public int Boy=23; public int Alan() { int Alan=En*Boy; return Alan; } static void Main() { yaz d1=new yaz(); d1.Yaz(); } } class yaz { public void Yaz() { Console.WriteLine("***************"); Console.WriteLine("En:{0,5}",Dortgen.En); Console.WriteLine("Boy:{0,5}",Dortgen.Boy); Console.WriteLine("Alan:{0,5}",Dortgen.Alan()); Console.WriteLine("***************"); }

}
Bu program almaz. nk, static olmayan metotlarn gvdesinde sadece ayn snftaki zellik ve metotlar static olsun olmasn direkt olarak kullanlabilir. imdi evimizin yelerinin (annemizin, babamzn vs.) zelliklerini gireceimiz, yalarn hesaplayacamz daha zevkli bir rnek yapalm. Yani evimizi bir snfm gibi dnelim.

using System; class EvHalki { public int DogumYili; public string Meslek; public string Ad; public string GozRengi; public int Yas() { return 2008-DogumYili; } public void OzellikleriYaz() { Console.WriteLine("---------------"); Console.WriteLine("Ad: "+Ad); Console.WriteLine("Ya: "+Yas()); Console.WriteLine("Meslei: "+Meslek); Console.WriteLine("Gz rengi: "+GozRengi); Console.WriteLine("---------------"); } } class AnaProgram { static void Main() { EvHalki annem=new EvHalki(); //EvHalki snf trnden yeni bir nesne oluturuldu. annem.DogumYili=1964; //Oluturulan nesnenin bir zellii girildi. annem.Meslek="Ev hanm"; annem.Ad="Hatice"; annem.GozRengi="Mavi"; EvHalki babam=new EvHalki(); babam.DogumYili=1950; babam.Meslek="Emekli"; babam.Ad="Kenan"; babam.GozRengi="Kahverengi"; EvHalki kardesim=new EvHalki(); kardesim.DogumYili=1987; kardesim.Meslek="renci"; kardesim.Ad="Uur";

kardesim.GozRengi="Yeil"; annem.OzellikleriYaz(); babam.OzellikleriYaz(); kardesim.OzellikleriYaz(); } }


imdi bu programda ufak bir oynama yapalm:

using System; class EvHalki { public int DogumYili; public string Meslek; public string Ad; public string GozRengi; public int Yas() { return 2008-DogumYili; } public void OzellikleriYaz() { Console.WriteLine("---------------"); Console.WriteLine("Ad: "+Ad); Console.WriteLine("Ya: "+Yas()); Console.WriteLine("Meslei: "+Meslek); Console.WriteLine("Gz rengi: "+GozRengi); Console.WriteLine("---------------"); } } class AnaProgram { static void Main() { EvHalki annem=new EvHalki(); annem.DogumYili=1964; annem.Meslek="Ev hanm"; annem.Ad="Hatice"; annem.GozRengi="Mavi"; EvHalki babam=new EvHalki(); babam.OzellikleriYaz(); } }
Grdnz gibi annemin zellikleri girilmesine ramen OzellikleriYaz metodu arlmad iin zellikler ekrana yazlmad. Ayrca da babama da herhangi bir zellik girilmemesine ramen OzellikleriYaz metoduyla ekrana yazdrdk. Ekrana btn zelliklerin varsaylanlar yazld. nk EvHalki

babam=new EvHalki();satrndaki alt izili ksm sayesinde bellekte babam

nesnesi iin ayr bir yer ayrld ve btn zellikler varsaylan deere atand. Yalnzca

EvHalki

babam; satr olsayd Evhalki snf trnden babam nesnesi oluturulurdu, ancak bellekte bu nesne iin
ayr bir yer ayrlmazd.

[dzenle]this

anahtar szc

imdi yle bir program yazalm:

using System; class Dortgen { public int En; public int Boy; void EnBoyBelirle(int en,int boy) { En=en; Boy=boy; } static void Main() { Dortgen d1=new Dortgen(); d1.EnBoyBelirle(20,50); Console.WriteLine(d1.En+"\n"+d1.Boy); } }
Tahmin edebileceiniz bu programda nce d1 nesnesinin En ve Boy zelliini srasyla 20 ve 50 olarak ayarlyoruz, sonra da bu d1 nesnesinin zelliklerini ekrana yazdryoruz. Bu program yle de yazabilirdik:

using System; class Dortgen { public int En; public int Boy; void EnBoyBelirle(int en,int boy) { this.En=en; this.Boy=boy; } static void Main() { Dortgen d1=new Dortgen(); d1.EnBoyBelirle(20,50); Console.WriteLine(d1.En+"\n"+d1.Boy); } }
Buradaki this anahtar szcklerinin Trke karl "beni aran nesnenin"dir. Peki ama zaten this'i yazmasak da ayn ey olurdu. imdi baka bir rnek yapalm:

using System; class Dortgen { public int En; public int Boy; void EnBoyBelirle(int En,int Boy) { En=En; Boy=Boy; } static void Main() { Dortgen d1=new Dortgen(); d1.EnBoyBelirle(20,50); Console.WriteLine(d1.En+"\n"+d1.Boy); } }
C# bu ekilde bir kullanma izin verir. nk Main blounda EnBoyBelirle metodunu altrdmzda sadece EnBoyBelirle metodu alr, dolaysyla da derleyici bu metottan nce tanmlanm olan En ve Boy zelliklerini grmez. Burada alnan parametreler En ve Boy deikenlerine atanyor. Sonra En=En; ve Boy=Boy; satrlaryla da aslnda alnan parametreler yine ayn deikenlere atanyor. Tahmin edebileceiniz gibi aslnda burada bizim yapmak istediiniz ald parametreleri d1 nesnesinin En ve Boy zelliklerine aktarmak. te bunun iin this anahtar szcn kullanlrz:

using System; class Dortgen { public int En; public int Boy; void EnBoyBelirle(int En,int Boy) { this.En=En; this.Boy=Boy; } static void Main() { Dortgen d1=new Dortgen(); d1.EnBoyBelirle(20,50); Console.WriteLine(d1.En+"\n"+d1.Boy); } }
Bu programda artk EnBoyBelirle metodunun ald parametreler d1 nesnesinin zelliklerine atanacaktr. Benzer ekilde C# aadaki gibi bir kullanma da izin verir.

using System; class Dortgen

{ int En; int Boy; static void Main() { int En=50; int Boy=100; Console.WriteLine(En+"\n"+Boy); } }
Eer En ve Boy deikenleri Main blounun iinde tanmlanmasayd programmz hata verecekti. Baka bir rnek:

using System; class Dortgen { static int En=8; static int Boy=3; static void Main() { int En=50; int Boy=100; Console.WriteLine(En+"\n"+Boy); } }
Burada ekrana srasyla 50 ve 100 yazlacaktr. Ancak;

using System; class Dortgen { static int En=8; static int Boy=3; static void Main() { int Boy=100; Console.WriteLine(En+"\n"+Boy); } }
Bu sefer de ekrana srasyla 8 ve 100 yazld. nk derleyici En deikenini Main blou iinde bulamaynca snfn bir zellii olan En'i ekrana yazd. En ve Boy zellikleri static olarak tanmland iin bu zelliklere nesne oluturmaya gerek kalmadan direkt eriebildik.

[dzenle]get

ve set anahtar szckleri

imdi aadaki kk program yazalm:

using System;

class YardimciSinif { int Sayi; public void SayiBelirle(int sayi) { Sayi=sayi; } public int SayiAl() { return Sayi; } } class AnaSinif { static void Main() { YardimciSinif nesne=new YardimciSinif(); nesne.SayiBelirle(34); Console.WriteLine(nesne.SayiAl()); } }
Bu program olduka basit. YardimciSinif snfnn iki tane metodu ve bir tane de zellii var. Ancak zellik private olduu iin bu zellie baka bir snftan erimek veya deitirmek mmkn deil. Bu yzden bu zellii deitirmek veya bu zellie erimek istediimizde public olan SayiBelirle ve SayiAl metotlarn kullandk. Peki bunun bize ne faydas var? Aslnda Sayi zelliini public olarak ayarlayp direkt olarak zellik zerinde ilem yaplabilirdi. te faydas:

using System; class YardimciSinif { int Sayi; public void SayiBelirle(int sayi) { if(sayi<0) Sayi=0; else Sayi=sayi; } public int SayiyiAl() { if(Sayi>100) return Sayi/100; else return Sayi; } } class AnaSinif

{ static void Main() { YardimciSinif nesne=new YardimciSinif(); nesne.SayiBelirle(34); Console.WriteLine(nesne.SayiAl()); } }


Grdnz gibi zellie deer atamay ve zelliin deerini ekrana yazdrmay metotlar sayesinde koullandrabildik. Eer direkt zellik zerinde ilem yapmaya kalksaydk byle bir ansmz olmazd. imdi benzer bir durumu set ve get szckleriyle oluturalm:

using System; class YardimciSinif { int Sayi; public int SahteOzellik { set { if(value<0) Sayi=0; else Sayi=value; } get { if(Sayi>100) return Sayi/100; else return Sayi; } } } class AnaSinif { static void Main() { YardimciSinif nesne=new YardimciSinif(); nesne.SahteOzellik=110; Console.WriteLine(nesne.SahteOzellik); } }
Grdnz gibi nce YardimciSinif snfnda SahteOzellik adl bir zellik oluturduk. Bu zellik gerekten de sahtedir. zellie bir deer atanmaya alldnda set bloundaki, zellik kullanlmaya alldnda da get bloundaki komutlar altrlr. Aslnda C# ktphanesindeki zelliklerin

ou bu yntemle oluturulmutur. rnein ileride greceimiz Windows programlamada bir buton nesnesinin Text zelliini deitirdiimizde butonun zerindeki yaz deiir. Halbuki klasik zelliklere deer atama ynteminde sadece zelliin deeri deiirdi. Bu yntemde ise bir zellie deer atadmzda alacak komutlar yazabiliyoruz. Unutmadan syleyeyim; programdaki

value szc zellie girilen

deeri tutar. zellie girilen deer hangi trdeyse o trde tutar. Ayrca bu oluturulan SahteOzellik zelliinin metotlara olduka benzediini de dikkatinizi ekmi olmal. NOT: Aslnda tanmladmz her dizi Array snf trnden bir nesnedir. te bu yzden tanmladmz dizilerle Array snfnn metot ve zelliklerine eriebiliriz. rnein

LengthArray snf trnden bir zelliktir

ve dizinin eleman saysn verir. DiziAdi.Length yazlarak bu zellie eriilebilir. NOT: Metot ve zelliklerin geri dn tipi bir dizi olabilir. rnek:

using System; class YardimciSinif { public int[] Dizi={7,4,3}; public int[] Metot() { int[] a={23,45,67}; return a; } } class AnaSinif { static void Main() { YardimciSinif nesne=new YardimciSinif(); Console.WriteLine(nesne.Dizi[0]); Console.WriteLine(nesne.Metot()[2]); } }
imdi isterseniz bir dizinin trn istenilen tre dntrmeye yarayan bir snf yazalm. Yani snftaki metotlar dizinin btn elemanlarn istenilen tre dntrp bu oluturulan yeni diziyi tutacak. C#'ta diziler arasnda bilinsiz tr dnm mmkn olmad gibi, bu ii yapacak metot da yok. Yani yapacamz metotlar olduka faydal olacaktr.

using System; class Donustur { public static int[] Inte(Array dizi) { int[] gecici=new int[dizi.Length]; for(int i=0;i<dizi.Length;i++) gecici[i]=Convert.ToInt32(dizi.GetValue(i)); return gecici;

} public static string[] Stringe(Array dizi) { string[] gecici=new string[dizi.Length]; for(int i=0;i<dizi.Length;i++) gecici[i]=dizi.GetValue(i).ToString(); return gecici; } }
Snfmz bu ekilde. Ancak snfmzn yalnzca inte ve stringe dntm yapan iki metodu var. sterseniz dnm yaplabilecek tr saysn yeni metotlar ekleyerek artrabilirsiniz. imdi bu snf bir program iinde kullanalm.

using System; class Donustur { public static int[] Inte(Array dizi) { int[] gecici=new int[dizi.Length]; for(int i=0;i<dizi.Length;i++) gecici[i]=Convert.ToInt32(dizi.GetValue(i)); return gecici; } public static string[] Stringe(Array dizi) { string[] gecici=new string[dizi.Length]; for(int i=0;i<dizi.Length;i++) gecici[i]=dizi.GetValue(i).ToString(); return gecici; } } class AnaProgram { static void Main() { string[] a={"2","5","7","9"}; int[] b=Donustur.Inte(a); Console.WriteLine(b[1]+b[3]); int[] c={2,7,9,4}; string[] d=Donustur.Stringe(c); Console.WriteLine(d[0]+d[3]); } }
HATIRLATMA: Grdnz gibi metotlarn parametresindeki dizi, Array

DiziAdi yntemiyle

oluturulduu iin bu dizinin elemanlarna klasik indeksleme yntemiyle eriemeyiz. Bu yzden bu dizinin elemanlarna ulamak iin Array snfnn GetValue() metodunu kullandk.

Convert snfnn diziler iin olann oluturduktan sonra imdi de DOS ekranna bir kutu izen snf hazrlayalm. Kutuyu , , , , , ve karakterleriyle oluturacaz. Bu karakterlerin Unicode karlklarysa:

Karakter

Unicode karl (16'lk sistemde) 2554 2550 2557 2551 255A 255D

Microsoft Word'u ap "Ekle" mensnden "Simge"yi setinizde bunlar gibi daha birok simgeye eriebilirsiniz. Simgeleri direkt kopyala-yaptr yapabileceiniz gibi Unicode karlklarn renip programnzda bu kodlar da kullanabilirsiniz. Ancak eer kopyala-yapotr yapmsanz kod dosyanz (program.cs'nizi) kaydederken kodlamasn Unicode olarak deitirin. Kodu Not Defteri'nde yazyorsanz kaydetmek istediinizde zaten sistem sizi uyaracaktr. imdi snf yazmaya balayalm:

using System; class Buton { public int Genislik; public int Yukseklik; public void Ciz() { string[,] dizi=new string[Yukseklik+2,Genislik+3]; dizi[0,0]=""; dizi[0,Genislik+1]=""; dizi[Yukseklik+1,0]=""; dizi[Yukseklik+1,Genislik+1]=""; for(int i=1;i<Genislik+1;i++) { dizi[0,i]=""; dizi[Yukseklik+1,i]=""; } for(int i=0;i<=Yukseklik;i++) dizi[i,Genislik+2]="\n"; for(int i=1;i<=Yukseklik;i++) { dizi[i,0]=""; dizi[i,Genislik+1]=""; } for(int j=1;j<=Yukseklik;j++) for(int i=1;i<=Genislik;i++) dizi[j,i]=" "; foreach(string i in dizi) Console.Write(i); }

} class AnaProgram { static void Main() { Buton buton1=new Buton(); buton1.Genislik=20; buton1.Yukseklik=13; buton1.Ciz(); } }
Buton snfmz verilen llerde butona benzeyen bir kutu oluturmaktadr. Programdaki Genislik ve Yukseklik zelliklerimiz butona sacak yatayda ve dikeydeki karakter saysn belirtiyor. Tabii ki bu program daha da gelitirebilirsiniz. rnein Buton snfna bir de metin zellii ekleyebilirsiniz ve bu zellik butonun stndeki yazy belirtebilir. Veya verilen llerde bir tablo yapan veya kendisine parametre olarak verilen iki boyutlu bir diziyi ekrana bir tablo gibi izen bir snf tasarlayabilirsiniz. Yani her ey hayal gcnze kalm. NOT: Aslnda bir stringi char trnden bir diziymi gibi dnebiliriz. rnein aadaki ifadeler mmkndr:

string a="deneme"; char b=a[2]; Console.Write(b);


Bu program ekrana n yazar. Ancak stringin herhangi bir karakteri bu yntemle deitirilemez. Bu yntemle string karakterlerine sadece okuma (read-only) amal eriebiliriz. rnein aadaki rnek hataldr:

string a="deneme"; a[2]=''; Console.Write(a);


string trndeki bir sabit ya da deiken dizilerin baz zelliklerini salarken baz zelliklerini salamaz:

Tpk dizilerdeki gibi stringlerde de foreach deyimi kullanlabilir. Dizilerdeki Length zellii stringlerle de kullanlabilir. Bunun dndaki Array snfna ait hibir metot ve zellik stringlerle kullanlamaz.

NOT: Herhangi bir sahte zelliin set veya get bloklarndan yalnzca birini yazarak o zellii salt okunur veya salt yazlr hle getirebiliriz. rnein Array snfnn Length zellii salt okunur bir zelliktir. NOT: C# 2.0'da ya da daha st versiyonlarda bir sahte zelliin set ve get bloklarn ayr ayr private veya public anahtar szckleriyle belirtebiliyoruz. Yani bir zelliin bulunduu snfn dnda salt okunur ya da salt yazlr olmasn salayabiliyoruz. Ancak az nce de syledii m gibi bu zellik C# 1.0 veya C# 1.1 gibi daha nceki versiyonlarda geerli deildir.

NOT: get ve set anahtar szckleriyle eriim belirleyiciler kullanrken uymamz gereken baz zellikler vardr: 1. Daima zellik bildiriminde kullanlan eriim belirleyicisi get veya set satrnda kullanlan eriim belirleyicisinden daha yksek seviyeli olmaldr. rnein zellik bildiriminde kullanlan eriim belirleyici private ise get veya set satrnda kullanlan eriim belirleyici public olamaz. 2. get veya set satrnda kullanlan eriim belirleyici zellik bildiriminde kullanlan eriim belirleyiciyle ayn olmamaldr. (Zaten gereksizdir.) 3. Yani iin z set ve get satrlarndaki eriim belirleyicileri yalnzca, zellii public olarak belirtmi ancak zelliin set veya get bloklarnn herhangi birisini private yapmak istediimizde kullanlabilir. 4. get veya set iin eriim belirleyicisi kullanacaksak sahte zelliin blou iinde hem get hem de set blounun olmas gerekir.

[dzenle]Yapc

metotlar

imdiye kadar bir snfn ye elemanlarn (metotlar ve zellikleri) kullanabilmek iin o snf trnden bir nesne oluturuyorduk ve bu nesne zerinden o snfn ye elemanlarna eriebiliyorduk. Bir snf trnden bir nesne oluturduumuzda -new anahtar szc sayesinde- o snftaki btn zellikler ve metotlar baka bir bellek blmne kopyalanyor ve btn zellikler -snfta bir deer atanmamsa- varsaylan deeri tutuyordu. Peki bir snf trnden bir nesne oluturduumuzda snftaki btn zelliklerin varsaylan deeri tutmas yannda baka eyler de yaplmasn ister miydiniz? te bunun iin yapc metotlar kullanyoruz. Yapc metotlarla ilgili bilmemiz gereken eylerse:

Yapc metotlarn ad snfn adyla ayn olmaldr. Yapc metotlar bir deer tutamaz. Ancak normal metotlardan farkl olarak kullanlmaz. rnek program:

void anahtar szc de

using System; class Deneme { public Deneme() { Console.WriteLine("Deneme snf trnden bir nesne oluturuldu."); } } class AnaProgram { static void Main() { Deneme a=new Deneme(); } }

Bu program ekrana Deneme

snf trnden bir nesne oluturuldu. yazacaktr.

Bunu bu ekilde kullanabilirsiniz. Ancak bunun asl kullanm snftaki zellikleri varsaylan deerden farkl bir deere ekmektir. Yapc metotlarn u ekilde kullanm da mmkndr.

using System; class Deneme { public Deneme(int a,int b,int c) { Console.WriteLine(a+b+c); } } class AnaProgram { static void Main() { Deneme a=new Deneme(2,5,6); } }
Grdnz gibi yapc metot parametre de alabiliyor. Yapc metoda parametreler ise nesne oluturulurken veriliyor. NOT: llaki yapc metodun asl snf dnda bulunmasna gerek yoktur. rnein aadaki gibi bir kullanm da mmkndr:

using System; class Deneme { Deneme() { Console.WriteLine("Bu snf trnden bir nesne oluturuldu."); } static void Main() { Deneme a=new Deneme(); } }
Bu durumda yapc metodu public olarak belirtmeye gerek yok. NOT: Yapc metotlarn eriim belirleyicilerini private yaparak snfn dndan o snf trnden nesne oluturulmasn engellemi oluruz.

[dzenle]Varsaylan

yapc metot

Biz herhangi bir yapc metot oluturmamsak C# otomatik olarak bir yapc metot oluturur. Bu metodun ii botur, yani bir ey yapmaz. Bu metoda varsaylan yapc metot denir. Bu varsaylan yapc metodun ald herhangi bir parametre yoktur. Varsaylan yapc metotla ilgili bilmemiz gerekenler:

Eer bir snfta herhangi bir yapc metot oluturmusak varsaylan yapc metot oluturulmaz. Yapc metotlar da ar yklenebilir. rnein public

Deneme();, public Deneme(int

a);, public Deneme(int a, int b); ve public Deneme(int a,int b,int c); eklinde satr oluturabilir ve nesnenin oluturulma ekline gre bu metotlardan
yalnzca birinin altrlmasn salayabiliriz. rnek:

using System; class Deneme { Deneme() { Console.WriteLine(0); } Deneme(int a) { Console.WriteLine(a); } Deneme(int a,int b) { Console.WriteLine(a+b); } Deneme(int a,int b,int c) { Console.WriteLine(a+b+c); } static void Main() { Deneme a=new Deneme(5,6); } }
Bu rnekte nc metot altrlacaktr. Bu rnei yle deitirebiliriz.

using System; class Deneme { Deneme(int a,int b,int c) { Console.WriteLine(a+b+c); } Deneme():this(0,0,0) { } Deneme(int a):this(a,0,0) { } Deneme(int a,int b):this(a,b,0) {

} static void Main() { Deneme a=new Deneme(5,6); } }


Bu rnekte this anahtar szc sayesinde ikinci, nc ve drdnc yapc metotlar ieriini ayn isimli ve parametre alan metottan alyor. this anahtar szcyle kullanlan ikinci, nc ve drdnc yapc metotlarn yapt tek i, birinci yapc metoda belirli parametreleri gndermek oluyor. NOT: this anahtar szc bu ekilde yalnzca yapc metotlarla kullanlabilir. NOT: Eer bir snfta parametre alan bir veya daha fazla yapc metot varsa ve parametre almayan yapc metot yoksa -bu durumda varsaylan yapc metot oluturulmayaca iin-Sinif

nesne=new

Sinif(); gibi bir satrla parametre vermeden nesne oluturmaya almak hataldr. nk Sinif nesne=new Sinif(); satr Sinif snfnda parametre almayan bir yapc metot arar, bulamaz ve
hata verir. rnek:

class A { public A(int a){} } class B { A a=new A(); }


Bu program derleme zamannda hata verir.

[dzenle]Ykc

metotlar
a=new

Deikenlerdeki faaliyet alan kurallar aynen nesnelerde de geerlidir. Yani Deneme

Deneme(); satryla tanmladmz a nesnesi zerinden Deneme snfnn ye elemanlarna,


yalnzca Deneme

a=new Deneme(); satrnn iinde bulunduu en i bloktan eriilebilir. C++ gibi alt

seviye programlama dillerinde bir nesnenin faaliyet alan bittiinde manuel olarak bunun bilgisayara sylenmesi gerekebiliyordu. Bu syleme ii ise ykc metotlarla oluyordu. Aksi bir durumda bellekten sz konusu nesneler silinmedii iin karklklar kabiliyordu. Halbuki C#'ta bizim byle bir ey yapmamza gerek yok. C# Garbage Collection (p toplama) mekanizmas sayesinde gereksiz nesneleri bellekten siliyor. Ancak bunun illaki nesnenin faaliyet alan sonlanr sonlanmaz yaplaca garantisi yok. rnek bir program:

using System; class Deneme { ~Deneme()

{ Console.WriteLine("Ykc metot imdi altrld."); } static void Main() { { Deneme a=new Deneme(); } Console.WriteLine("Vikikitap"); } }
Grdnz gibi ykc metotlar snf adnn bana ~ iareti getirilerek oluturuluyor. Ykc metotlar herhangi bir deer tutamazlar (void de almazlar) ve herhangi bir parametre almazlar. Bu program a nesnesi bellekten silindii anda yani ykc metot altrld anda ekrana

Ykc metot imdi

altrld. yazacaktr.
[dzenle]Static

ye elemanlar

Bu konuya daha nceden deinmitik. Ancak bu blmde biraz hatrlatma ve biraz da ek bilgi verme gereksinimi gryorum.

Bir nesneye bal olarak almayacak ye elemanlar static olarak belirtiriz. rnein Console snfndaki WriteLine() metodu veya Math snfndaki PI zellii static ye elemanlardr.

Static ye elemanlara nesne oluturarak ulamaya almak hataldr. Static ye elemanlar olutururken static szcnn eriim belirleyici szckle sras nemli deildir. Yani static

public int Topla() veya public static int

Topla() kullanmlarnn ikisi de dorudur. Ancak tabii ki geri dn tipinin ye eleman adnn hemen
ncesinde gelmesi gerekir.

imdiye kadar fark ettiiniz gibi Main metodunu hep static olarak oluturduk. Eer static olarak oluturmasaydk bu metodun alabilmesi iin iinde bulunduu snf trnden bir nesne oluturmamz gerekecekti. Bu durumda da Main metodu ilevi ile eliecekti. nk Main metodu programmzn almaya balad yerdir.

static olarak tanmlanan ye elemanlara ar yapld an bu ye elemanlar iin dinamik olarak bellekte yer ayrlr. Bu sayede static olarak tanmlanan ama deer atanmayan zelliklerin ar yapld an varsaylan deeri tutmas salanr.

Bir snf nesnesi oluturulduunda static ye elemanlar iin bellekte ayr bir yer ayrlmaz. Normal metotlar gibi yapc metotlar da static olabilirler. rnek:

using System; class Deneme { static Deneme() {

Console.WriteLine("Static metot arld."); } Deneme() { Console.WriteLine("Static olmayan metot arld."); } static void Main() { Deneme a=new Deneme(); Deneme b=new Deneme(); } }
Bu program ekrana unlar yazacaktr:

Static metot arld. Static olmayan metot arld. Static olmayan metot arld.
Grdnz gibi bir snf trnden bir nesne oluturuldnda nce static metot sonra (varsa) static olmayan metot altrlyor. Sonraki nesne oluturumlarnda ise static metot altrlmyor. Static yapc metotlar parametre veya eriim belirleyicisi almazlar. imdi biraz kapsaml bir rnek yapalm:

using System; class Oyuncu { static int Toplam; Oyuncu() { Toplam++; Console.WriteLine("Toplam oyuncu: "+Toplam); } static Oyuncu() { Console.WriteLine("Oyun balad"); } ~Oyuncu() { Console.WriteLine("Bir oyuncu ayrld..."); Toplam--; } static void Main() { { Oyuncu ahmet=new Oyuncu(); Oyuncu osman=new Oyuncu(); }

Oyuncu ayse=new Oyuncu(); Oyuncu mehmet=new Oyuncu(); } }


Bu programn ekran kts yle olacaktr.

Oyun balad Toplam oyuncu: 1 Toplam oyuncu: 2 Toplam oyuncu: 3 Toplam oyuncu: 4 Bir oyuncu ayrld... Bir oyuncu ayrld... Bir oyuncu ayrld... Bir oyuncu ayrld...
Daha nce ykc metodun, nesnenin kapsama alan sonlanr sonlanmaz altrlma garantisinin olmadn sylemitim. Bu rnekte ancak program kendini sonlandrrken her bir nesne iin ykc metotlar altrlyor.

[dzenle]Static

snflar

Eer bir snf sadece static elemanlar ieriyorsa o snf static olarak tanmlayabiliriz. Bylelikle derleyici bize o snf trnden bir nesne oluturmamza izin vermeyecektir. Akas pratikte pek bir faydas yoktur. nk static olarak tanmladmz snflarn ye elemanlarn da ayrca static olarak tanmlamak zorundayz. Static snflarn yapc metotlar olmaz. Dolaysyla yapc metot tanmlamaya alrsak derleyici hata verir. Klasik bir static snf bildirimi yle yaplr:

static class SinifAdi { ... }


NOT: Deikenler konusunda grdmz const anahtar szc zelliklerle de kullanlabilir. const olarak tanmlanan zellikler ayn zamanda static'tir. Dolaysyla const zellikleri tekrar static anahtar szcyle belirtmek hataldr. const zellikler static zelliklerin tad tm zellikleri tar. NOT: const anahtar szc yalnzca object dndaki zelliklerle (ve deikenlerle) kullanlabilir. Dizilerle vs. kullanlamaz. const zellikler tanmlanr tanmlanmaz bir ilk deer verilmelidir. UYARI: Bir zellie deer verirken static olmayan bir zellik ya da metot kullanlamaz (nesne oluturulsa bile). UYARI: Bir snfn iinde (bir metodun iinde olmadan) metot ve zellik oluturulmasndan baka bir ey yaplamaz. Yaplacak dier btn eyler bir metot blounun iinde olmaldr.

[dzenle]readonly

anahtar szc

readonly anahtar szc const anahtar szcnn yapt ii object tr, diziler, nesneler vs. iin yapar. Yani bu geleri salt okunur hle getirir. rnek:

using System; class Sinif { readonly int[] a={1,5,8}; readonly object b=5; static void Main() { Sinif n=new Sinif(); Console.WriteLine(n.a[0]); Console.WriteLine(n.b); } }
imdi bir de salt okunur nesne oluturalm:

using System; class Sinif { int a=5; static readonly Sinif nesne=new Sinif(); static void Main() { Console.WriteLine(nesne.a); } }
imdilik nesnelerin salt okunur olmas sama gelebilir. nk salt okunur nesnelerle ulatmz zellikleri deitirebiliriz. Salt okunur yaptmz nesnenin kendisidir. Ancak imdilik buna kafanz takmanza gerek yok. readonly ile ilgili nemli bilgiler:

readonly anahtar szc bir metot blounun iinde kullanlamaz. readonly anahtar szc bir nesne iin kullanlacaksa static szc de kullanlmaldr. readonly ve static szcklerinin sras nemli deildir. readonly bir dizi ya da object tr ayrca static olarak belirtilebilir. readonly anahtar szc constun kullanlabildii int gibi trlerle de kullanlabilir. readonly'nin constun aksine zellikleri staticletirme zellii yoktur. static szc de readonly gibi bir metot iinde kullanlamaz.

NOT: Aslnda int

a; satr int trnden bir nesne bildirimidir ve int a=new int(); satr

mmkndr. Bu durumda a'ya int trnn varsaylan deeri atanr. Bunlarla ilgili daha fazla bilgiyi ileride greceiz.

C Sharp Programlama Dili/Operatr ar ykleme


Vikikitap, zgr ktphane
< C Sharp Programlama Dili

imdiye kadar kendi snflarmz, metotlarmz, zelliklerimizi yazdk. imdi kendi operatrlerimizi yazmaya sra geldi. imdi iinde saat bilgileri olan bir snf tasarlayacaz:

using System; class Zaman { public int Saat; public int Dakika; public int Saniye; public Zaman(int saat, int dakika, int saniye) { Dakika=dakika+saniye/60; Saniye=saniye%60; Saat=saat+Dakika/60; Dakika=Dakika%60; } }
Grdnz gibi Zaman snfnn Saat, Dakika ve Saniye olmak zere zellii var ve bu zellikler nesne yaratlrken girilmek zorunda. Dakika ve saniye 60'tan byk olamayaca iin yapc metotta gerekli dzenlemeler yaplyor. Bu snftan bir nesne yarattmzda sz konusu nesnenin Saat, Dakika ve Saniye olmak zere zellii olacak. Baka bir nesne yarattmzda da ayn ekilde bunun da Saat, Dakik a ve Saniyesi olacak. Peki Zaman trnden iki nesnenin + operatrne sokularak bu iki zaman diliminin toplanmasn ister miydiniz? rnein zaman1 ve zaman2 Zaman trnden iki nesne olsun. zaman1+zaman2 yazdmzda karlkl dakika ve saniyeler toplansn ve saniyeden dakikaya ve dakikadan saate gerekli aktarmlar yaplsn. te imdi bunu yapacaz:

using System; class Zaman { public int Saat; public int Dakika; public int Saniye; public Zaman(int saat, int dakika, int saniye) { Dakika=dakika+saniye/60; Saniye=saniye%60; Saat=saat+Dakika/60; Dakika=Dakika%60; } public static Zaman operator+(Zaman a, Zaman b) { int ToplamSaniye=a.Saniye+b.Saniye;

int ToplamDakika=a.Dakika+b.Dakika; int ToplamSaat=a.Saat+b.Saat; return new Zaman(ToplamSaat,ToplamDakika,ToplamSaniye); } } class AnaProgram { static void Main() { Zaman zaman1=new Zaman(5,59,60); Zaman zaman2=new Zaman(1,0,120); Zaman zaman3=zaman1+zaman2; Console.WriteLine("{0}.{1}.{2}",zaman3.Saat,zaman3.Dakika,zaman3.Saniye ); } }
Bu program ekrana 7.2.0 yazacaktr. Grdnz gibi kendi operatrlerimizi yazmak, daha dorusu + operatrne ar ykleme yapmak ok da zor deil. Operatr metotlarmzn ad operator+ mantnda olmal. rnein sz konusu operatrmz - olsayd operatr metodumuzun ad operator- olacakt. Operatrmzn alaca operandlar bu metoda parametre olarak gnderiyoruz. Operatr metodunun tuttuu deer operatrn operandlaryla birlikte tuttuu deeri ifade eder. return

new

Zaman(ToplamSaat,ToplamDakika,ToplamSaniye); satryla metodun, dolaysyla da


operatrn verilen parametreler lsnde Zaman trnden bir nesne tutmasn saladk. Ancak imdi Zaman trnden bir nesneyle int trnden bir nesneyi toplamamz mmkn deildir. Eer Zaman trnden bir nesneyle int trnden bir nesne toplanmak istenirse int trnden nesneyi saniye olarak hesaba katabiliriz. Bunun iinse Zaman snfna u operatr metodunu ekleyebiliriz:

public static Zaman operator+(Zaman a, int b) { int ToplamSaniye=a.Saniye+b; return new Zaman(a.Saat,a.Dakika,ToplamSaniye); }
Grdnz gibi bu kadar basit. Ayrca unu hatrlatmak isterim: return

new

Zaman(a.Saat,a.Dakika,ToplamSaniye) satryla metodun Zaman trnden verilen


parametrelere gre yeni bir nesne oluturulup bu nesneyi tutmasn saladk. Dolaysyla Zaman snfnn yapc metodu altrld. Dolaysyla da bizim tekrar Saniye, Dakika ve Saat arasnda aktarm yapmamza gerek kalmad. Operatr metotlaryla ilgili bilmeniz gerekenler:

Operatr metotlarnn geri dn tipinin illaki sz konusu snf tipinden olmasna gerek yoktur. rnein Zaman snfndaki ilk toplama operatr metodunu yle deitirebiliriz.

public static string operator+(Zaman a, Zaman b) {

int ToplamSaniye=a.Saniye+b.Saniye; int ToplamDakika=a.Dakika+b.Dakika; int ToplamSaat=a.Saat+b.Saat; Zaman nesne=new Zaman(ToplamSaat,ToplamDakika,ToplamSaniye); return nesne.Saat+"."+nesne.Dakika+"."+nesne.Saniye; }
Burada Zaman

nesne=new

Zaman(ToplamSaat,ToplamDakika,ToplamSaniye); satrn ekleyerek Saat, Dakika,


Saniye aktarmlarnn yaplmasn saladk. Bu metoda gre Zaman tipinden a ve b nesneleriyle yaplan a+b ifadesinin sonucu string tipinde olur.

Operatr metotlar static ve public olmaldr. Drt ilem operatrleri (+, -, *, /) herhangi bir koul olmakszn ar yklenebilirler.
Konu balklar
[gizle]

1 likisel operatrlerin ar yklenmesi 2 true ve false operatrlerinin ar yklenmesi 3 Mantksal operatrlerin ar yklenmesi 4 Tr dnm operatrnn ar yklenmesi 5 Operatr ar yklemeyle ilgili son notlar

[dzenle]likisel

operatrlerin ar yklenmesi

imdi Zaman snfna aadaki operatr metotlarn ekleyelim.

public static bool operator==(Zaman a, Zaman b) { if(a.Saniye==b.Saniye&&a.Dakika==b.Dakika&&a.Saat==b.Saat) return true; else return false; } public static bool operator!=(Zaman a, Zaman b) { return !(a==b); }
likisel operatrlerdeki ana kural ilikisel operatrlerin birbirlerinin ztlarnn snf iinde ve ayn trde olmasnn zorunlu olmasdr. Yani biz burada yukardaki metotlarn yalnzca bir tanesini yazp brakamazdk ya da birininin geri dn tipini bool, birinin int yapamazdk. Ayrca

return !(a==b); satr son

derece mmkndr. Burada daha nce yazlm bir metodu kullandk. Her iki metot da static olduu iin herhangi bir nesne tanmlamaya gerek yoktur. likisel operatrlerin geri dn tipi btn trlerde

olabilmesine ramen bool olmas tavsiye edilir. Dier ilikisel operatrler olan <, >, <= ve >= operatrlerini de ift hlinde olmak artyla tpk rneimizdeki gibi ar ykleyebiliriz.

[dzenle]true

ve false operatrlerinin ar yklenmesi

imdiye kadar true ve falseu bool trnden sabitler olarak grdk. Ancak imdi bu true ve falseu operatrm gibi ar ykleyebileceiz. imdi u metotlar Zaman snfna ekleyin:

public static bool operator true(Zaman a) { if(a.Saat>12) return true; else return false; } public static bool operator false(Zaman a) { if(a.Saat<=12) return true; else return false; }
Bu metotlar asl programmz iinde yle kullanabiliriz:

Zaman zaman1=new Zaman(5,59,60); Zaman zaman2=new Zaman(2,35,40); if(zaman1) Console.WriteLine("leden sonra"); else Console.WriteLine("leden nce"); (zaman2) if Console.WriteLine("leden sonra"); else Console.WriteLine("leden nce");
Grdnz gibi derleyici normalde true ya da false olmas gereken bir yerde Zaman trnden bir nesne grd zaman Zaman snfndaki true ve false metotlarn altryor ve sz konusu Zaman nesnenisinin true ya da false deerlerden birisini tutmasn salyor. Eer byle bir yap oluturmak istiyorsak hem true hem de false metotlarnn snfmz iinde bulunmas gerekir. Ayrca true ve false operatr metotlarnn geri dn tipi mutlaka bool trnden olmaldr.

[dzenle]Mantksal

operatrlerin ar yklenmesi

rnek (snfmza eklenecek):

public static bool operator|(Zaman a,Zaman b) { if(a.Saat>12||b.Saat>12)

return true; else return false; }


& ve |, ! operatrlerinin ar yklenebilmesi iin herhangi bir art yoktur. (! operatrnn tek operand aldn unutmayn.) Ancak && ve || operatrlerinin ar yklenebilmesi iin sz konusu snf iin u artlarn salanmas gerekir:

& ve | operatrleri ar yklenmi olmaldr. true ve false operatrleri ar yklenmi olmaldr. operator& ve operator| operatrlerinin parametreleri ilgili snf trnden olmaldr. operator& ve operator| operatrlerinin geri dn tipi ilgili snf trnden olmaldr. Yukardaki artlar saland takdirde bizim ayrca && ve || operatrlerini ar yklememize gerek kalmaz. Yukardaki artlar saland takdirde sanki && ve || operatrleri ar yklenmi gibi kodumuzu yazabiliriz. rnek:

using System; class Sinif { public int Sayi; public Sinif(int sayi) { Sayi=sayi; } public static bool operator true(Sinif a) { return true; } public static bool operator false(Sinif a) { return false; } public static Sinif operator&(Sinif a,Sinif b) { return new Sinif(20); } public static Sinif operator|(Sinif a,Sinif b) { return new Sinif(30); } } class AnaProgram { static void Main() { Sinif a=new Sinif(50);

Sinif b=new Sinif(10); Console.WriteLine((a||b).Sayi); Console.WriteLine((a&&b).Sayi); } }


Yukardaki programda ekrana alt alta 50 ve 20 yazar. Peki neden 50 ve 20 yazd? te mant:

true operatr false operatr true false false true true true false false

a||b ilk operand | operatr metodu ilk operand | operatr metodu

a&&b & operatr metodu ilk operand ilk operand & operatr metodu

Tablodan da grebileceiniz gibi rneimizde true operatr true, false operatr false deer rettii iin a||b ifadesi ilk operand olan a'y, a&&b ifadesi ise & operatr metodunun geri dn deerini tutar.

[dzenle]Tr

dnm operatrnn ar yklenmesi

Hatrlarsanz C#'ta iki tane tr dnm mekanizmas vard. Bunlardan birincisi bilinli, tekisi de bilinsiz tr dnmyd. imdi bu iki olayn kendi snflarmz trnden nesneler iin de gereklemesini salayacaz. Bu iki olayn tasla u ekildedir:

public static implicit operator HedefTur(KaynakTurdekiNesne) { return HedefTurdenVeri; }


Bu bilinsiz tr dnm iindi. imdi de bilinli tr dnm metodunun tasla:

public static explicit operator HedefTur(KaynakTurdekiNesne) { return HedefTurdenVeri; }


imdi bu taslaklar rneklendirelim:

using System; class Sinif { public int Sayi; public Sinif(int sayi) { Sayi=sayi; } public static implicit operator int(Sinif a) { return a.Sayi; } } class AnaProgram

{ static void Main() { Sinif a=new Sinif(50); int b=a; Console.WriteLine(b); } }


imdi de bilinli tr dnmn rneklendirelim:

using System; class Sinif { public int Sayi; public Sinif(int sayi) { Sayi=sayi; } public static explicit operator int(Sinif a) { return a.Sayi; } } class AnaProgram { static void Main() { Sinif a=new Sinif(50); int b=(int)a; Console.WriteLine(b); } }
Grdnz gibi bilinli ve bilinsiz tr dnm operatr metotlarn yazarken tek deien implicit ve explicit anahtar szckleri. Bir snf iinde parametre ve geri dn tipi ayn olan explicit ve implicit metotlar ayn anda bildirilemez. Eer implicit metodu bildirmisek explicit (bilinli) tr dnmne de izin vermi oluruz. lk rneimizde (implicit) a nesnesini int trnden deikenlerin kullanlabildii her yerde kullanabiliriz. kinci rneimizde ise ayn eyi tr dntrme operatrn kullanarak yapabiliriz. implicit ve explicit metotlarla yalnzca Sinif trnden baka trlere ya da baka trlerden Sinif trne dnm yapabiliriz. Yani rnein byte ile int arasndaki dnm mekanizmasna mdahale edemeyiz. BLGLENDRME: imdi konunun banda grdmz Zaman snfn dnn. Artk implicit metot sayesinde Zaman trnden bir nesneye a="12.45.34"; eklinde deer atayabilirsiniz. Bunun iin Zaman snfnn implicit metodu iinde gerekli paralamalar yapar ve sonucu bir Zaman nesnesinde

tutarsnz. Grdnz gibi adeta kendi sabitlerimizi yazabiliyoruz. Bunun gibi daha birok ey hayal gcnze kalm. NOT: Artk bu rendiimiz implicit metot sayesinde Sinif trnden bir nesneyi kullanmadan direkt Sinif

new anahtar szcn

a=23; gibi bir ey yazarak oluturabiliriz. Ancak bunun iin tabii ki snfmz

iinde int trnden Sinif trne implicit dnm metodunu oluturmamz gerekir. NOT: Bildiiniz gibi C#'ta baz trler arasnda bilinsiz tr dnm olur. rnein C#'ta byte trnden inte bilinsiz tr dnm mmkndr. Ancak biz programmz yazarken bunlar kafamza takmamza gerek yok. Yani Sinif trnden int'e dnm yapan metot oluturmusak Sinif trnden byte'a dnm yapan metot oluturamayz diye bir kural yoktur. stediimiz gibi tr dnm metotlarn yazabiliriz. Yeter ki bir trden bir tre dnm yapan birden fazla metot oluturmayalm ve dnmn taraflarndan bir tanesi Sinif trnden olsun.

[dzenle]Operatr

ar yklemeyle ilgili son notlar

Atama operatrn (=) ar ykleyemeyiz. nk zaten gerek yoktur. Biz atama operatrn ar ykleyelim veya yklemeyelim zaten kullanabiliriz. lemli atama operatrlerinde ise yle bir kural vardr: rnein + operatrn ar yklemisek += operatrn de kullanabiliriz. Bu durum btn ilemli atama operatrlerinde geerlidir. Hibir operatrn ncelik srasn deitiremeyeceimiz gibi temel veri trleri (string, int, vb.) arasndaki operatrlere de mdahale edemeyiz. Bu konuda ilenenler dnda hibir operatr ar ykleyemeyiz. rnein dizilerin elemanlarna erimek iin kullanlan

[] operatrn, yeni

bir nesneye bellekte yer amak iin kullanlan new operatrn, ?: operatrn, vb. ar ykleyemeyiz.

C Sharp Programlama Dili/ndeksleyiciler


Vikikitap, zgr ktphane
< C Sharp Programlama Dili

Daha nceden de bildiiniz gibi tanmladmz diziler System.Array snf trnden bir nesnedir. Bu sayede tanmladmz diziler zerinden System.Array snfnn ye elemanlarna eriebiliriz. rnein System.Array snfna ait olan Length zellii dizimizin ka elemandan olutuunu tutar. Sort() metodu ise dizimizin elemanlarn sralar. Hatrlarsanz dizilerin elemanlarna [] operatryle eriiyorduk. Yani Array snf trnden bir nesnenin sonuna [] koyuyorduk ve bunun belirli bir anlam vard. Bunu salayan System.Array snfndaki bir indeksleyeciden baka bir ey deildir. Artk biz de Sinif trnden yarattmz a nesnesini a[5] eklinde yazabileceiz ve bunun belirli bir anlam olacak. ndeksleyiciler tpk diziler gibi tek boyutlu indeksleyiciler ve o k boyutlu indeksleyiciler olmak zere ikiye ayrlr. [dzenle]Tek rnek:

boyutlu indeksleyiciler

using System; class Sinif {

public int Sayi; public int this[int indeks] { get { return Sayi; } set { Sayi=value; } } } class AnaProgram { static void Main() { Sinif a=new Sinif(); a[5]=30; Console.WriteLine(a[5]); } }
Grdnz gibi indeksleyiciler sahte zelliklere olduka benziyor. Ancak ciddi farklar da var. ndeksleyici tanmlarken parametre normal parantez yerine keli parantezler arasna yazlyor. Esas programda [ ve ] arasna girilen veri indeksleyiciye parametre olarak gnderiliyor. ndeksleyicilere zel bir ad verilmiyor, bunun yerine this anahtar szc kullanlyor. Ayrca unu hatrlatmak isterim: a[5]=30; satryla a[5]'in deil a'nn Sayi zellii deitiriliyor. Yani esas program yle deitirsek:

class AnaProgram { static void Main() { Sinif a=new Sinif(); a[5]=30; a[1]=2; Console.WriteLine(a[5]); Console.WriteLine(a[1]); } }
Bu programda ekrana alta alta iki kez 2 yazar. nk hem a[5]=30; hem de a[1]=2; satrlar a nesnesinin Sayi zelliini deitirir. imdi programmz yle deitirelim:

using System; class Sinif { public int Sayi; public int this[int indeks]

{ get { return Sayi; } set { if(indeks>0) Sayi+=value; else if(indeks<0) Sayi-=value; else Sayi=Sayi; } } } class AnaProgram { static void Main() { Sinif a=new Sinif(); a[5]=45; a[-10]=23; a[100]=87; a[-80]=100; Console.WriteLine(a[0]); } }
Bu program ekrana 9 yazar. ndeksleyicinin set blounda indeksleyiciye hangi indeksle ulald kontrol ediliyor. Eer indeksleyici 0'dan bykse esas programda o indeksleyiciye atanan deer a nesnesinin Sayi zelliine ekleniyor. Eer indeksleyici 0'dan kkse esas programda o in deksleyiciye atanan deer a nesnesinin Sayi zelliinden karlyor. Eer indeksleyici 0'sa Sayi'nin deeri deitirilmiyor. NOT: ndeksleyiciler de ar yklenebilir. Bunu ise parametre trn farkl yaparak salarz. NOT: ndeksleyicilerin parametre ve geri dn tipi herhangi bir tip olabilir. int olmas art deildir. [dzenle]ok

boyutlu indeksleyiciler

ok boyutlu indeksleyicilerin tek boyutlu indeksleyicilerden tek fark indeksleyicinin ald parametre saysdr. rnek:

using System; class Sinif { private int Sayi; public int this[int indeks1,int indeks2] { get

{ return indeks1+indeks2+Sayi; } set { Sayi=indeks1*indeks2+value; } } } class AnaProgram { static void Main() { Sinif a=new Sinif(); a[5,4]=45; Console.WriteLine(a[-6,12]); } }
Bu programda a[5,4]=45; satrnda 5*4+45 ilemi yaplr ve sonu Sayi zelliine atanr. Console.WriteLine(a[-6,12]); satrnda ise -6+12+65 ilemi yaplr ve sonu ekrana yazlr. (sonu: 71) NOT: Aslnda indeksleyicilerin en yaygn kullanm snfmz iindeki bir dizinin elemanlarna direkt nesne ve [] operatrn kullanarak erimektir. Bunu mantnz kullanarak yapabilirsiniz. Anlatma gereksinimi grmyorum. NOT: ndeksleyicilerin set ve get bloklar sahte zelliklerdeki set ve get bloklarnn tm zelliklerini tarlar. rnein set blounu koymayarak nesnenin indekslerine deer atanmasn engelleyebiliriz.

C Sharp Programlama Dili/Yaplar


Vikikitap, zgr ktphane
< C Sharp Programlama Dili

Sizce int, double, byte birer nedir? "Snftr!" dediinizi duyar gibiyim. Yaklatnz ancak tam olarak snf deil. Temel veri trleri (int, double, vb.) birer yapdr. int trnden tanmladmz bir a deikeni/zellii de bir yap nesnesidir. Peki snf ile yap arasnda ne fark var? Aadaki kodu inceleyiniz.

int a=5; Sinif b=23;


Buraya kadar ikisi de birbirinin ayns gibi. Bu koddan Sinif snfnn iinde bir implicit metot olduunu ve atanan deerin snf iindeki int trnden bir zellie atandn karabiliriz. imdi bu kodu yle gelitirelim:

int a=5; Sinif b=23; int c=a; Sinif d=b;

a=10; b=100; Console.WriteLine("{0}-{1}-{2}-{3}",a,b.Sayi,c,d.Sayi);


Bu kodda int c=a; satrnda a'nn tuttuu deer c'ye atanr. Sinif d=b; satrnda ise d nesnesi b nesnesinin bellekteki adresini bulur ve o adresteki deeri tutar. Grdnz gibi snf nesneleri birbirine adres gsterme yoluyla atanrken yap nesneleri birbirine deer kopyalama yoluyla atanr. Bu kodda b nesnesinde yaplan bir deiiklik d nesnesini, d nesnesinde yaplan bir deiiklik de b nesnesini etkileyecektir. Ancak c nesnesinde yaplan bir deiiklik a nesnesini, a nesnesinde yaplan bir deiiklik de c nesnesini etkilemeyecektir. Ancak tabii ki snf nesnelerinin ikisini de baka bir deer atayarak ya da new anahtar szc ile oluturmu, sonra atama ilemini yapmsak bu sefer deer kopyalama yoluyla birbirlerine atanrlar. Kendimiz de int, float gibi yaplar oluturabiliriz. Yap yaratmak snf yaratmaya olduka benzer, yalnzca class anahtar szc yerine struct anahtar szc kullanlr. rnek:

struct YapiAdi { public int Ozellik1; public string Ozellik2; }


Yaplarla ilgili bilmeniz gerekenler: Tpk snflar gibi yaplarda da new operatryle nesne yaratlabilir. new anahtar szcn kullandmzda yapnn varsaylan yapc metodu veya varsa kendi tanmladmz yapc metot altrlr. Tpk snflardaki gibi YapiAdi nesne; yazarak bir yap nesnesini kullanlabilir hle getiremeyiz. Ya deer atamamz ya da new anahtar szcn kullanmamz gerekir. Bir yap trndeki nesne bir metoda parametre olarak gnderildiinde metodun iinde nesnenin deitirilmesi esas nesneyi deitirmez. Ancak snf nesnelerinde deitirir. Tpk snflardaki gibi yaplarda da birden fazla yapc metot yaratabiliriz. Ancak yaplarda parametre almayan bir yapc metot bildiremeyiz. Hatrlarsanz snflarda bildirebiliyorduk. Bir yapnn yapc metodu bildirildiinde yapc metodun iinde yapnn btn zelliklerine ilk deer verilmesi gerekir. Yap nesnelerinin faaliyet alan sonlandnda otomatik olarak bellekten silinirler. Hatrlarsanz snf nesnelerinin faaliyet alan sonlandnda garbage collection (p toplama) mekanizmas devreye giriyordu. Ancak garbage collection mekanizmasnn nesnenin faaliyet alan sonlanr sonlanmaz devreye girme garantisi yoktu. zetle snf nesnelerinin aksine yap ne snelerinin tam olarak ne zaman bellekten silindiini anlayabiliriz. Yaplarda ykc metot yaratlmas yasaklanmtr. Snflarda olduu gibi yaplarda da sahte zellik (get ve set bloklu zellik) ve indeksleyici kullanabiliriz. Yap nesneleriyle ilgili ilemler, snf nesneleriyle ilgili ilemlerden daha hzl gerekleir. Tpk snflardaki gibi normal metotlar da bir yap ierisinde bildirilebilir. Ayrca ye elemanlar static olabilir. Tpk snflardaki gibi bir yap ierisindeki zellikler const ya da readonly olabilir. Yaplardaki zelliklere ilk deer verilemez.

C Sharp Programlama Dili/Enum sabitleri


Vikikitap, zgr ktphane
< C Sharp Programlama Dili

Enum sabitleri sayesinde baz zel szcklerin baz tam saylar temsil etmesini salayabiliriz. En genel enum bildirimi u ekilde yaplr:

enum AD : tur{SOZCUK1,SOZCUK2}
Bu bildirimde enum sabitinin ad ADdr. tur ise szcklerin hangi trden sabitleri temsil edeceini belirtir. Parantez iindeki szckler ise herhangi bir sabiti temsil etmesini istediimiz szcklerdir. Parantez iine en fazla trn kapasitesi kadar szck girilebilir. rnein tur yerine byte yazmsak en fazla 255 tane szck girebiliriz.

enum AD{SOZCUK1,SOZCUK2}
Burada bir tr belirtmediimiz iin otomatik olarak tr int olur. Enum sabitlerinin trn byte, sbyte, short, ushort, int, uint, long ve ulong trlerinden biri yapabiliriz. imdi enum sabitleriyle ilgili bir rnek yapalm. rneimizde bir metot kendisine ilk parametre olarak gnderilen dizinin elemanlarn ekrana yazsn. Metodun ikinci parametresinde de dizinin elemanlarnn ekrana nasl yazlaca ayarlansn. Eer ikinci parametre YANINA olarak girilirse dizinin elemanlar ekrana yan yana yazlsn. Eer ikinci parametre ALTINA olarak girilirse dizinin elemanlar ekrana alt alta yazlsn:

using System; enum BICIM : byte{YANINA,ALTINA} class Program { static void DiziYaz(Array dizi,BICIM b) { if(b==BICIM.YANINA) { foreach(object o in dizi) Console.Write(o.ToString()+" "); Console.WriteLine(); } else foreach(object o in dizi) Console.WriteLine(o); } static void Main() { int[] a=new int[10]; DiziYaz(a,BICIM.YANINA); DiziYaz(a,BICIM.ALTINA); } }

imdi baka bir rnek:

using System; enum not:byte{basarisiz,gecmez,gecer,orta,iyi,pekiyi} class Program { static void Main() { Console.Write("Ltfen notunuzu giriniz: "); not a=(not)Convert.ToByte(Console.ReadLine()); Console.WriteLine(a); } }
Bu program ekrana kullanc 0 girerse basarisiz, 1 girerse gecmez, 2 girerse gecer, 3 girerse orta, 4 girerse iyi ve 5 girerse pekiyi yazmaktadr. Eer kullanc 5'ten byk bir say girerse sayy yazacaktr. Enum szcklerinin verilen tre gre temsil ettikleri bir tam say vardr. Biz enum sabitini tanmlarken herhangi bir ek dzenleme yapmadmz iin ilk szck 0' temsil eder. Dier szckler de birer artarak kendi saylarn temsil eder. Yani aadaki tablo sz konusudur:

Szck basarisiz gecmez gecer orta iyi pekiyi

Temsil ettii say 0 1 2 3 4 5

Ayrca grdnz gibi programmzda byte trn not trne (enum sabitine) bilinli olarak dntrdk. Bilinsiz olarak dntremezdik. Ayrca direkt olarak stringten nota dnm yapamazdk. Yalnzca enum snf ile string ve object dndaki temel veri trleri arasnda dnm yapabiliriz. imdi baka b ir program:

using System; enum not:byte{basarisiz,basarili} class Program { static void Main() { not a=not.basarili; if(a==(not)1) Console.Write("Baarlsnz"); else Console.Write("Baarszsnz"); } }
Burada da int tr not trne bilinli olarak dntrld. Baka bir rnek:

using System;

enum not:byte{basarisiz,basarili} class Program { static void Main() { Console.Write(not.basarisiz); } }


Bu programda ekrana basarisiz yazlr. Yani enum szckleri direkt kullanlmak istendiinde yalnzca szck kullanlyor. Baka bir rnek:

using System; enum not:byte{basarisiz,basarili} class Program { static void Main() { not a=not.basarisiz; byte b=(byte)a; Console.Write(b); } }
Burada da not tr byte'a bilinli olarak dntrld.

[dzenle]Enum

sra numaralarn deitirme

enum not:byte{basarisiz,basarili} satrnda szckler 0'dan balayarak birer birer


artarak bir tam sayy temsil eder. Ancak hangi szcn hangi tam sayy temsil ettiini kendimiz belirtebiliriz. rnekler:

enum not:byte{basarisiz=6,basarili=10}
Bu rnekte basarisiz 6'y, basarili 10'u temsil eder. Bir tam say birden fazla szce verilebilir.

enum not:byte{basarisiz=6,basarili}
Bu rnekte basarisiz 6'y, basarili 7'yi temsil eder.

enum not:byte{basarisiz,gecmez=5,gecer,orta,iyi=2,pekiyi}
Bu rnekte ise u temsiller sz konusudur:

Szck basarisiz gecmez gecer orta iyi pekiyi

Temsil ettii say 0 5 6 7 2 3

enum not:byte{basarisiz=-21,basarili}
Bu rnekte basarisiz -21'i basarili -20'yi temsil eder.

[dzenle]System.Enum

snf

System.Enum snf enum sabitleriyle kullanlabilecek eitli ye elemanlara sahiptir. Burada yalnzca GetNames() metodu tantlacaktr. GetNames() metodu bir enum sabitinin tm szcklerini string trndeki bir dizi olarak tutar. rnek:

using System; enum Gunler:byte { PAZARTESI, SALI, CARSAMBA, PERSEMBE, CUMA, CUMARTESI, PAZAR } class Sinif { static void Main() { string[] a=Gunler.GetNames(typeof(Gunler)); Console.WriteLine(a[0]); //veya Console.WriteLine(Gunler.GetNames(typeof(Gunler))[3]); } }
Bu rnek ekrana alt alta PAZARTESI ve PERSEMBE yazar. NOT: Enum sabitine isim verirken ve enum szcklerini yazarken deiken adlandrma kurallarnn tamamna uymalyz.

C Sharp Programlama Dili/sim alanlar


Vikikitap, zgr ktphane
< C Sharp Programlama Dili

sim alanlar en temel anlamyla snflar organize etmeye (gruplandrmaya) yarayan bir yapdr.
Konu balklar
[gizle]

1 .Net Framework ktphanesindeki hazr isim alanlarna erime 2 Kendi isim alanmz yaratma 3 using ile takma isim (alias) verme 4 ie gemi isim alanlar 5 Haric takma isimler

o o

5.1 :: operatr 5.2 global haric takma ismi

[dzenle].Net Framework ktphanesindeki hazr isim alanlarna erime


Bildiiniz zere imdiye kadar .Net Framework ktphanesindeki hazr isim alanlarna erimek iin using anahtar szcn kullandk. Bu anahtar szckle ilgili bilmeniz gereken baz ufak detaylar:

using anahtar szcyle bir isim alann varsaylan isim alanmz hline getiririz. Yani o isim
alanndaki snflara, yaplara, vb. direkt eriebiliriz. Eer using anahtar szcn kullanmam olsaydk sz konusu snf ya da yapy kullanmadan nce sz konusu snfn ya da yapnn bal olduu isim alann da . operatryle eklemek zorunda kalacaktk. rnein programmzn banda using anahtar szc ile System isim alann belirtmezsek bu isim alanna bal olan Console snfnn iindeki WriteLinemetodunu System.Console.WriteLine() olarak kullanmak zorunda kalacaktk.

.Net Framework ktphanesinin en tepesinde System isim alan ve bunun altnda eitli grevler iin zellemi farkl isim alanlar bulunur. rnein System.Data isim alannda veri taban ilemleri iin zellemi eitli snflara ulaabiliriz. Bu isim alannn altnda yine eitli isim alanlar da vardr.

using anahtar szcyle bir isim alanna eriim hakk elde etmemiz onun altndaki veya stndeki
isim alanlarna da eriim hakk elde ettiimiz anlamna gelmez. Her bir isim alann ayr ayr bildirmeliyiz.

Temel veri trleri (int, double, vs.) aslnda .Net Framework ktphanesindeki birer yapdan baka bir ey deildir. Bu yaplar System isim alannn altnda bulunur. Tr dnmkonusunda "deiken trlerinin CTS karlklar" ad altnda bu yaplar tablolamtk. Yani aslnda int trnden bir deiken tanmlarken System.Int32 yapsndan bir nesne tanmlam oluyoruz. Ancak

int a=34; gibi bir

komutla bir deiken tanmlarken using anahtar szcyle System isim alann eklememize gerek yoktur. nk C# otomatik olarak temel veri trlerini bizim eriimimize ak tutar. Yani biz using anahtar szcyle System isim alanna eriim hakk elde etmemi olsak bile bu isim alanna bal olan Int32 yapsn kullanabiliriz. Bu durum yalnzca temel veri trlerinde geerlidir. Aadaki program inceleyiniz:

class Sinif { static void Main()

{ int a=5; //geerli tanmlama Int32 a=5; //geersiz tanmlama } }


Grdnz gibi C# ikisinde de ayn yapy (System.Int32) kullanmamza ramen ikincisine izin vermedi. Programn bana using

System; satrn ekleseydik ikincisine de izin verecekti. Yani C#, deikenleri

C#'a zg ekilde oluturmusak System isim alann eklememiz zorunlu deildir. Yaplarn gerek hlleriyle deiken oluturmak ise System isim alannn eklenmesini gerektirir.

ou zaman programmza using anahtar szcyle birden fazla isim alan eklememiz gerekir. Bu gibi durumlarda her bir isim alann using anahtar szcyle ayr ayr belirtmeliyiz. Virgl ile ortak bildirim yapamayz.

[dzenle]Kendi isim alanmz yaratma


Fark ettiyseniz u ana kadar yazdmz snflar, yaplar vs. herhangi bir isim alanna yazmadk. Bu gibi durumlarda C# sz konusu snf ya da yaplar varsaylan isim alanmzda sayar. Yani biz bir isim alan oluturmamsak bile C# hayal bir isim alan oluturur ve bize bu isim alanna direkt eriim hakk verir. Ancak istersek trlerimizi bir isim alan iine koyabiliriz. rnek bir isim alan bildirimi

namespace IsimAlani { ... }


Bir isim alannn iinde yalnzca snflar, temsilciler, enum sabitleri, arayzler ve yaplar direkt olarak bulunabilir. Bundan sonra tm bunlara ksaca "tr" diyeceim. Temsilciler ve arayzleri ileride greceiz. rnek bir program:

using System; namespace BirinciIsimAlani { class Deneme { } } class AnaSinif { static void Main() { BirinciIsimAlani.Deneme d=new BirinciIsimAlani.Deneme(); } }
Grdnz gibi bulunduumuz isim alanndan farkl bir isim alanndaki trle ilgili ilemleri ilgili isim alann da belirterek yapyoruz.

sim alanlar dier bloklarda olduu gibi bloun kapanmasyla sonlanmaz. Eer farkl dosyalardaki farkl trleri ayn isim alanna koyarsak bunlar ayn isim alannda saylr. rneinDeneme1.cs dosyas yle olsun:

using System; namespace Deneme { class Sinif1 { public Sinif1() { Console.WriteLine("Sinif1 trnden nesne yaratld."); } } }

Deneme2.cs dosyas yle olsun:


using System; namespace Deneme { class Sinif2 { public Sinif2() { Console.WriteLine("Sinif2 trnden nesne yaratld."); } } }
Ve son olarak Deneme3.cs dosyamz yle olsun:

using System; class Sinif3 { static void Main() { Console.WriteLine("Buras ana program"); Deneme.Sinif1 a=new Deneme.Sinif1(); Deneme.Sinif2 b=new Deneme.Sinif2(); } }
imdi bu cs dosyasn ayn klasre koyalm. DOS'un

cd komutuyla o klasre geelim ve csc

Deneme1.cs Deneme2.cs Deneme3.cs komutunu verelim. Bu komutla C# derleyicisinin bu


dosyay tek dosya gibi dnmesini saladk. Bunu snflar iin de yapabiliriz. rnein bir ans oyunu programnn kullanc arayzyle ilgili ye elemanlarn bulunduu snf ayr bir dosyaya, arka planla ilgili ye elemanlarn bulunduu snf baka bir dosyaya ve son olarak iinde Main metodunun olduu ve temel komutlar ieren son ye elemanlarn bulunduu snf da baka bir dosyaya koyarak komut isteminde ayn

yntemi kullanarak derleyebiliriz. Bu tr bir yntem programmzn karmakln azaltacaktr. Yine bu tr bir yntemde yalnzca bir tane Main metodu olmaldr. Programmz, Main metodunun iinde bulunduu dosya adnda oluacaktr. Yukardaki programa tekrar dnersek, program ekrana unlar yazar:

Buras ana program. Sinif1 trnden nesne yaratld. Sinif2 trnden nesne yaratld.
C# bu tr bir durumda Sinif1 ve Sinif2 snflarn ayn isim alannda sayar. imdi baka bir rnek yapalm:

using System; using Deneme; namespace Deneme { class Sinif1 { public Sinif1() { Console.WriteLine("Sinif1 trnden nesne yaratld."); } } } class Sinif2 { static void Main() { Sinif1 a=new Sinif1(); } }
Grdnz gibi programmzn banda using

Deneme; satrn da kullandmz iin artk bu isim

alanndaki trlerle ilgili ilemleri direkt yapabiliyoruz. using deyimleri programmzda hibir ey yapmadan nce yazlmaldr. Yani programlarmzn daima ilk komutlar using deyimleri olmaldr. Ayn using deyiminin birden fazla kez yazlmas durumunda program hata vermez, ancak gereksizdir. rnein aadaki program hata vermez.

using System; using System; class Sinif { static void Main() { Console.WriteLine("Deneme"); } }

using anahtar szcnn bir baka kullanm da istediimiz bir bloun sonunda
nesnelerin Dispose() metodunu armaktr. rnek:

using System; class Deneme:IDisposable //Arayzleri ileride greceiz, o yzden bu ksma kafa yormanza gerek yok. { public void Dispose() { Console.WriteLine("Dispose() metodu arld."); } } class AnaSinif { static void Main() { Deneme d=new Deneme(); using(d) { Console.WriteLine("using blou"); }//d.Dispose() metodu burada arlr. Console.WriteLine("using blou d"); } }
Bu program ekrana srayla unlar yazar.

using blou Dispose() metodu arld. using blou d


Grdnz gibi using blounun hemen sonunda Dispose() metodu arld. using blounu aadaki ekilde de yazabilirdik:

using(Deneme d1=new Deneme(), d2=new Deneme()) { Console.WriteLine("using blou"); }//d1.Dispose() ve d2.Dispose() metodu burada arlr.
Bu rnekte d1 ve d2 nesneleri iin ayr ayr Dispose() metodu arlacaktr. Bu using blounu aadaki rnekteki gibi yazamazdk:

using(Deneme d1=new Deneme,Deneme d2=new Deneme()) { Console.WriteLine("using blou"); }


Yani nesneler ayn trden olmaldr ve ortak tanmlama yaplmaldr.

[dzenle]using ile takma isim (alias) verme


Diyelim ki iki tane isim alannda ayn adl trler var ve biz bu isim alanlarn using anahtar szc ile eklemiiz. Tahmin edersiniz ki bu durumda bu trlerden biriyle ilem yapmak istediimizde hata oluur. nk derleyici hangi isim alanndaki tr kullanmak istediimizi bilemez. te bu gibi durumlarda takma isim (alias) kullanlr. rnek:

using System; using IsimAlani1; using IsimAlani2; //Eer aadaki iki satr yazmasaydk programmz hata verirdi. using Sinif1=IsimAlani1.Sinif; using Sinif2=IsimAlani2.Sinif; //Bu iki satrla derleyicinin IsimAlani1.Sinif snfn Sinif1, IsimAlani2.Sinif snfn Sinif2 olarak tanmasn saladk. namespace IsimAlani1 { class Sinif { public Sinif() { Console.WriteLine("Buras IsimAlani1"); } } } namespace IsimAlani2 { class Sinif { public Sinif() { Console.WriteLine("Buras IsimAlani2"); } } } class AnaSinif { static void Main() { Sinif1 a=new Sinif1(); Sinif2 b=new Sinif2(); //Grdnz gibi nesne yaratrken programn banda belirttiimiz takma isimleri kullandk. } }

NOT: Byle bir programda asl isim alanlarnn using anahtar szcyle ayr olarak belirtilmesi art deildir. Yani programmzda using bulunmasa da olurdu. NOT: Takma ad kullanm .Net Framework ktphanesindeki snflarda da geerlidir. rnek:

IsimAlani1; ve using IsimAlani2; satrlar

using K=System.Console; class AnaSinif { static void Main() { K.WriteLine("Deneme"); } }


Elbette ki programmzda Console dnda System isim alanna bal bir snf kullanacaksak

using

System; satrn programn bana eklemeliyiz. Ancak bu programda gerek yok. Baka bir rnek:
using System; using S=Sinif; class Sinif { public Sinif() { Console.WriteLine("Deneme"); } } class Ana { static void Main() { S a=new S(); } }
Burada Sinif snf varsaylan hayal isim alanmzda olduu iin isim alann belirtmedik.

using System; using K=Console; class Ana { static void Main() { K.WriteLine("Deneme"); } }
Burada System isim alan varsaylan isim alanmz olmasna ramen varsaylan hayal isim alanmz olmad iin program hata verir.

[dzenle] ie gemi isim alanlar


sim alanlar i ie geebilir. rnein .Net Framework ktphanesinde System isim alan altnda veri taban ilemleri iin zellemi olan System.Data isim alan bulunur. Kendimiz de iki trl i ie gemi isim alanlar oluturabiliriz. Birincisi klasik st isim alannn bloklar iinde yeni bir isim alan tanmlayarak gerekleir. kincisi de aadaki gibi:

namespace UstIsimAlani.AltIsimAlani { ...trler... }


Burada UstIsmAlani isim alanna bal AltIsimAlani adnda bir isim alan oluturduk.

[dzenle]Haric takma isimler


Daha nce, iki isim alanna bal ayn isimli trler bulunduunda ve bu isim alanlarn

using anahtar

szcyle programmza eklediimizde ayn adl trlerle bir ilem yapmak gerektiinde hata ktn ve bunu nlemek iin takma isimler kullandmz sylemitik. Peki diyelim ki iki tane DLL dosyamz var ve bu dosyalarda 100'er tane ayn isimli snf var. Farkl olan sadece snflarn ierii. Her bir snfa ayr ayr takma isim mi koyacaz? Tabii ki hayr. Bunun iin haric takma isimleri kullanacaz. Hatta biz bu rneimizi biraz daha abartalm ve isim alanlar da ayn adl olsun. Artk rneimize balayabiliriz. imdi dosya1.cs dosyas oluturun ve iine u kodlar yazn:

namespace IsimAlani { public class bir { } public class iki { } }


imdi dosya2.cs dosyas oluturun ve iine u kodlar yazn:

namespace IsimAlani { public class bir { } public class iki { } }


Bu iki dosyann ierii tamamen ayn. Ancak siz snflarn ierii farklym gibi dnn. imdi her iki dosyay da ktphane dosyas (DLL) hline getirmek iin komut satrndan

csc /t:library dosya1.cs csc /t:library dosya2.cs


komutlarn ayr ayr verin. Artk elimizde dosya1.dll ve dosya2.dll adl iki snf ktphanesi var. Bunlar haric ktphanelerdir. ou durumda btn ktphaneleri bir exe dosyasna gmmek pek kullanl olmayabilir. nk ayn ktphanelerden farkl exe dosyalarnn da faydalanmasn isteyebiliriz. Bu yzden DLL dosyalar olutururuz. Ayrca kodumuzda snflar public olarak belirttik. Bu sayede bu DLL'lerdeki snflara dardan eriimi mmkn kldk. Konumuza dnecek olursak yukardaki rneimizde iki farkl DLL dosyas tamamen ayn isim alan ve trleri ieriyor. imdi esas programmz oluturalm (ismi program.cs olsun):

using IsimAlani1; using IsimAlani2; class Program { static void Main() { bir a=new bir(); } }
imdi bu ana programmz derlememiz gerekiyor. Ancak dikkat etmemiz gereken bir nokta var. Bu ana programn nceki hazrladmz iki DLL ile ilikilendirilmesi gerekiyor. Bunun iin komut satrnda u kom utu veriyoruz:

csc /r:dosya1.dll /r:dosya2.dll program.cs


Henz bu program derlenmeyecektir. nk derleyici

bir a=new bir(); satrnda hangi

DLL'deki bir snfn kullanacan bilmemektedir. Programmzn hata vermemesi iin program.cs dosyamz yeni batan yle yazalm:

extern alias Dosya1; extern alias Dosya2; class Ana { static void Main() { } }
imdi komut satrndan derleme ilemini yeni takma isimlere gre yle yapmamz gerekiyor.

csc /r:Dosya1=dosya1.dll /r:Dosya2=dosya2.dll program.cs

Bu derleme ilemi sorunsuz gerekleecektir. Burada dosya1.dll dosyasna Dosya1 takma adn, dosya2.dll dosyasna da Dosya2 takma adn verdik. Pratikte pek faydal olmasa da bir ktphaneye birden fazla takma ad verebilirsiniz. Bunun iin takma adlar virglle ayrrsnz. imdi esas programmzdan DLL'lere ulamaya sra geldi.

[dzenle]:: operatr
:: (iki tane iki nokta yan yana) operatr ile takma isim verilmi DLL ktphanlerindeki tr ve isim alanlarna eriiriz. imdi rneklendirelim. Hatrlarsanz esas pprogrammzn Main blounda hibir kod yoktu. imdi program.cs dosyasnn Main blouna u kodlar ekleyin:

Dosya1::IsimAlani.Sinif a=new Dosya1::IsimAlani.Sinif(); Dosya2::IsimAlani.Sinif b=new Dosya1::IsimAlani.Sinif();


Ayn ekilde bu tr uzun bir nesne yaratm yapmak istemiyorsak programn bana

using Dosya1::IsimAlani; using Dosya2::IsimAlani;


Ancak tabii ki yukardaki gibi bir using bildirimi ayn adl isim alanlarnda farkl adl trler varsa mantkldr. rneimizde pek de mantkl deildir.

[dzenle]global haric takma ismi


.Net Framework ktphanesi, kendi oluturduumuz ktphaneler ve takma ad verilmemi DLL ktphanelerimiz otomatik olarak global takma adn alr. Yani programlar aadaki gibi de yazlabilir.

using System; namespace ia { class Yardimci { public Yardimci() { Console.WriteLine("Yardmc"); } } } namespace ana { class Sinif { static void Main() { global::ia.Yardimci a=new global::ia.Yardimci(); } } }
Baka bir rnek:

class prg { static void Main() { global::System.Console.WriteLine("Deneme"); } }


Ancak az nce ilediimiz rnei

global::IsimAlani.Sinif a=new global::IsimAlani.Sinif(); global::IsimAlani.Sinif b=new global::IsimAlani.Sinif();


eklinde deitiremezdik. Pek bir iimize yaramasa da bilmeniz de fayda var. NOT: extern ifadeleri using ifadelerinden nce yazlmaldr. NOT: DLL dosyalar direkt trleri ierebilecei gibi isim alanlarn ve isim alannn altnda da trleri ierebilir. NOT: Eer trler farkl bir DLL dosyasndaysa trleri public olarak belirtmek gerekir. Ancak ayn dosyada farkl bir isim alanndaysa, ya da dosyalar birlikte derleme sz konusuysa

public anahtar

szcn kullanmaya gerek yoktur. imdiye kadar rendiimiz btn trler public anahtar szcyle belirtilebilir.

C Sharp Programlama Dili/System isim alan


Vikikitap, zgr ktphane
< C Sharp Programlama Dili

Bu ksmda .Net Framework snf ktphanesinin en tepesinde bulunan System isim alanndaki nemli trleri yakndan inceleyeceiz. Hatrlarsanz bu isim alanndaki rastgele say retmeye yarayan Random snfn, matematiksel ilemler yapmamz salayan Math snfn ve trler arasnda dnm salayan Convert snfn daha nce incelemitik. imdi ise C#'ta tarih-saat ilemleriyle ilgili ye elemanlar barndran DateTime ve TimeSpan yaplarn, p toplama mekanizmasyla ilgili ye elemanlar barndran GC snfn, verilerin baytlaryla ilgili ilemler yapmamza yarayan BitArray ve Buffer snflarn, dizilerle ilgili ilemler yapmamz salayan Array snfn ve C#'taki temel tr yaplarn ayrntlaryla ileyeceiz.
Konu balklar
[gizle]

1 Temel tr yaplar

1.1 Decimal tr

2 System.Array snf

o o

2.1 zellikler 2.2 Metotlar

3 Tarih ve zaman ilemleri 4 BitConverter snf 5 Buffer snf

o o o o

5.1 BlockCopy() metodu 5.2 ByteLength() metodu 5.3 GetByte() metodu 5.4 SetByte() metodu

6 GC (Garbage Collection) snf

[dzenle]Temel tr yaplar
Daha nce sylemitim, ancak yine de hatrlatmak istiyorum. C#'taki temel veri trleri aslnda System isim alanndaki baz yaplardan baka bir ey deildir. int, float, vb. System isim alanndaki Int32, Single, vb. yaplarna verilen takma isimden baka bir ey deildir. Yani C#'n programlarmzn bana

using

int=System.Int32; satrn gizlice eklediini dnebilirsiniz. Aadaki tabloyu inceleyiniz:


C#'taki takma ad System isim alanndaki yap bool byte sbyte short ushort int uint long ulong float double decimal char Boolean Byte Sbyte Int16 UInt16 Int32 UInt32 Int64 UInt64 Single Double Decimal Char

Tahmin edersiniz ki bu yaplarn ye elemanlar da vardr. nce zellikleri inceleyelim:

MaxValue lgili veri trnn tutabilecei maksimum deeri ilgili veri trnden tutar. string, object ve bool tr haricindekilerle kullanlabilir. rnek:

Console.WriteLine(UInt64.MaxValue);
MinValue lgili veri trnn tutabilecei minimum deeri ilgili veri trnden tutar. string, object ve bool tr haricindekilerle kullanlabilir. rnek:

Console.WriteLine(UInt64.MinValue);
Epsilon Yalnzca Single ve Double ile kullanlabilir. En kk pozitif deeri ilgili veri trnden tutar. rnek:

Console.WriteLine(Single.Epsilon);
NaN Herhangi bir sayy temsil etmeyen deer (ilgili trde). Yalnzca Single ve Double ile kullanlabilir. rnek:

Console.WriteLine(Single.NaN);
NegativeInfinity Negatif sonsuz (ilgili trde). Yalnzca Single ve Double ile kullanlabilir. rnek:

Console.WriteLine(Single.NegativeInfinity);
PositiveInfinity Pozitif sonsuz (ilgili trde). Yalnzca Single ve Double ile kullanlabilir. rnek:

Console.WriteLine(Single.PositiveInfinity);
imdi de metotlar: Parse() String trnden veriyi ilgili tre evirir. String ve object hari btn trlerle kullanlabilir. Aslnda Parse() metodunun yapt i stringin trnaklarn kaldrmaktr. Stringin trnaklar kaldrlm hli hedef trle uyumluysa dnm gerekleir. rnein string trndeki veri

"true" ise Boolean trne

dnebilir. Ancak Int32 trne dnmez. Benzer ekilde stringin iindeki karakter says bir taneyse char'a dnebilir. Aksi bir durumda dnmez. Eer dnm gereklemezse alma zaman hatas alrsnz. rnek:

int a=Int32.Parse("12");
CompareTo() Bu metotla, metodu aran veriyle parametre kyaslanr. Metodu aran bykse pozitif, parametre bykse negatif, eitlerse 0 deeri dndrr. Geri dn tipi inttir. Btn trlerle kullanlabilir, ancak metodu aran object olamaz. Parametredeki verinin tr metodu arandan kk ya da eit kapasiteli olmaldr. Bool tryle bool tr kyaslanabilir. true 1, false 0'm gibi ele alnr. String trndeyse iki string aynysa 0, dier durumlarda 1 deeri geri dndrr. rnek:

Console.WriteLine(12.CompareTo(100));
Equals() Bu metotla, metodu aran veriyle parametre kyaslanr. Eitlerse true, eit deillerse false deeri geri dndrr. Btn trlerle kullanlabilir. Hatasz sonular iin parametrenin tipi metodu arandan kk ya da eit kapasiteli olmaldr. Uyumsuz trler kyaslanrsa hata vermez, false deeri geri dndrr. rnek:

Console.WriteLine(12.Equals(100));

ToString() Verilerin stringe dnm hllerini tutar. Parse'n tersidir diyebiliriz. Btn trlerle kullanlabilir. rnek:

string a=12.ToString();
IsInfinity() Parametredeki Single ya da Double trndeki veri sonsuz ise true, deilse false deeri retir. rnek:

Console.WriteLine(Single.IsInfinity(12));
IsNaN() Parametredeki Single ya da Double trndeki veri NaN (say olmayan) ise true, deilse false deeri retir. rnek:

Console.WriteLine(Single.IsNaN(12));
IsPositiveInfinity() Parametredeki Single ya da Double trndeki veri pozitif sonsuzsa true, deilse false deeri dndrr. rnek:

Console.WriteLine(Single.IsPositiveInfinity(12));
IsNegativeInfinity() Parametredeki Single ya da Double trndeki veri negatif sonsuzsa true, deilse false deeri dndrr. rnek:

Console.WriteLine(Single.IsNegativeInfinity(12));
GetNumericValue() Yalnzca Char yapsnda bulunur. Char tipindeki parametre numerikse o sayy dndrr, numerik deilse negatif say dndrr. Geri dn tipi double'dr. rnek:

Console.WriteLine(Char.GetNumericValue('5'));
imdi bir metot grubu inceleyelim. Aadaki metotlarn tamam yalnzca Char yapsnda bulunur, tamam static'tir ve tamamnn iki farkl prototipi vardr. Birinci prototip:

Metot(char)
Bu metot prototipinde char trnden veri metoda sokulur.

Metot(string,int)
Bu metot prototipinde string iindeki int'te belirtilen indeks numarasndaki karakter metoda sokulur. Bu metotlarn tamamnn geri dn tipi bool'dur, belirtilen koul salanmsa true, salanmamsa false deeri dndrr. imdi bu metotlar:

Metot IsControl IsDigit IsLetter

Koul Karakter kontrol karakteri ise Karakter bir rakam ise Karakter bir harf ise

IsLetterOrDigit Karakter bir harf ya da rakam ise

IsLower IsNumber

Karakter kk harf ise Karakter rakam ise

IsPunctuation Karakter noktalama iareti ise IsSeperator IsSurroGate IsSymbol IsUpper Karakter boluk gibi ayrc ise Karakter Unicode yedek karakteri ise Karakter sembol ise Karakter byk harf ise

IsWhiteSpace Karakter tab ya da boluk karakteri ise

imdi bunlara iki rnek verelim:

Console.WriteLine(Char.IsUpper('f'));
veya

Console.WriteLine(Char.IsUpper("deneme",3));
imdi iki metot inceleyelim. Bu metotlarn ikisi de yalnzca Char yapsnda bulunur. Parametre olarak Char trnden veri alrlar. kisi de statictir. ToLower Parametresinden ald char' kk harfe dntrp char olarak tutar. ToUpper Parametresinden ald char' byk harfe dntrp char olarak tutar. Bu iki metot, parametre mantksal olarak dntrlemeyecekse karakteri olduu gibi tutar. rnein ToLower metodu parametre olarak 'h' veya '%' almsa karakterde herhangi bir deiim yapmadan tutar. imdi iki zellik inceleyelim. Bu iki zellik yalnzca Boolean yapsnda bulunur ve False ve True stringlerini retir. rnekler:

string a=Boolean.FalseString; string b=Boolean.TrueString;

[dzenle]Decimal tr
C# Decimal isminde dier dillerden farkl bir veri tr barndrr. Deikenler konusunu hatrlarsanz Decimal tr 16 bayt ile en fazla boyuta sahip olan trd. Ancak iin enteresan taraf kapasitesi ok da fazla deildi. Kapasitesi 8 byte olan double, decimaldan kat be kat fazla veri depolayabiliyordu. te imdi decimal trnn srrn greceiz. Decimal tr System isim alanndaki Decimal yapsyla temsil edilir. Decimal veri trnn bellekte saklanmas dier trlere nazaran biraz karmaktr. Bu yzden bilgisayarlarn decimal tryle ilem yapmas biraz daha zordur. Decimal trnden bir nesne ok deiik yollarla tanmlanabilir. rn ekler:

Decimal a=new Decimal(20);

Grdnz gibi Decimal yapsnn bir yapc metodu varm. Bu yapc metoda parametre olarak int, uint, long, ulong, float ve double trnden veri verilebilir. Baka bir tanmlama ekli

Decimal a=new Decimal(int alt, int orta, int ust, bool iaret, byte ondalk);
buradaki alt 128 bitlik (yani 16 baytlk) saynn ilk 32 bitini, orta sonraki 32 bitini, ust sonraki 32 bitini temsil eder. iaret true olursa say negatif, false olursa pozitif olur. Son olarak

ondalk da saynn

ondalk ksmn ayrmak iin kullanlan noktann sadan kanc basamakta olduunu, dier bir deile saynn ondalkl ksmnn ka haneli olacan belirtir. imdi bir rnek:

Decimal a=new Decimal(128755,0,0,false,2);


Bu koda gre a says 1287.55'tir. imdi yalnzca Decimal yapsna zg metotlar inceleyelim: ToByte(), ToSbyte, ToInt16, ToUInt16, ToInt32, ToUInt32, ToInt64, ToUInt64, ToSingle() ve ToDouble() metotlarnn tamam statictir, parametre olarak decimal trnden veri alrlar ve ilgili trdeki veriyi retirler. Yani tr dnm yaparlar. Bir rnek:

int a=Decimal.ToInt32(5m);
imdi decimal saylar zerinde eitli ilemler yapan metotlara geelim: d1 ve d2 decimal trnden iki veri olmak zere

Decimal.Add(d1,d2); //d1 ve d2'nin toplamn decimal trnden tutar. Decimal.Divide(d1,d2); //d1'in d2'ye blmn decimal trnden tutar. Decimal.Multiply(d1,d2); //d1 ile d2'nin arpmn decimal trnden tutar. Decimal.Subtract(d1,d2); //d1-d2'nin sonucunu decimal trnden tutar. (karma ilemi) Decimal.Remainder(d1,d2); //d1'in d2'ye blmnden kalan decimal trnden tutar. (mod alma ilemi) Decimal.Floor(d1); //d1'den byk olmayan en byk tam sayy decimal trnden tutar. (aa yuvarlama) Decimal.GetBits(d1); /*d1 iin decimal say tanmlarken kullandmz yapc ilevdeki be parametreyi int trndeki bir dizi olarak tutar.*/ Decimal.Negate(d1); //d1'in negatifini tutar. Decimal.Round(d1,sayi); /*sayi int trnde olmaldr. Bu metot ile d1'in ondalk ksmndaki hane says sayi kadar kalr. Yani d1 12.53666 ve sayi 3 ise 12.537 tutulur. Son kaybedilen hane 5 ya da 5'ten bykse son kalan hane 1 artlr. sayi 0 olursa d1 tam sayya yuvarlanm olur.*/ Decimal.Truncate(d1); //d1'in tam say ksmn tutar. Herhangi bir yuvarlama yaplmaz.
Decimal saylarn normal saylardan en nemli farklarndan biri de udur:

double a=2.00d; decimal b=2.00m;

Console.WriteLine(a); Console.WriteLine(b);
Bu program ekrana alt alta 2 ve 2,00 yazar. Yani normal saylarda ondalk ksmdaki etkisiz sfrlar sonuca yansmazken, decimal saylarda yansr. Decimal saylar daha ok ekonomi, bankaclk, para, muhasebe, vb. ile ilgili yazlm gelitirirken kullanlr.

[dzenle]System.Array snf
Array snfndaki birok metodu ve zellii daha nce grmtk. Burada yalnzca hatrlatma yapacam ve birka yeni ye eleman greceksiniz.

[dzenle]zellikler
IsFixedSize Dizinin eleman says sabitse true, deilse false deeri verir. Henz eleman says srekli deien dizileri grmediimiz iin sonucu daima true olacaktr. rnek (dizibir dizi olmak zere):

Console.WriteLine(dizi.IsFixedSize);
IsReadOnly Dizideki elemanlar salt-okunur ise true, deilse false deeri verir. Henz salt-okunur dizileri grmediimiz iin bunun sonucu da daima false olacaktr rnek.

Console.WriteLine(dizi.IsReadOnly);
Length Dizideki eleman saysn verir (int). rnek:

Console.WriteLine(dizi.Length);
Rank Dizinin ka boyutlu olduunu verir (int). rnek:

Console.WriteLine(dizi.Rank);

[dzenle]Metotlar
BinarySearch, Clear, Copy, CopyTo, GetLength, GetValue, Reverse, SetValue, Sort ve CreateInstanc e metotlarn diziler konusunda ayrntl olarak grmtk. Burada henz grmediimiz bir metodu tantmak istiyorum. IndexOf metodu bir elemann bir dizi iinde ilk grld indeksi verir. rnek:

int[] dizi={1,6,9,23,5}; Console.WriteLine(Array.IndexOf(dizi,5));


Bu kod ekrana 4 yazar.

[dzenle]Tarih ve zaman ilemleri


Hatrlarsanz nceki konularmzn birinde Zaman snf oluturmu ve iki zaman nesnesiyle eitli ilemler yapmtk. Aslnda imdi greceimiz DateTime ve TimeSpanyaplar da benzer ileve sahip. DateTime yaps belirli bir zaman tutmaya yararken, TimeSpan ise zamann miktaryla ilgilenir. imdi bir rnek yapalm:

Console.WriteLine("En kk: "+DateTime.MinValue); Console.WriteLine("En byk: "+DateTime.MaxValue);


Bu kod ekrana

En kk: 01.01.0001 00:00:00 En byk: 31.12.9999 23:59:59


ktsn verecektir. Grdnz gibi DateTime yapsna ait olan MinValue ve MaxValue zellikleri -tpk temel veri trlerinde olduu gibi- DateTime yapsnn tutabilecei en byk ve en kk verileri veriyor. imdi baka nemli zelliklere bakalm: Now imdiki saati, Today bugn DateTime trnden verir. rnek:

Console.WriteLine(DateTime.Now); Console.WriteLine(DateTime.Today);
Bu kodun ekran kts una benzer:

25.12.2008 16:52:25 25.12.2008 00:00:00


Ayn ilemler DateTime yaps trnden nesne oluturularak da yaplabilir. rnek:

DateTime Tarih=new DateTime(); DateTime Zaman=new DateTime(); Tarih=DateTime.Today; Zaman=DateTime.Now; Console.WriteLine(Tarih); Console.WriteLine(Zaman);
imdi de DateTime yapsna ait dier gzel zellikleri inceleyelim, bunlar static deildir, yani DateTime trndeki nesnelerle eriilir Date DateTime nesnesine ilikin saat dndaki bilgiyi verir. (DateTime) Month DateTime nesnesinin ay bilgisini verir. (int) Day DateTime nesnesinin gn bilgisini verir. (int) Year DateTime nesnesinin yl bilgisini verir. (int) DayOfWeek DateTime nesnesinin haftann kanc gn olduunu verir. (DayOfWeek enum sabiti) DayOfYear DateTime nesnesinin yln kanc gnne denk geldiini verir. (int) TimeOfDay Geerli gn iin 00:00:00'dan itibaren ne kadar zaman getiini TimeSpan nesnesi olarak verir. (TimeSpan) Hour DateTime nesnesinin saat bilgisini verir. (int) Minute DateTime nesnesinin dakika bilgisini verir. (int) Second DateTime nesnesinin saniye bilgisini verir. (int) Milisecond DateTime nesnesinin milisaniye bilgisini verir. (1 saniye=1000 milisaniye)(int) Ticks x saniyenin 10 milyonda biri olmak zere, DateTime nesnesindeki tarih ile 1 Ocak 0001 00:00:00 arasndaki x saysn verir. (long) Bir DateTime nesnesini u yntemlerle oluturabiliriz.

DateTime nesne=new DateTime(long tick_says); DateTime nesne=new DateTime(int yl,int ay,int gn); DateTime nesne=new DateTime(int yl,int ay,int gn,int saat,int dakika,int saniye); DateTime nesne=new DateTime(int yl,int ay,int gn,int saat,int dakika,int saniye,int milisaniye);
Grdnz gibi DateTime yapsnn ar yklenmi birok yapc metodu varm. imdi bir rnek yapalm.

DateTime a=new DateTime(2008,12,25); Console.WriteLine(a.Day);


Bu kod ekrana 25 yazar. Gelelim TimeSpan yapsna. TimeSpan yaps belirli bir tarih tutmaktan ziyade zamann miktar ile ilgilenen bir yapdr. ki DateTime nesnesini birbirinden karrsak sonuta bir TimeSpan nesnesi oluur. rnek:

DateTime Gun1=new DateTime(2008,5,5); DateTime Gun2=new DateTime(2008,12,3); TimeSpan fark=Gun2-Gun1; Console.WriteLine(fark.Days);


Bu program ekrana 212 yazar. Evet gerekten de iki tarih arasnda 212 gn fark vardr. Ayrca grdnz gibi TimeSpan yapsnn Days adnda static olmayan bir zellii varm. Bunun gibi Hours, Minutes, Seconds ve Milliseconds zellikleri de vardr. Bu zelliklerin tamam ilgili TimeSpan nesnesinin ilgili ksmn dndrr. Tamamnn geri dn tipi inttir. Yine TimeSpan yapsnn TotalDays, TotalHours, TotalMilliseconds, TotalMinutes ve TotalSeconds zellikleri ise ilgili TimeSpan nesnesini ilgili cins trnden dndrr. Yani cinsler arasnda dnm yaplr. Bunlarn geri dn tipi ise double'dr.

TimeSpan GunSayisi=new TimeSpan(45,0,0,0); DateTime nesne=DateTime.Today+GunSayisi; Console.WriteLine(nesne);


Bu kod bugnden 45 gn sonrasn ekrana yazar. Baka bir rnek

TimeSpan DakikaSayisi=new TimeSpan(0,0,23,0); DateTime nesne=DateTime.Now+DakikaSayisi; Console.WriteLine(nesne);


Bu kod ise imdiden 23 dk. sonrasn ekrana yazar. <, >, >=, <=, ==, != operatrlerini iki DateTime nesnesini ya da iki TimeSpan nesnesini kyaslamak iin kullanabiliriz. Ayrca DateTime yapsna ait olan AddDays() metodu DateTime trnden bir nesneye gn ekletip tutmak iin kullanlr. rnek:

DateTime a=new DateTime(2008,1,1); Console.WriteLine(a.AddDays(65));


Bu program ekrana 06.03.2008

00:00:00 yazar. Ancak burada tabii ki a nesnesinin deeri

deimez. AddDays() metodunun geri dn tipi DateTime'dr.

[dzenle]BitConverter snf

Alt seviye programlama yaparken genellikle verilerin kendileriyle deil, baytlaryla ilgileniriz. te BitConverter snf bu ilemleri yaparken iimize yarayacak ye elemanlar ierir. BitConverter snfnda bir tane zellik vardr. Bu zellik IsLittleEndian zelliidir. Sistemimizin verileri hangi mimariye gre sakladn kontrol eder. Bilgisayarlar verileri iki eit mimariye gre saklarlar. 1. Dk anlaml byte ilk srada 2. Yksek anlaml byte ilk srada Eer dk anlaml byte ilk sradaysa bu mimariye "Little Endian", yksek anlaml byte ilk sradaysa bu mimariye de "Big Endian" denir. IsLittleEndian zellii mimari "Little Endian" ise true, "Big Endian"sa false deeri retmektedir. Intel ve AMD'nin btn ilemcileri Little Endian mimarisine gre almaktadr. Yani bu durumda ev bilgisayarlarnn %90'nn bu mimariden olduunu syleyebiliriz. Little Endian sistemlerde verilerin bellee nce dk anlaml baytlar, sonra yksek anlaml baytlar yazlr. Bellekten okuma yaplrken de ayn sra gzetilir. Big Endian sistemlerde ise bu durumun tam tersi sz konusudur. Aadaki kodla sisteminizin hangi mimariyle altn renebilirsiniz.

if(BitConverter.IsLittleEndian) Console.WriteLine("Little Endian"); else Console.WriteLine("Big Endian");


Grdnz gibi IsLittleEndian static bir metot. Gelelim BitConverter snfnn en nemli metoduna. GetBytes() metodu bool, char, int, long, double, short, uint, ulong, ushort trnden verilerin bytelarn byte trnden bir dizi olarak tutar. rnek:

int a=258; //00000000 00000000 00000001 00000010 byte[] dizi=BitConverter.GetBytes(a); foreach(byte b in dizi) { Console.WriteLine(b); }
Benim bilgisayarmda bu program ekrana alt alta 2, 1, 0 ve 0 yazd. Sizin bilgisayarnzda sonu, bilgisayarnzn mimarisine gre benimkiyle ayn veya ters srada olabilir. 10'un onluk sistemdeki karl 2, 1'in ise 1'dir. Dier iki 0'sa int trnn bellekte kaplad dier iki bayt temsil eder. int 32 bitlik (4 baytlk) bir veri tipidir. Eer a deikeninin tr short (16 bit-2 bayt) olsayd ekrana sadece 2 ve 1 yazlacakt. BitConverter snfna ait static bir metot grubu vardr. Bu metot grubu herhangi bir byte dizisini temel veri trlerine dntrr, yani GetBytes() metodunun tersini yaparlar. statictirler, iki parametre alrlar. rnek olarak GetBytes() metodunun sonucunu kullanalm:

byte[] dizi={2,1,0,0}; Console.WriteLine(BitConverter.ToInt32(dizi,0));


Bu kod ekrana -mimariniz Little Endian ise- 258 yazar. Burada dizi dizisini 0. indeksten itibaren inte dntrp ekrana yazdrdk. BitConverter snfnn ToInt32'ye benzer ToBoolean(), ToChar(), ToInt16(), ToInt32(), ToInt64(), ToSingle(), ToDouble(), ToUInt16(), ToUInt32() ve ToString() metotlar da vardr. Eer

dizi stringe dntrlrse bu rneimizde ekrana 02-01-00-00 yazar. Btn bu metotlar bilgisayarnzn mimarisine gre alrlar. Baka bir rnek verelim:

byte[] dizi={2,1}; Console.WriteLine(BitConverter.ToInt32(dizi,0));


Bu program alma zaman hatas verir. nk 32 bitlik (4 bayt) Int32 trne eksik bir dizi verilmitir. Bu dizi Int32 trne dntrlemez. Baka bir rnek:

byte[] dizi={2,1}; Console.WriteLine(BitConverter.ToInt16(dizi,0));


Bu kod hata vermez. nk Int16 trnn kapasitesi 16 bittir (2 bayt). Dolaysyla da Int16 trne iki elemanl bir byte dizisi verilmesi yeterlidir. Baka bir rnek:

byte[] dizi={2,1,5,8}; Console.WriteLine(BitConverter.ToInt16(dizi,0));


Bu program hata vermez. Yalnzca ilk iki bayt (0. ve 1. indis) hesaplamaya girer ve sonu Little Endian mimarisinde 258 kar.

[dzenle]Buffer snf
Buffer snfyla tr bilgisinden bamsz ilemler yaparz. Buffer snf verilerin deerlerine deil baytlarna bakar.

[dzenle]BlockCopy() metodu
Prototipi yledir:

static void BlockCopy(Array kaynak, int kaynak_indeks, Array Hedef, int Hedef_indeks, int adet)
Bu prototip kaynak dizisinin kaynak_indeks numaral indeksinden itibaren adet kadar elemann Hedef dizisine Hedef_indeks numaral indeksten itibaren kopyalar. Ancak kopyalama trden bamsz, bayt bayt yaplr. rnek:

byte[] kaynak={1,2,3,1}; //00000001 , 00000010 , 00000011 , 00000001 short[] hedef=new short[4]; //0000000000000000 , 0000000000000000 , 0000000000000000 , 0000000000000000 Buffer.BlockCopy(kaynak,0,hedef,0,4); /*hedef dizisinin yeni hli: 0000001000000001 , 0000000100000011 , 0000000000000000 , 0000000000000000*/ foreach(short a in hedef) Console.WriteLine(a);
Bu program, mimarimiz Little Endian ise ekrana alt alta 513, 259, 0 ve 0 yazacaktr. Burada derleyici her eleman bellekte 1 bayt yer kaplayan kaynak dizisinin elemanlarn her eleman bellekte 2 bayt kaplayan hedef dizisine olduu gibi kopyalad. Tahmin edersiniz ki kaynak dizisinin iki eleman hedef dizisinin bir elemanna tekabl eder ve iki kaynak eleman birleip bir hedef eleman oluturur. Benim sistemim Little

Endian olduu iin derleyici burada karlat ilk bayt dk anlaml bayta, ikinci bayt da yksek anlaml bayta kopyalad.

[dzenle]ByteLength() metodu
Kendisine parametre olarak verilen bir dizideki toplam bayt saysn bulur. rnein kendisine parametre olarak gnderilen 3 elemanl short trnden bir dizi sonucu 6 says gnderir. Geri dn tipi inttir. rnek:

short[] dizi=new short[4]; Console.WriteLine(Buffer.ByteLength(dizi));

[dzenle]GetByte() metodu
Prototipi u ekildedir:

static byte GetByte(Array dizi,int a)


dizi dizisinin a. baytn verir. rnek:

byte[] dizi={0,3,2,1,4}; Console.WriteLine(Buffer.GetByte(dizi,3));


Bu kod 1 deerini dndrr. Eer dizinin tipi byte deil de short olsayd iler deiirdi. nk o zaman hem sfrla beslenen baytlar da hesaba katlrd ve hem de bilgisayarmzn mimarisi sonucu etkilerdi. Bu durumu rneklendirelim:

short[] dizi={0,3,2,1,4}; // 0000000000000000 0000000000000011 0000000000000010 0000000000000001 0000000000000100 Console.WriteLine(Buffer.GetByte(dizi,4));


Bu kod Little Endian mimarisinde ekrana 2 yazar. Mimari Big Endian olsayd ekrana 0 yazacakt. nk Little Endian mimarisinde verilerin nce dk anlaml bayt okunur/yazlr. Big Endian mimarisinde ise tam tersi sz konusudur.

[dzenle]SetByte() metodu
Prototipi u ekildedir:

static void SetByte(Array dizi,int a,byte deger)


a. bayt deger olarak deitirir. rnek:

byte[] dizi={2,1,4}; Buffer.SetByte(dizi,1,5); Console.WriteLine(dizi[1]); //Ekrana 5 yazlr.


Yine eer dizinin tr byte deil de int olsayd iler deiirdi.

[dzenle]GC (Garbage Collection) snf


Garbage Collection mekanizmasnn normalde otomatik olarak yapt ileri bu snftaki ye elemanlar sayesinde manuel olarak da yapabiliriz. imdi ye elemanlar inceleyelim:

GC.Collect();

bu metot Garbage Collection mekanizmasnn devreye girmesini, dolaysyla da eer bellekte gereksiz nesne varsa silinmesini salar. Programn herhangi bir annda toplam tahsis edilmi bellek miktarn byte cinsinden grmek iinse GC snfnn GetTotalMemory(bool) metodu kullanlr. Eer parametre true olarak girilirse bellek miktar hesaplanmadan nce GC mekanizmas balatlarak bellekteki gereksiz nesneler silinir. Eer parametre false olarak girilirse direkt bellek miktar hesaplanr. rnek:

Console.WriteLine(GC.GetTotalMemory(true));

C Sharp Programlama Dili/Temel I/O ilemleri


Vikikitap, zgr ktphane
< C Sharp Programlama Dili

I/O ngilizce Input/Output'un ksaltmasdr, Trkeye girdi/kt olarak evirebiliriz. Ancak I/O bilgisayar ve programlama dnyasnda artk bir terim hviyetine kavutuu iin I/O olarak kullanmay tercih ediyorum. Dosya kaydetme, ekrana ya da yazcya bilgi yazdrma, klavyeden bilgi girii birer I/O ilemleridir. I/O ilemlerini System.IO isim alannn altndaki eitli snflarla yaparz. imdi isterseniz laf fazla uzatmadan dosya ve klasr ilemleriyle ilgili snflara geelim.
Konu balklar
[gizle]

1 Directory snf

o o o o o o o o o o o o o o o o

1.1 DirectoryInfo CreateDirectory(string adres) 1.2 void Delete(string adres) 1.3 bool Exists(string adres) 1.4 string GetCurrentDirectory() 1.5 string[] GetDirectories(string adres) 1.6 string GetDirectoryRoot(string adres) 1.7 string[] GetFiles(string adres) 1.8 string[] GetFileSystemEntries(string adres) 1.9 DateTime GetLastAccessTime(string adres) 1.10 DateTime GetLastWriteTime(string adres) 1.11 DateTime GetCreationTime(string adres) 1.12 string[] GetLogicalDrives() 1.13 DirectoryInfo GetParent(string adres) 1.14 void Move(string kaynak_adres,string hedef_adres) 1.15 void SetLastAccessTime(string adres, DateTime zaman) 1.16 void SetLastWriteTime(string adres, DateTime zaman)

o o

1.17 void SetCreationTime(string adres, DateTime zaman) 1.18 void SetCurrentDirectory(string adres)

2 File snf

o o o o o o

2.1 StreamWriter AppendText(string adres) 2.2 void Copy(string kaynak,string hedef) 2.3 FileStream Create(string adres,int tampon) 2.4 StreamWriter CreateText(string adres) 2.5 FileAttributes GetAttributes(string adres) 2.6 Open

o o o

2.6.1 FileMode enumunda bulunan szckler 2.6.2 FileAccess enumunda bulunan szckler 2.6.3 FileShare enumunda bulunan szckler

2.7 FileStream OpenRead(string adres) 2.8 StreamReader OpenText(string adres) 2.9 FileStream OpenWrite(string adres)

3 DirectoryInfo snf

o o o o o o o o

3.1 void Create() 3.2 DirectoryInfo CreateSubdirectory(string adres) 3.3 Delete 3.4 DirectoryInfo[] GetDirectories() 3.5 FileInfo[] GetFiles() 3.6 FileSystemInfo[] GetFileSystemInfos() 3.7 void MoveTo(string hedef) 3.8 void Refresh()

4 FileInfo snf

o o o

4.1 CopyTo 4.2 void MoveTo(string hedef) 4.3 void Refresh()

5 Path snf 6 Dosya yazma ve okuma ilemleri

6.1 FileStream snf

o o o

6.1.1 FileStream snf ile yazma ve okuma

6.2 StreamReader snf 6.3 StreamWriter snf 6.4 BinaryWriter ve BinaryReader snflar

7 Console I/O ilemleri

7.1 Standart akmlarn ynlendirilmesi

[dzenle]Directory snf
Directory snfnn hibir zellii yoktur, System.IO altnda bulunur, sadece static metotlar ierir.

[dzenle]DirectoryInfo CreateDirectory(string adres)

adres ile belirtilen adreste bir klasr oluturur ve bu klasr bilgilerini bir DirectoryInfo nesnesi olarak tutar.
Programmzn alt klasrde bir klasr oluturmak iin sadece klasrn adn yazmak yeterlidir. rnekler:

Directory.CreateDirectory(@"C:\WINDOWS\deneme");
Bu kod C:\WINDOWS altnda deneme isimli bir klasr oluturur.

Directory.CreateDirectory("deneme");
Bu kod programn alt klasrde deneme isimli bir klasr oluturur.

Directory.CreateDirectory(@"..\deneme");
Bu kod programn alt klasrn bir st klasrnde deneme isimli bir klasr oluturur.

Directory.CreateDirectory(@"..\..\deneme");
Bu kod programn alt klasrn iki st klasrnde deneme isimli bir klasr oluturur.

.. saylar bu

ekilde artrlabilir. Bu tr bir adres belirtme ekli btn dier metotlarda da geerlidir. Ayrca bu ve dier btn metotlarda da adres diye tarif ettiimiz veriye dosya/klasrn ad da dhildir.

[dzenle]void Delete(string adres)


Belirtilen adresteki bo klasr silmek iin kullanlr. Baka bir kullanm daha vardr.

void Delete(string adres,bool a)


Bu metot ile eer a true ise belirtilen adresteki klasr, iindeki btn dosya ve klasrlerle birlikte silinir.

[dzenle]bool Exists(string adres)


Belirtilen adresteki klasrn olup olmadn bool cinsinden tutar. Klasr varsa true, yoksa false dnd rr.

[dzenle]string GetCurrentDirectory()
alan programn hangi klasrde olduunu verir. rnein Windows'taysak C:\WINDOWS'u tutar.

[dzenle]string[] GetDirectories(string adres)


Belirtilen adresteki btn klasrleri adresleriyle birlikte bir string dizisi olarak tutar.

[dzenle]string GetDirectoryRoot(string adres)


Belirtilen adresteki klasrn kk dizin bilgisini verir. rnein adres

C:\Program

Files\CONEXANT\CNXT_MODEM_HDAUDIO_SprtHD5m ise C:\ deerini dndrr.

[dzenle]string[] GetFiles(string adres)


Belirtilen adresteki dosyalar adresleriyle birlikte string dizisi olarak tutar. Bu ve benzer metotlarda liste ngilizce alfabetik srasna gredir. GetFiles() metodunun bir prototipi daha vardr:

string[] GetFiles(string adres,string dosya)


Adresteki dosya(lar) adresleriyle birlikte string dizisi olarak tutulur. Dosya isminde joker karakterleri (*, ?) kullanlabilir.

[dzenle]string[] GetFileSystemEntries(string adres)


Belirtilen adresteki btn dosya ve klasrleri adresleriyle birlikte bir string dizisi olarak tutar.

[dzenle]DateTime GetLastAccessTime(string adres)


Belirtilen adresteki dosya ya da klasre en son ne zaman eriildiini DateTime trnden tutar.

[dzenle]DateTime GetLastWriteTime(string adres)


Belirtilen adresteki dosya ya da klasrn en son ne zaman deitirildiini DateTime trnden tutar.

[dzenle]DateTime GetCreationTime(string adres)


Belirtilen adresteki dosya ya da klasrn ne zaman oluturulduunu DateTime trnden tutar.

[dzenle]string[] GetLogicalDrives()
Bilgisayardaki btn srcleri bir string dizisi olarak tutar. Bu srclere her trl sabit disk, CD-ROM src, flash disk vb. dhildir.

[dzenle]DirectoryInfo GetParent(string adres)


Belirtilen adresin bir st klasrn DirectoryInfo nesnesi olarak dndrr.

[dzenle]void Move(string kaynak_adres,string hedef_adres)


Dosya ve klasrleri bir konumdan baka bir konuma tar. rnekler:

Directory.Move(@"C:\Documents and Settings\Bekir Oflaz\Belgelerim\rnek dosya.rtf",@"C:\Web\deneme.rtf");


Bu kod C:\Documents

and Settings\Bekir Oflaz\Belgelerim altndaki rnek

dosya.rtf dosyasn C:\Web konumuna deneme.rtf adyla tar.


Directory.Move(@"C:\Web",@"C:\Documents and Settings\Bekir Oflaz\Belgelerim\internet");
Bu kod src klasrndeki Web klasrn tm ieriiyle birlikte C:\Documents

and

Settings\Bekir Oflaz\Belgelerim klasrne internet adyla tar. Eer hedef


klasrde ayn adl dosya ya da klasr varsa alma zaman hatas alrsnz.

[dzenle]void SetLastAccessTime(string adres, DateTime zaman)


Belirtilen adresteki dosya ya da klasrn en son eriim zamann zaman olarak deitirir.

[dzenle]void SetLastWriteTime(string adres, DateTime zaman)


Belirtilen adresteki dosya ya da klasrn en son deitirilme zamann zaman olarak deitirir.

[dzenle]void SetCreationTime(string adres, DateTime zaman)


Belirtilen adresteki dosya ya da klasrn oluturulma zamann zaman olarak deitirir.

[dzenle]void SetCurrentDirectory(string adres)


Programn alt klasr belirtilen adres ile deitirir.

[dzenle]File snf
File snfndaki birok metot Directory snfnda da vardr, tek farklar ayn grevleri dosyalar iin yerine getirmeleridir. Bu metotlar unlardr: Exists(), Delete(), GetCreationTime(), GetLastAccessTime(), GetLastWriteTime(), Move(), SetCreationTime(), SetLastAccessTime(), SetLastWriteTime(). imdi File snfnn Directory snfnda olmayan metotlarna sra geldi.

[dzenle]StreamWriter AppendText(string adres)


Adreste belirtilen dosya iin daha sonra greceimiz bir StreamWriter nesnesi oluturur.

[dzenle]void Copy(string kaynak,string hedef)


Kaynakta belirtilen dosya hedefe kopyalanr. Kopyalamada bir isim akmas sz konusuysa, yani sizin kopyalama yapmak istediiniz klasrde zaten ayn isimli bir dosya varsa alma zaman hatas alrsnz. Bunu nlemek iinse;

void Copy(string kaynak,string hedef,bool a)


Burada a true olursa eer hedef klasrde ayn adl dosya varsa stne yazlr. a false yaplrsa iki parametreli hlinden fark kalmaz.

[dzenle]FileStream Create(string adres,int tampon)


Belirtilen adresteki dosya olutururlur ve dosyaya ilikin FileStream nesnesi dndrlr. tampon yazlmazsa yani sadece bir parametre yazlrsa varsaylan tampon miktar kullanlr.

[dzenle]StreamWriter CreateText(string adres)


Belirtilen adreste zerine yazmak iin bir text dosyas oluturulur ve dosyaya ilikin StreamWrit er nesnesi dndrlr.

[dzenle]FileAttributes GetAttributes(string adres)


Belirtilen adresteki dosya ya da klasrn FileAttributes enumu cinsinden znitelii dndrlr. FileAttributes enum sabiti u szckleri ierir: Archive, Compressed, Device, Directory, Encrypted, Hidden, Normal, NotContentIndexed, Offline, ReadOnly, ReparsePoint, SparseFile, System, Temporary. Bir dosya ya da klasrn birden fazla znitelii olabilir. Bu durumda znitelikler virglle ayrlr.

[dzenle]Open
farkl ar yklenmi eidi vardr. Bunlar:

FileStream Open(string adres, FileMode a) FileStream Open(string adres, FileMode a, FileAccess b) FileStream Open(string adres, FileMode a, FileAccess b,FileShare c)
Open() metodu belirtilen adresteki dosyay aar ve dosyaya ilikin FileStream nesnesini dndrr. FileMode, FileAccess ve FileShare System.IO isim alannda bulunan enumlardr ve dosyann ne ekilde alacan ve zerinde ne ekilde ilem yaplacan belirtirler.

[dzenle]FileMode enumunda bulunan szckler


Append Alan dosyann sonuna ekleme yapmak iin kullanlr. Eer dosya bulunmazsa oluturulur. Create Yeni dosya oluturmak iin kullanlr. Zaten dosya varsa zerine yazlr. CreateNew Yeni dosya oluturmak iin kullanlr, belirtilen dosya mevcutsa alma zaman hatas verdirir. Open Dosyay amak iin kullanlr. OpenOrCreate Belirtilen dosya varsa alr, yoksa yenisi oluturulur. Truncate Belirtilen dosya alr ve ii tamamen silinir.

[dzenle]FileAccess enumunda bulunan szckler


Read Dosya okumak iin kullanlr. ReadWrite Dosya okunmak ve yazlmak zere alr. Write Dosya sadece yazlmak iin alr.

[dzenle]FileShare enumunda bulunan szckler


Inheritable Dosyann child (yavru) prosesler tarafndan tretilebilmesini salar. None Dosyann ayn anda baka prosesler tarafndan almasn engeller. Read Dosyann ayn anda baka proseslerce de alabilmesini salar. ReadWrite Dosyann ayn anda baka proseslerce de alp, okunup, yazlabilmesini salar. Write Dosyaya ayn anda baka proseslerce yazlabilmesini salar.

[dzenle]FileStream OpenRead(string adres)


Belirtilen dosyay yalnzca okumak iin aar ve dosyaya ilikin FileStream nesnesini dndrr.

[dzenle]StreamReader OpenText(string adres)


Belirtilen dosyay yalnzca text modunda okumak iin aar ve dosyaya ilikin StreamReader nesnesi ni dndrr.

[dzenle]FileStream OpenWrite(string adres)


Belirtilen dosyay yazma modunda aar ve dosyaya ilikin FileStream nesnesini dndrr.

[dzenle]DirectoryInfo snf

DirectoryInfo snf Directory snfnn aksine static olmayan metot ve zellikleri ierir. nce zellikleri bir rnek zerinde grelim:

using System; using System.IO; class DirectoryInfoSinifi { static void Main() { string adres=@"C:\WINDOWS"; DirectoryInfo d=new DirectoryInfo(adres); Console.WriteLine("zellikler: "+d.Attributes); Console.WriteLine("Oluturulma tarihi: "+d.CreationTime); Console.WriteLine("Var m? "+d.Exists); Console.WriteLine("Uzant: "+d.Extension); Console.WriteLine("Tam adres: "+d.FullName); Console.WriteLine("Son eriim zaman: "+d.LastAccessTime); Console.WriteLine("Son deiiklik zaman: "+d.LastWriteTime); Console.WriteLine("Klasr ad: "+d.Name); Console.WriteLine("Bir st klasr: "+d.Parent); Console.WriteLine("Kk dizin: "+d.Root); } }
imdi de DirectoryInfo snfnn metotlarna geelim. Bu metotlarn tamam static deildir. Bu metotlarn almas iin gereken adres bilgisi, kendisine ulalmas iin kullanlan DirectoryInfo nesnesindedir.

[dzenle]void Create()
Klasr oluturur.

[dzenle]DirectoryInfo CreateSubdirectory(string adres)


Belirtilen adreste bir alt dizin oluturur. rnein C:\deneme altnda \deneme2\deneme3 dizini oluturmak iin u kodlar yazarz.

string adres=@"C:\deneme"; DirectoryInfo d=new DirectoryInfo(adres); d.Create(); DirectoryInfo alt=d.CreateSubdirectory("deneme2"); alt.CreateSubdirectory("deneme3");


Grdnz gibi CreateSubdirectory metodu kendisine ulalan nesne iinde parametredeki klasr oluturuyor ve oluturduu klasr de DirectoryInfo nesnesi olarak dndryor.

[dzenle]Delete
ki farkl ar yklenmi versiyonu vardr.

void Delete() void Delete(bool a)

Birincisinde klasr bosa silinir, ikincisinde a true ise klasr, iindeki her eyle silinir.

[dzenle]DirectoryInfo[] GetDirectories()
lgili klasrde bulunan btn dizinleri bir DirectoryInfo dizisinde tutar.

[dzenle]FileInfo[] GetFiles()
lgili klasrde bulunan btn dosyalar bir FileInfo dizisinde tutar.

[dzenle]FileSystemInfo[] GetFileSystemInfos()
lgili klasrdeki btn dosya ve klasrler bir FileSystemInfo dizisinde tutulur.

[dzenle]void MoveTo(string hedef)


lgili dizin, iindeki tm dosya ve klasrlerle beraber hedefe tanr.

[dzenle]void Refresh()
lgili klasrn zelliklerini diskten tekrar ykler. NOT: Btn tama ve kopyalama ilemlerinde kaynak ve hedef ayn srcde olmaldr.

[dzenle]FileInfo snf
nce zellikleri bir rnek zerinde grelim. Kodu yazmadan nce kendiniz C:\WINDOWS klasrnde deneme.txt dosyasn oluturun.

using System; using System.IO; class FileInfoSinifi { static void Main() { string adres=@"C:\WINDOWS\deneme.txt"; FileInfo d=new FileInfo(adres); Console.WriteLine("znitelikler: "+d.Attributes); Console.WriteLine("Oluturulma tarihi: "+d.CreationTime); Console.WriteLine("Var m? "+d.Exists); Console.WriteLine("Uzant: "+d.Extension); Console.WriteLine("Tam adres: "+d.FullName); Console.WriteLine("Son eriim zaman: "+d.LastAccessTime); Console.WriteLine("Son deiiklik zaman: "+d.LastWriteTime); Console.WriteLine("Boyut: "+d.Length); Console.WriteLine("Klasr ad: "+d.Name); Console.WriteLine("Bulunduu klasr: "+d.DirectoryName); } }

imdi metotlara geelim. FileInfo snf File snfndaki AppendText(), Create(), CreateText(), Delete(), Open(), OpenRead(), OpenText() ve OpenWrite() metotlarn ierir. Bunlar tekrar anlatmayacam. File snfnda olmayan metotlarsa;

[dzenle]CopyTo
ki ar yklenmi versiyonu vardr:

FileInfo CopyTo(string hedef) FileInfo CopyTo(string hedef,bool a)


Birincisinde ilgili dosya hedefe kopyalanr. Hedefte ayn adl dosya varsa alma zaman hatas alrsnz. kincisinde a true ise, hedefte ayn adl dosya varsa zerine yazlr.

[dzenle]void MoveTo(string hedef)


lgili dosya hedefe tanr.

[dzenle]void Refresh()
lgili dosyann bilgileri diskten tekrar alnr.

[dzenle]Path snf
Path snf eitli ilemler yapan static ye elemanlara sahiptir. rnek program:

using System; using System.IO; class PathSinifi { static void Main() { string adres=@"C:\dizin\deneme.txt"; Console.WriteLine("Uzant: "+Path.GetExtension(adres)); string yeniAdres=Path.ChangeExtension(adres,"jpg"); Console.WriteLine("Yeni uzant: "+Path.GetExtension(yeniAdres)); string adres2=@"C:\klasr"; Console.WriteLine("Yeni adres: "+Path.Combine(adres,adres2)); Console.WriteLine("Klasr: "+Path.GetDirectoryName(adres)); Console.WriteLine("Dosya ad: "+Path.GetFileName(adres)); Console.WriteLine("Uzantsz dosya ad: "+Path.GetFileNameWithoutExtension(adres)); Console.WriteLine("Tam adres: "+Path.GetFullPath(adres)); Console.WriteLine("Kk dizin: "+Path.GetPathRoot(adres)); Console.WriteLine("Geici dosya ad: "+Path.GetTempFileName()); Console.WriteLine("Geici dosya dizini: "+Path.GetTempPath()); Console.WriteLine("Dosya uzants var m? "+Path.HasExtension(adres)); Console.WriteLine("Alt dizin ayrac: "+Path.AltDirectorySeparatorChar); Console.WriteLine("Dizin ayrac: "+Path.DirectorySeparatorChar);

Console.Write("Geersiz dosya ad karakterleri: "); char[] dizi=Path.GetInvalidFileNameChars(); foreach(char b in dizi) Console.Write(b+" "); Console.Write("\nGeersiz adres karakterleri: "); char[] dizi2=Path.GetInvalidPathChars(); foreach(char b in dizi) Console.Write(b+" "); Console.WriteLine("\nAdres ayrc karakter: "+Path.PathSeparator); Console.WriteLine("Kk dizin ayrac: "+Path.VolumeSeparatorChar); } }

[dzenle]Dosya yazma ve okuma ilemleri


[dzenle]FileStream snf
FileStream snf ile diskteki bir dosya alr. StreamReader ve StreamWriter snflaryla zerinde ilem yaplr. Dosyalar zerinde metin tabanl ve bayt tabanl iler yapabiliriz. Bir FileStream nesnesi ok deiik yollarla oluturulabilir. rnekler:

string adres=@"C:\Program Files\deneme.txt"; FileStream FSnesnesi1=new FileStream(adres,FileMode.OpenOrCreate); FileStream FSnesnesi2=new FileStream(adres,FileMode.OpenOrCreate,FileAccess.Write); FileStream FSnesnesi3=new FileStream(adres,FileMode.OpenOrCreate,FileAccess.Write,FileShare.None) ; FileInfo FInesnesi1=new FileInfo(adres); FileStream FSnesnesi4=FInesnesi1.OpenRead(); FileInfo FInesnesi2=new FileInfo(adres); FileStream FSnesnesi5=FInesnesi2.OpenWrite(); FileInfo FInesnesi3=new FileInfo(adres); FileStream FSnesnesi6=FInesnesi3.Create(); FileInfo FInesnesi4=new FileInfo(adres); FileStream FSnesnesi7=FInesnesi4.Open(FileMode.OpenOrCreate);
Bu nesne yaratmlarndaki FileMode, FileAccess ve FileShare enumlarn nceden grmtk. Dosyayla ilgili ilemimiz bittiinde FileStream snfnn Close() metodu ile FileStream nesnesi tarafn dan tutulan kaynaklar boaltlr ve dosyay baka prosesler kullanabilir hle gelir. Close() metodunun kullanl:

FSnesnesi1.Close();

[dzenle]FileStream snf ile yazma ve okuma


FileStream snfnn Read() ve ReadByte() metotlar dosya akmndan byte dzeyinde veri okumamz salarlar. ReadByte() metodu akmdan okuma yapamad zaman geriye -1 deerini dndrr. ReadByte() metodunun prototipi:

int ReadByte()
Bu metot ile akmdan bir baytlk bilgi okunur ve akmdaki okuma pozisyonu bir artrlr ki tekrar okuma da ayn deer okunmasn. Okunan byte deeri inte dntrlp int olarak tutulur. kinci metodumuz ise:

int Read(byte[] dizi, int baslangic, int adet)


Bu metot ile adet kadar bayt akmdan okunur, okunan bu baytlar dizi dizisine baslangic indeksinden itibaren yerletirilir. Geri dn deeri okunan byte saysdr. imdi komut satr argman olarak ad alnan dosyann ieriini ekrana yazan bir program yazalm:

using System; using System.IO; class DosyaAkimi { static void Main(string[] args) { string adres=args[0]; FileStream fs=new FileStream(adres,FileMode.Open); int OkunanByte; while((OkunanByte=fs.ReadByte())!=-1) Console.Write((char)OkunanByte); } }
imdi de bir dosyaya byte dzeyinde veri yazmak iin kullanlan Write() ve WriteByte() metotlarn inceleyelim. Bir dosya akmna bir byte yazmak iin

void WriteByte(byte veri)


metodu kullanlr. Eer yazma ilemi baarsz olursa alma zaman hatas oluur. Dosya akmna bir bayt dizisi yazdrmak iinse

void Write(byte[] dizi,int baslangic,int adet)


metodu kullanlr. Bu metot ile byte dizisinin baslangic indeksinden itibaren adet kadar eleman akma yazlr. Akmn konum gstericisi yazlan byte kadar telenir. Dosya akmna yazlan veriler dosya sistemindeki dosyaya hemen aktarlmaz. Dosya akm tamponlama mekanizmas ile alt iin belirli bir miktar veri yazlana kadar dosya gncellenmez. Ancak FileStream snfnn Flush() metodunu kullanarak istediimiz anda tamponu boaltp dosyay tampondaki bilgilerle gncelleyebiliriz. imdi bir rnek program yazalm. Programmz kullancnn girdii yazlar (Console.ReadLine() ile) bir txt dosyasna kaydetsin, dosyann ad da komut satr argman olarak verilsin.

using System; using System.IO; class deneme { static void Main(string[] args) { string dosya=args[0];

FileStream d=new FileStream(dosya,FileMode.CreateNew,FileAccess.Write); Console.Write("Dosyann ieriini yazn: "); string icerik=Console.ReadLine(); foreach(char a in icerik) d.WriteByte((byte)a); d.Flush(); } }
FileStream snfnn nemli zellikleri: bool CanRead Akmdan okuma yaplp yaplamayaca renilir. bool CanSeek Akmda konumlandrma yaplp yaplamayaca renilir. bool CanWrite Akma yazma yaplp yaplamayaca renilir. long Position Akmdaki aktif konum bilgisi renilir. long Length Akmn bayt olarak bykl renilir. FileStream snfnn nemli metotlar: void Lock(long pozisyon,long uzunluk) Bu metotla akmn pozisyondan itibaren uzunluk kadar alan baka proseslerin eriimine kapatlr. long Seek(long ofset,SeekOrigin a) Bu metotla akmn konumu SeekOrigin ile belirtilmi konumdan ofset byte kadar telenir. SeekOrigin enumunun ierdii szckler unlardr:

Begin Akmn balang noktas Current Akmn o anda bulunduu nokta End Akmn en son noktas

[dzenle]StreamReader snf
StreamReader snf FileStream snfnn aksine baytlarla deil, metinlerle ilgilenir. Bir StreamReader nesnesinin oluturulma yntemleri:

string dosya=@"C:\deneme\ornek.txt"; FileStream fs=new FileStream(dosya,FileMode.Open); StreamReader sr1=new StreamReader(fs); StreamReader sr2=new StreamReader(dosya); FileInfo fi=new FileInfo(dosya); StreamReader sr3=new StreamReader(fi);
Dier snflarda olduu gibi StreamReader nesneleriyle iimiz bittiinde Close() metodunu kullanarak kaynaklarn iade edilmesi tavsiye edilir. StreamReader snfnn nemli metotlar:

string ReadLine()
Akmdan bir satrlk veriyi okur ve string olarak tutar. Eer veri okunamazsa null deeri tutar. Okunan satrn sonuna "\n" eklenmez.

string ReadToEnd()

Akmdaki verilerin tamamn string olarak tutar. Okuma ilemi aktif konumdan balayacaktr. Eer okuma yaplamazsa boluk tutar.

int Read()
Akmdan bir karakterlik bilgi okunur ve int'e dntrlr. lem baarsz olursa -1 ile geri dner.

int Read(char[] dizi,int indeks,int adet)


Akmdan adet kadar karakteri dizi[indeks] elemanndan itibaren diziye yerletirir. Yerletirilen karakter saysn dndrr.

int Peek()
Akmdan bir karakterlik bilgi okunur ve bu karakterin inte dnm hli ile geri dnlr. lem baarsz olursa -1 ile geri dner. En nemli nokta ise konum gstericisinin yerinin deitirilmemesidir. imdi bir text dosyasnn nasl satr satr okunabileceini grmek iin bir rnek yapalm. imdi bir txt dosyas oluturun ve iine unlar yazn: (ad deneme.txt olsun)

Bu bir metin belgesidir. Bu deneme amal yazlmtr. -------------------Vikikitap


imdi programmz yazalm:

using System; using System.IO; class Deneme { static void Main() { string dosya="deneme.txt"; FileStream fs=new FileStream(dosya,FileMode.Open); StreamReader sr=new StreamReader(fs); string satir; while((satir=sr.ReadLine())!=null) Console.WriteLine(satir); fs.Close(); } }

[dzenle]StreamWriter snf
StreamReader snf ile dosyalardan text tabanl veriler okunabiliyordu. StreamWriter snf ise bunun tam tersini yapar. Yani StreamWriter snf ile dosyalara text tabanl veriler yazlr. Bir StreamWriter nesnesi u yollarla oluturulabilir:

string dosya=@"C:\dosya.txt"; FileStream fs=new FileStream(dosya,FileMode.Open);

StreamWriter sw1=new StreamWriter(fs); StreamWriter sw2=new StreamWriter(dosya); FileInfo fi=new FileInfo(dosya); StreamWriter sw3=fi.CreateText();
StreamReader snfnda olduu gibi StreamWriter snfnda da Close() metoduyla StreamWriter nesnesine ilikin kaynaklar iade edilir. StreamWriter snfnn en nemli metotlar:

void Write(string str)


Bu metotla akma str yazs eklenir. Yaznn sonuna herhangi bir sonlandrc karakter konmaz. Bu metot ile dier btn veri trlerinden veri eklemek mmkndr. rnein: Write(5), Write(true), Write('c')

void WriteLine(string str)


Write metoduyla ayn ii yapar. Tek fark eklenen yaznn sonuna kendisi "\n" stringini koyar. Ayrca Write metodundan farkl olarak WriteLine() metodunu parametresiz kullanabiliriz. Bu durumda akma sadece "\n" eklenir.

void Flush()
Tampondaki bilgilerin boaltlmasn ve dosyann gncellenmesini salar. Ayrca StreamWriter snfnn NewLine zellii ile satr ayrac olan karakterleri belirleyebiliriz. Varsaylan olarak bu karakter "\n" ve "\r"dir. StreamWriter snfnn kullanmna bir rnek verelim. rneimiz kullancnn -Console.ReadLine() ile- girdii yazlar dosyaya kaydetsin. Dosyann ad komut satr argmanyla belirlensin.

using System; using System.IO; class Deneme { static void Main(string[] args) { string dosya=args[0]; FileStream fs=new FileStream(dosya,FileMode.Append,FileAccess.Write); StreamWriter sw=new StreamWriter(fs); Console.Write("Yaznz girin: "); string yazi=Console.ReadLine(); sw.Write(yazi); sw.Flush(); } }

[dzenle]BinaryWriter ve BinaryReader snflar


BinaryWriter ve BinaryReader snflarnn yapt i StreamReader ve StreamWriter snflarnn yapt iin aynsdr. Ancak BinaryWriter ve BinaryReader snflaryla StreamReader ve StreamWriter snflarndan farkl olarak her trde veriyi akma yazdrabiliriz, yani verinin illaki string olma zorunluluu yoktur. Bu snflarda srasyla Write(int), Write(char), Write(char[]), Write(byte) ve ReadByte(), ReadChar(),

ReadUInt32, ReadString() vb. metotlar bulunmaktadr. Bu metotlar btn temel veri trleri iin bildirilmitir. imdi bir rnek program yazalm. Programla nce eitli trlerde verileri bir dosyaya yazalm, sonra bu verileri tekrar okuyalm.

using System; using System.IO; class Deneme { static void Main() { int i=5; decimal d=15.54M; char c='A'; string dosya="deneme.txt"; FileStream fs1=new FileStream(dosya,FileMode.OpenOrCreate); BinaryWriter bw=new BinaryWriter(fs1); bw.Write(i); bw.Write(d); bw.Write(c); bw.Close(); FileStream fs2=new FileStream(dosya,FileMode.Open); BinaryReader br=new BinaryReader(fs2); Console.WriteLine(br.ReadInt32()); Console.WriteLine(br.ReadDecimal()); Console.WriteLine(br.ReadChar()); br.Close(); } }
NOT: BinaryWriter snfyla oluturulan bir dosyay Notepad ile okumaya kalkarsanz anlamsz simgelerle karlarsnz. nk BinaryWriter snf dosyalara text yntemiyle deil, binary yntemle kayt yapar. BinaryReader snf da bu binary kaytlar okur.

[dzenle]Console I/O ilemleri


I/O ilemleri iin gerekli olan snflardan System.IO isim alannda olmayan tek snf Console snfdr. imdiye kadar Console snfn ekrana bir eyler yazmak iin ya da kullancdan girdi almak iin sklkla kullandk. imdi ise Console snfnn daha birok ynlerini greceiz. Konsol I/O ilemleri iin nceden tanmlanm tane standart akm mevcuttur. Bu akmlar TextWriter tr olan Console.Out, Console.Error ve TextReader trnden olan Console.In'dir. Konsol ekranna yazdmz yazlar aslnda TextWriter snfnn metotlar ile olmaktadr. Console.WriteLine ise bizim iin sadece bir araclk grevi yapar. rnein aadaki her iki satr da e grevdedir. kisi de ekrana merhaba yazar.

Console.Out.WriteLine("merhaba"); Console.WriteLine("merhaba");

Yani zetle Out, Console snfna bal bir zelliktir ve geri dn tipi TextWriter'dr ve bu veriyle TextWriter snfnn static olmayan bir metodu olan WriteLine()'a eriiriz. Konsol ekranna yaz yazdrmak iin Console snfnn WriteLine() ve Write() metotlarn kullanrz. Bu ikisi arasndaki tek fark WriteLine'n yaznn sonuna "\n" ekleyip, Write'n eklememesidir. Konsoldan bilgi almak iin Read() ve ReadLine() metotlarn kullanrz. Eer tamponda herhangi bir veri yoksa Read() metodu kullancdan veri girii ister ve girilen stringteki ilk karakteri int olarak tutar. Sonraki Read() metotlar ise o stringteki dier karakterleri tutar. Eer veri okunamazsa -1 deeri tutar. rnek:

Console.Write((char)Console.Read()+" "+(char)Console.Read()+" "+(char)Console.Read());


Bu satrda nce kullancdan veri girii istenir. Diyelim ki kullanc deneme girmi olsun. Bu durumda ekrana

d e n
yazlr. ReadLine() metodu Read() metodunun aksine ekrandan girdileri string olarak alr. Console.In zelliini kullanarak da Read() ve ReadLine() metotlarn arabiliriz. Ayrca Console.Out zelliini kullanarak da Write() ve WriteLine() metotlarn kullanabiliriz. Console.In'den eriebileceimiz yani TextReader snfnn dier metotlar:

int Peek()
Bu metot ile standart girdi akmndan bir karakter okunur ancak bu karakter tampondan silinmez. rnek:

Console.Write((char)Console.In.Peek()+" "+(char)Console.In.Peek()+" "+(char)Console.In.Peek());


Burada kullancnn ekrana deneme yazdn varsayarsak ekrana d

d d yazlacaktr.

int ReadBlock(char[] dizi,int indeks,int adet)


Bu metot ile standart girdi akmndan adet kadar karakter diziye indeks elemanndan itibaren yerletirilir.

string ReadToEnd()
Bu metot ile standart girdi akmndaki btn veriler okunarak tampondan temizlenir. Okunan veriler string nesnesi olarak dndrlr.

[dzenle]Standart akmlarn ynlendirilmesi


C#'ta btn I/O ilemleri akmlar (stream) zerine kuruludur. Standart akmlar baka akmlara ynlendirmek mmkndr. rnek olarak komut satrnda bir program yle altrrsak

programadi > deneme.txt


Bu programn, ekran ktlarn deneme.txt dosyasna yazaca anlamna gelir. Bu da standart kt olan konsolun baka akma ynlendirilmesi anlamna gelir. Komut satrndan

programadi < deneme.txt


Burada da Console.ReadLine() ya da Console.Read() yerine deneme.txt dosyasndaki metin kullanlr. C# programlarmz iinde akmlar ynlendirmek iinse Console snfnn u metotlar kullanlr.

static void SetOut(StreamWriter sw) veya static void SetOut(TextWriter tw) static void SetError(StreamWriter sw) veya static void SetError(TextWriter tw) static void SetIn(StreamReader sr) veya static void SetIn(StreamReader sr)
imdi Console.In akmn SetIn metodu ile bir dosya akmna ynlendirelim. Yani giri klavyeden deil, dosyadan alnsn.

using System; using System.IO; class Deneme { static void Main() { FileStream fs=new FileStream("deneme.txt",FileMode.Open); Console.SetIn(new StreamReader(fs)); Console.WriteLine(Console.ReadLine()); Console.WriteLine(Console.ReadLine()); } }
Program derleyin, ancak altrmadan nce programla ayn klasrde deneme.txt dosyas oluturun ve iine iki satrlk yaz yazn. Ayn ekilde Console.WriteLine() metodu da dosyaya ynlendirilebilir. Tabii ki bunun iin Console.SetOut metodu kullanlmaldr. Programn iindeki hata mesajlarn ise SetError metodu ile bir dosyaya yazdrabiliriz. rnek:

using System; using System.IO; class Deneme { static void Main() { Console.WriteLine("Bu bir denemedir."); FileStream fs1 = new FileStream("deneme.txt", FileMode.Create); TextWriter tw = Console.Out; StreamWriter sw = new StreamWriter(fs1); Console.SetOut(sw); Console.WriteLine("Dosyaya yazma yapyoruz."); Console.SetOut(tw); Console.WriteLine("Merhaba dnya");

sw.Close(); } }
Burada nce ekrana Bu

bir denemedir. yazlyor. Sonra yeni bir FileStream nesnesi oluturuluyor.

Sonra hedefi konsol ekran olan bir TextWriter nesnesi oluturuluyor. Sonra iliii deneme.txt olan bir StreamWriter nesnesi oluturuluyor. Sonra kt birimi deneme.txt olarak deitiriliyor. Sonra ekrana -daha dorusu dosyaya- Dosyaya

yazma yapyoruz. yazdrlyor. Sonra kt birimi yeniden ekran dnya yazdrlyor. En son da sw akmnn kaynaklar boaltlyor.

yaplyor. Sonra ekrana Merhaba

C Sharp Programlama Dili/Temel string ilemleri


Vikikitap, zgr ktphane
< C Sharp Programlama Dili

Konu balklar
[gizle]

1 String snf

o o

1.1 Yeni string oluturma 1.2 String metotlar

2 Yazlar biimlendirme

o o o

2.1 String.Format() ve ToString() metotlaryla biimlendirme 2.2 Tarih saat biimlendirme 2.3 zel biimlendirme oluturma

3 Dzenli ifadeler

o o o o o o

3.1 Dzenli ifadelerin oluturulmas 3.2 Regex snf 3.3 Match snf 3.4 MatchCollection snf 3.5 Dzenli ifadelerin iinden blm seme 3.6 Regex snfnn nemli metotlar

3.6.1 Split() metodu 3.6.2 Replace() metodu

[dzenle]String [dzenle]Yeni

snf

string oluturma

Yeni bir string nesnesi u yollarla oluturulabilir.

string a="deneme";

char[] dizi={'a','b','c','d'}; String b=new String(dizi); String c=new String(dizi,1,2); //dizi[1]'den itibaren 2 eleman stringe atand. String d=new String('x',50); //burada 50 tane x'in yan yana geldii bir string oluuyor. yani d="xxxx..."
[dzenle]String

metotlar

static string Concat(params Array stringler)


stenildii kadar, istenilen trde parametre alr. Ald parametreleri birletirip string olarak tutar.

static int Compare(string a,string b)


a ve b kyaslanr, a bykse pozitif bir say, b bykse negatif bir say, eitlerse 0 dndrr. Byklkkklk mant szlkte nde/sonda gelme mantnn aynsdr. Sonda gelen daha byk saylr. Trke alfabesine uygundur.

static int Compare(string a,string b,bool c)


Birinci metotla ayn ii yapar. Tek fark eer c true ise kyaslamada byk/kk harf ayrm gzetilmez. Eer c false ise birinci metottan fark kalmaz.

static int Compare(string a,int indeks1,string b,int indeks2)


Birinci metotla ayn mantkta alr. Tek fark kyaslamada ilk elemanlarn a[indeks1] ve b[indeks2] saylmasdr. Yani stringlerdeki bu elemanlardan nceki elemanlar yok saylr.

static int Compare(string a,int indeks1,string b,int indeks2,bool c)


c true yaplrsa az nceki metodun byk/kk ayrm gzetmeyeni kullanlm olur.

int CompareTo(string str)


Compare metodunun tek parametre alm ve static olmayan hlidir. Metodu aran veriyle parametre kyaslanr. Metodu arana a, parametreye b dersek

static int Compare(string

a,string b) metodunun yapt iin aynsn yapar.


int IndexOf(string a) int IndexOf(char b)
Kendisini aran string iinde parametredeki veriyi arar. Bulursa bulunduu indeksi tutar. Eer aranan birden fazla karaktere sahipse ilk karakterin indeksini tutar. Eer aranan bulamazsa -1 deeri dndrr. Eer stringin iinde aranandan birden fazla varsa ilk bulunann indeksini dndrr.

int LastIndexOf(string a) int LastIndexOf(char b)


IndexOf metoduyla ayn ii yapar. Tek fark aranann son bulunduu yerin indeksini vermesidir. rnein aranan 'n' karakteri ise ve string "benim antam var" ise 2 deil, 8 dndrr.

int IndexOfAny(char[] a) int LastIndexOfAny(char[] b)

Birincisi a dizisinin herhangi bir elemannn ilk bulunduu indeks ile geri dner. kincisi ise b dizisinin herhangi bir elemannn son bulunduu indeks ile geri dner. char dizisindeki elemanlarn hibiri bulunamazsa -1 ile geri dnlr.

bool StartsWith(string a) bool EndsWith(string b)


Birincisi metodu aran string a ile balyorsa true, dier durumlarda false deeri retir. kincisi metodu aran string b ile bitiyorsa true, dier durumlarda false deeri retir.

string Trim()
metodu aran stringin bandaki ve sonudaki boluklar silinir.

string Trim(params char[] dizi)


metodu aran stringin bandaki ve sonundaki dizi dizisinde bulunan karakterler silinir. rnein string ebebesdefbebe ise ve dizi 'e' ve 'b' elemanlarndan oluuyorsa sdefdeeri dndrlr.

string PadRight(int toplam) string PadRight(int uzunluk,char c)


Birincisinde metodu aran stringin uzunluu toplam olana kadar sana boluk eklenir. kinci metotta ise ayn ilem boluk ile deil c karakteri ile yaplr. rnein c karakterini '.' yaparak bir kitabn iindekiler blmn hazrlayabiliriz. Ayn ilemi stringin soluna yapmak iin

string PadLeft(int toplam) string PadLeft(int uzunluk,char c)


metotlar kullanlr. Bu da saa yasl yazlar yazmak iin uygundur.

string[] Split(params char[] ayirici) string[] Split(params char[] ayirici,int toplam)


Birinci metotta metodu aran string ayirici dizisindeki karakter(ler)e gre paralara ayrlr ve sonu bir string dizisinde tutulur. kincisinde ise bu ilem en fazla toplam kez tekrarlanr. rnek:

string a="Ahmet,Mehmet,Osman,Aye"; string[] b=a.Split(','); Console.WriteLine(b[0]);


Join() metodu ise Split() metodunun tam tersi ekilde iler.

static string Join(string ayirici,string[] yazilar) static string Join(string ayirici,string[] yazilar,int baslangic,int toplam)
Birincisinde yazilar dizisinin elemanlarnn arasna ayirici eklenerek tek bir string hline getirilir. kincisinde ise yazilar[baslangic]'ten itibaren toplam kadar eleman ayirici ile birletirilip tek bir string olarak tutulur.

string ToUpper()
Kendisini aran stringin harflerini byk yapar ve tutar.

string ToLower()

Kendisini aran stringin harflerini kk yapar ve tutar.

string Remove(int indeks,int adet)


Yazdan indeks nolu karakterden itibaren adet kadar karakteri yazdan siler ve oluan bu yeni stringi tutar.

string Insert(int indeks,string str)


Yaznn indeks. elemanndan sonrasna str stringini yerletirir ve tutar.

string Replace(char c1,char c2)


Yazda geen btn c1 karakterlerini c2 olarak deitirir ve tutar.

string Replace(string s1,string s2)


Yazda geen btn s1 yazlarn s2 olarak deitirir ve tutar.

string Substring(int indeks)


Metodu aran stringin indeks. elemanndan sonraki yazy tutar.

string Substring(int indeks,int toplam)


Metodu aran yaznn indeks. elemanndan sonraki toplam karakterlik yazy tutar.

[dzenle]Yazlar

biimlendirme

imdi isterseniz metotlardan bamz kaldralm ve yazlar biimlendirmeye balayalm. Biimlendirme yazlarn ekrana veya baka bir akma istenilene formatta yazlmas olaydr. Ancak ncelikle yazlar zerinde biimlendirme yapabilmek iin ilgili metodun biimlendirmeyi destekliyor olmas gerekir. Console.WriteLine(), String.Format() ve ToString() metotlar biimlendirmeyi destekler. lk olarak Console.WriteLine() metodunu kullanarak yazlarn nasl biimlendirilebileceine bakalm.

Console.WriteLine("{0} numaral atlet {1}. oldu.",no,sira);


Burada ekrana yazlacak yazdaki {0} ifadesi no verisini, {1} ifadesi de sira verisini ifade ediyor. Bu verileri istediimiz kadar artrabiliriz. Metin biimlendirme tasla:

{degisken_no,genislik:format}
eklindedir. Farkndaysanz biz yukarda sadece degisken_no'yu kullandk. Dierleri kullanlmad zaman varsaylan deerleri kullanlr. genislik yaznn karakter cinsinden minimum geniliidir. Eer yaznn bykl genislik deerinden kkse kalan ksmlar bolukla doldurulur. Eer genislik pozitif bir sayysa yaz saa dayal, negatif bir sayysa sola dayal olur. rnek:

int a=54; Console.WriteLine("{0,10} numara",a); Console.WriteLine("{0,-10} numara",a);


Bu kodun konsol ekranndaki kts yle olur.

54

54 numara numara

Dikkat ettiyseniz henz format' kullanmadk. Format kullanmadmz iin imdiye kadar varsaylan deerdeydi.

Console.WriteLine("{0:X}",155);
Burada 155 says ekrana 16'lk say sisteminde yazlr. Yani ekrana 9B yazlr. imdi bu rnei biraz daha gelitirelim:

Console.WriteLine("{0:X5}",155);
Bu kodla ekrana 0009B yazlr. Yani X'in yanndaki say, esas saynn ka haneli olacan belirliyor. Buradaki 5 saysna duyarlklk deeri denir ve her format belirleyicisi iin farkl anlama gelir. Format belirleyiciler, duyarllk deerleri ve aklamalar:

Format belirleyici C veya c D veya d E veya e F veya f G veya g N veya n P veya p R veya r

Format belirleyici aklamas Para birimi Tam say Bilimsel notasyon Gerek saylar (float) E veya F biimlerinden ksa olan Virgl kullanlarak gerek saylar yazlr Yzde Stringe dnen trn tekrar eski tre dnmesini salar On altlk dzende yazar

Duyarllk anlam Ondalk basamaklarn says En az basamak says, soldaki basamaklar 0'la beslenir Ondalk basamak says Ondalk basamak says Ondalk basamak says Ondalk basamak says Ondalk basamak says Yok En az basamak says, soldaki basamaklar 0'la beslenir

X veya x

imdi bunlarla ilgili bir rnek yapalm:

using System; class Formatlama { static void Main() { float f=568.87f; int a=105; Console.WriteLine("{0:C3}",a); Console.WriteLine("{0:D5}",a); Console.WriteLine("{0:E3}",f); Console.WriteLine("{0:F4}",f);

Console.WriteLine("{0:G5}",a); Console.WriteLine("{0:N1}",f); Console.WriteLine("{0:P}",a); Console.WriteLine("{0:X5}",a); } }


Bu programn ekran kts yle olur:

105,000 TL 00105 5,689E+002 568,8700 105 568,9 %10.500,00 00069


NOT: Eer saylarn normal ondalkl ksm duyarllk deerinden uzunsa yuvarlama yaplr.

[dzenle]String.Format()

ve ToString() metotlaryla biimlendirme

String snfnn Format() metodu tpk WriteLine() metodu gibi almaktadr. Tek fark WriteLine() biimlendirdii yazy ekrana yazarken Format() metodu yazy bir string olarak tutar. rnek:

string a=String.Format("{0:C3}",50);
ToString() metodunda ise biimlendirme komutu parametre olarak girilir. Onun dnda Format metodundan fark yoktur. rnek:

string a=50.ToString("0:C3");
[dzenle]Tarih
rnek program:

saat biimlendirme

using System; class TarihZaman { static void Main() { DateTime dt=DateTime.Now; Console.WriteLine("d--> {0:d}",dt); Console.WriteLine("D--> {0:D}",dt); Console.WriteLine(); Console.WriteLine("t--> {0:t}",dt); Console.WriteLine("T--> {0:T}",dt); Console.WriteLine(); Console.WriteLine("f--> {0:f}",dt); Console.WriteLine("F--> {0:F}",dt); Console.WriteLine();

Console.WriteLine("g--> Console.WriteLine("G--> Console.WriteLine(); Console.WriteLine("m--> Console.WriteLine("M--> Console.WriteLine(); Console.WriteLine("r--> Console.WriteLine("R--> Console.WriteLine(); Console.WriteLine("s--> Console.WriteLine(); Console.WriteLine("u--> Console.WriteLine("U--> Console.WriteLine(); Console.WriteLine("y--> Console.WriteLine("Y--> } }

{0:g}",dt); {0:G}",dt); {0:m}",dt); {0:M}",dt); {0:r}",dt); {0:R}",dt); {0:s}",dt); {0:u}",dt); {0:U}",dt); {0:y}",dt); {0:Y}",dt);

Programn ekran kts una benzer olmaldr.

d--> 04.01.2009 D--> 04 Ocak 2009 Pazar t--> 16:25 T--> 16:25:50 f--> 04 Ocak 2009 Pazar 16:25 F--> 04 Ocak 2009 Pazar 16:25:50 g--> 04.01.2009 16:25 G--> 04.01.2009 16:25:50 m--> 04 Ocak M--> 04 Ocak r--> Sun, 04 Jan 2009 16:25:50 GMT R--> Sun, 04 Jan 2009 16:25:50 GMT s--> 2009-01-04T16:25:50 u--> 2009-01-04 16:25:50Z U--> 04 Ocak 2009 Pazar 14:25:50 y--> Ocak 2009

Y--> Ocak 2009


[dzenle]zel

biimlendirme oluturma

Standart biimlendirme komutlarnn yannda baz zel karakterler yardmyla kendi biimlerimizi oluturabiliriz. Bu zel biimlendirici karakterler aada verilmitir:

# Rakam deerleri iin kullanlr. , Byk saylarda binlikleri ayrmak iin kullanlr. . Gerek saylarda ondalkl ksmlar ayrmak iin kullanlr. 0 Yazlacak karakterin bana ya da sonuna 0 ekler. % Yzde ifadelerini belirtmek iin kullanlr. E0, e0, E+0, e+0, E-0, e-0 Saylar bilimsel notasyonda yazmak iin kullanlr.

rnek bir program:

using System; class OzelBicimlendirme { static void Main() { Console.WriteLine("{0:#,###}",12341445); Console.WriteLine("{0:#.##}",31.44425); Console.WriteLine("{0:#,###E+0}",13143212); Console.WriteLine("{0:#%}",0.25); } }
Bu programn ekran kts u gibi olmaldr:

12.341.445 31,44 1.314E+4 25%


[dzenle]Dzenli

ifadeler

Dzenli ifadeler deiken sayda karakterden oluabilecek ancak belirli koullar salayan ifadelerdir. rnein e-posta adreslerini dnebiliriz. Dnyada milyonlarca e-posta adresi olmasna ve farkl sayda karakterden oluabilmesine ramen hepsi kullaniciadi@domainismi.domaintipi dzenindedir. rnein iletisim@microsoft.com bu dzenli ifadeye uymaktadr. C#'taki dzenli ifade ilemleri temel olarak System.Text.RegularExpressions isim alanndaki Regex snf ile yaplmaktadr. Bir karakter dizisinin oluturulan dzenli ifadeye uyup uymadn yine bu isim alannd aki

Match snfyla anlarz. Dzenli ifadeler bal bana bir kitap olabilecek bir konudur. Burada sadece ana hatlar zerinde durulacaktr.

[dzenle]Dzenli

ifadelerin oluturulmas

Bir ifadenin mutlaka istediimiz karakterle balamasn istiyorsak ^ karakterini kullanrz. rnein ^9 dzenli ifadesinin anlam yaznn mutlaka 9 karakteri ile balamas demektir. "9Abc" yazs bu dzene uyarken "f9345" bu dzene uymaz.

Belirli karakter gruplarn iermesi istenen dzenli ifadeler iin \ karakteri kullanlr: \D ifadesi ile yaznn ilgili yerinde rakam olmayan tek bir karakterin bulunmas gerektii belirtilir. \d ifadesi ile yaznn ilgili yerinde 0-9 aras tek bir karakterin bulunmas gerektii belirtilir. \W ifadesi ile yaznn ilgili yerinde alfanumerik olmayan karakterin bulunmas gerektii belirtiliyor. Alfanumerik karakterler a-z, A-Z ve 0-9 aralklarndaki karakterlerdir. \w ifadesi ile yaznn ilgili yerinde bir alfanumerik karakterin bulunmas gerektii belirtiliyor. \S ifadesi ile yaznn ilgili yerinde boluk veya tab karakterleri haricinde bir karakterin olmas gerektii belirtiliyor. \s ifadesi ile yaznn ilgili yerinde yalnzca boluk veya tab karakterlerinden biri bulunaca belirtiliyor.

Bu rendiimiz bilgiler nda 5 ile balayan, ikinci karakteri rakam olmayan, nc karakteri ise boluk olan bir dzenli ifade yle gsterilebilir:

^5\D\s
Tahmin edersiniz ki ayn zamanda burada dzenli ifademizin yalnzca 3 harfli olabilecei belirttik. Yukardaki ^5\D\s ifadesine filtre denilmektedir.

Belirtilen gruptaki karakterlerden bir ya da daha fazlasnn olmasn istiyorsak + iaretini kullanrz. rnein,

\w+
filtresi ilgili yerde bir ya da daha fazla alfanumerik karakterin olabileceini belirtiyor. "123a" bu filtreye uyarken "@asc" bu filreye uymaz. + yerine * kullansaydk arpdan sonraki karakterlerin olup olmayaca serbest braklrd.

Birden fazla karakter grubundan bir ya da birkann ilgili yerde olacan belirtmek iin | (mantksal veya) karakteri kullanlr. rnek:

m|n|s
ifadesinde ilgili yerde m, n ya da s karakterlerinden biri olmaldr. Bu ifadeyi parantez iine alp sonuna + koyarsak bu karakterlerden biri ya da birkann ilgili yerde olacan belirtmi oluruz:

(m|n|s)+

Sabit sayda karakterin olmasn istiyorsak {adet} eklinde belirtiriz. rnek:

\d{3}-\d{5}

filtresine "215-69857" uyarken "54-34567" uymaz.

? karakteri, hangi karakterin sonuna gelmise o karakterden en az sfr en fazla bir tane olaca anlamna gelir. rnek:

\d{3}B?A
Bu filtreye "548A" veya "875BA" uyarken "875BBA" uymaz.

. (nokta) iareti ilgili yerde "\n" dnda bir karakterin bulunabileceini belirtir. rnein

\d{3}.A
filtresine "123sA" ve "8766A" uyar.

\b bir kelimenin belirtilen yazyla sonlanmas gerektiini belirtir. rnek:

\d{3}dr\b
filtresine "123dr" uyarken "123drb" uymaz.

\B ile bir kelimenin banda ya da sonunda bulunmamas gereken karakterler belirtilir. rnek:

\d{3}dr\B
filtresine "123dr" veya "dr123" uymazken "123dr8" uyar.

Keli parantezler kullanarak bir karakter aral belirtebiliriz. rnein ilgili yerde sadece byk harflerin olmasn istiyorsak [A-Z] eklinde, ilgili yerde sadece kk harfler olmasn istiyorsak [a -z] eklinde, ilgili yerde sadece rakamlar olmasn istiyorsak [0-9] eklinde belirtebiliriz. Ayrca snrlar istediimiz ekilde deitirebiliriz. rnein [R-Y] ile ilgili yerde yalnzca R ve Y aras byk harfler olabileceini belirtiriz.

[dzenle]Regex

snf

Regex snf bir dzenli ifadeyi tutar. Bir Regex nesnesi yle oluturulur:

Regex nesne=new Regex(string filtre);


Yani bu yapc metoda yukarda oluturduumuz filtreleri parametre olarak veririz. Regex snfnn Match metodu ise kendisine gnderilen bir yaznn dzenli ifadeye uyup uymadn kontrol eder ve uyan sonular Match snf trnden bir nesne olarak tutar.

[dzenle]Match

snf

Match snfnn NextMatch() metodu bir Match nesnesindeki bir sonraki dzenli ifadeyi dndrr. Yaznn dzenli ifadeye uyup uymadnn kontrol ise Match snfnn Success zellii ile yaplr. Eer dzenli ifadeye uygun bir yap varsa Success zelliinin tuttuu deer true olur.

[dzenle]MatchCollection

snf

MatchCollection snf ile bir yaz ierisinde dzenli ifadeye uyan btn Match nesneleri tutulur. Bir MatchCollection nesnesi yle oluturulur:

MatchCollection mc=Regex.Matches(string yazi,string filtre)

Burada Regex snfnn static Matches metodu kullanlmr. Regex snfnn Matches metodu iki parametre alr. lk parametresi kontrol edilmek istenen yaz, ikincisi de filtredir. Bir MatchCollection nesnesi oluturduktan sonra foreach dngs yardmyla bu kolleksiyondaki btn Match nesnelerine eriebiliriz. Match nesnesine eritikten sonra dzenli ifadeye uyan karakter dizisinin orijinal yazdaki yerini Index zelliiyle ve yaznn kendisini ToString() metoduyla elde edebiliriz. MatchCollection snfnn Count zellii ile dzenli ifadeye uyan alt karakter dizilerinin saysn elde ederiz. Eer Count zelliinin tuttuu deer 0 ise dzenli ifadeye uyan yaz bulunamad demektir. imdi bu teorik bilgileri uygulamaya dkelim. Filtremiz yle olsun:

A\d{3}(a|o)+
Bu filtreyle dzenli ifademizin yle olduunu syleyebiliriz:

lk karakter A olacak. A'dan sonra tane rakam gelecek. rakamdan sonra a ya da o karakterlerinden biri ya da birka gelecek. imdi programmz yazalm. Programmz kullancnn girdii yazdaki filreye uyan ksmlar kontrol etsin:

using System; using System.Text.RegularExpressions; class duzenli { static void Main() { string filtre=@"A\d{3}(a|o)+"; Console.Write("Yaz girin: "); string yazi=Console.ReadLine(); MatchCollection mc=Regex.Matches(yazi,filtre); if(mc.Count==0) { Console.WriteLine("Yazda filreye uyumlu ksm yok!"); return; } foreach(Match bulunan in mc) { Console.WriteLine("Bulunan yer: "+bulunan.Index); Console.WriteLine("Bulunan yaz: "+bulunan.ToString()); } } }
Bu programda kullancnn A123aA657oA456oao girdiini varsayarsak ekran kts u ekilde olur.

Bulunan Bulunan Bulunan Bulunan

yer: 0 yaz: A123a yer: 5 yaz: A657o

Bulunan yer: 10 Bulunan yaz: A456oao


Programdan da anlayacanz zere Index ve ToString() ye elemanlar Match snfna aittir ve static deildir. Bu programmz MatchCollection snfyla yapmtk. imdi ayn program Regex ve Match snflaryla yapalm:

using System; using System.Text.RegularExpressions; class duzenli { static void Main() { string filtre=@"A\d{3}(a|o)+"; Console.Write("Yaz girin: "); string yazi=Console.ReadLine(); Regex nesne=new Regex(filtre); Match a=nesne.Match(yazi); Console.WriteLine(a.Success); Console.WriteLine(a.ToString()); Console.WriteLine(a.Index); Console.WriteLine(a.NextMatch()); } }
Bu programda kullancnn A123aA657oA456oao girdiini varsayarsak ekran kts yle olur.

True A123a 0 A657o


[dzenle]Dzenli

ifadelerin iinden blm seme

Bazen bir yaznn bir dzenli ifadeye uyup uymadnn renilmesi bizim iin yeterli gelmez. Bazen bu uyan yazlarn baz ksmlarn ayr ayr grmek isteyebiliriz. rnek bir program:

using System; using System.Text.RegularExpressions; class gruplama { static void Main() { string filtre=@"asf(\d+)(\w+)"; Console.Write("Yaz girin: "); string yazi=Console.ReadLine(); Regex nesne=new Regex(filtre);

Match a=nesne.Match(yazi); Console.WriteLine("Uyan yaz: "+a.ToString()); Console.WriteLine("Birinci ksm: "+a.Groups[1].ToString()); Console.WriteLine("kinci ksm: "+a.Groups[2].ToString()); } }
Kullancnn asf31321edcve34 girdiini varsayarsak bu program ekrana unlar yazar:

Uyan yaz: asf31321edcve34 Birinci ksm: 31321 kinci ksm: edcve34


Grdnz gibi filtreyi, istediimiz ksm parantez iine alarak paralyoruz, sonra da bu ksmlara Match snfna ait, static olmayan Groups zelliine eklenen indeksleyici ile eriiyoruz, sonra da bu ksmlar ToString() metodu yardmyla ekrana yazdryoruz.

[dzenle]Regex

snfnn nemli metotlar

[dzenle]Split() metodu
Split() metodu bir yazy belirli bir dzenli ifadeye gre paralara ayrr ve btn paralar bir string dizisi olarak tutar. rnek program:

using System; using System.Text.RegularExpressions; class split { static void Main() { string filtre=",+"; string yazi="21,44,,34,,,332,21"; Regex nesne=new Regex(filtre); string[] parcalar=nesne.Split(yazi); foreach(string a in parcalar) Console.WriteLine(a); } }
Bu program ekrana alt alta 21, 44, 34, 332 ve 21 (virgller olmadan) yazar. Filtremiz bir ya da daha fazla yan yana virgldr ve bu vrgllere gre yazmz paralanmtr. Bunu String snfnn Split() metoduyla yapamazdk.

[dzenle]Replace() metodu
Replace() metodu, bir yaznn bir dzenli ifadeye uyan ksmlarn baka bir yazyla deitirmek iin kullanlr. rnek:

using System; using System.Text.RegularExpressions;

class replace { static void Main() { string filtre=@"\d+:\d+"; string yazi="Saati belirtmek iin : iareti kullanlr. rnek: 12:35"; Regex nesne=new Regex(filtre); string degistirilmis=nesne.Replace(yazi,"00:00"); Console.WriteLine(degistirilmis); } }
Bu program ekrana Saati

belirtmek iin : iareti kullanlr. rnek:

00:00 yazar. Bu ekilde stringdeki btn saat bilgilerini deitirebilirdik. Yine bu da String snfndaki
Replace() metodunda olmayan bir zellik.

C Sharp Programlama Dili/Kaltm


Vikikitap, zgr ktphane
< C Sharp Programlama Dili

Diyelim ki elinizde A diye bir snf var. Ancak B diye bir snf daha oluturmanz gerekiyor. Ancak bu B snfnn iinde A snfndaki zellik ve metotlarn da bulunmas gerekiyor. te bu durumda B snfn A snfndan tretmeniz gerekir. Tretme kaltm yoluyla olduu iin A snfnn btn ye elemanlar B snfna adeta kopyalanr. Daha sonra B snfnn kendine zel ye elemanlarn yazabiliriz. .Net ktphanesindeki birok snf birbirlerinden tretilmitir. rnein temel veri trleri dediimiz byte, int, uint, short, float ve bezerlerinin tamam object snfndan tretilmitir. Bu sayede normalde object snfnda bulunan ToString() metodunu bu yap trnden nesnelerde de kullanabilirsiniz. Snflar tretilebilmesine ramen yaplar tretilemez. Ancak bir snfn tretilmiinden yap oluturulabilir. C#'ta tretme yle yaplr:

class A { ... } class B:A { ... }


Burada B snf A snfndan tretilmitir ve artk B snf A snfndaki btn ye elemanlar da ierir.
Konu balklar
[gizle]

1 protected eriim belirleyicisi 2 Yapc metotlar ve kaltm 3 oklu tretmeler 4 sim saklama 5 Ana ve yavru snf nesneleri 6 object snf 7 Sanal metotlar 8 zet snf ve ye elemanlar

o o o

8.1 zet snflar 8.2 zet metotlar 8.3 zet zellikler

9 sealed anahtar szc 10 Kaltmla ilgili son notlar

[dzenle]protected

eriim belirleyicisi

imdiye kadar public ve private eriim belirleyicilerini grmtk. imdi ise yeni bir eriim belirleyicisi olan protected' greceiz. Normalde bir snf trettiimizde tretilmi snfn iinden ana snfta private olarak belirtilmi ye elemanlara eriemeyiz. Ancak bu, private ye elemanlarn tretilmedii anlamna gelmez. rnein:

using System; class A { static private int Ozellik; } class B:A { static void Main() { Console.WriteLine(Ozellik); } }
Burada B snfndan Ozellik zelliine eriilemez. Ancak halen Ozellik zellii B snfnda vardr (kopyalanmtr). Eer bu programda private yerine protected' kullansaydk Ozellik zelliine eriebilirdik. Yani protected eriim belirleyicisi ile belirtilen ye elemanlar tretilmi snfn iinden kullanlabilirler. Ancak halen dier snflarn eriimine kapaldrlar. Eer ortada bir tretme sz konusu deilse protected eriim belirleyicisinin private'ten fark kalmaz. NOT: Eer tretilen bir metottan bir private ye elemana eriiliyorsa bu durumda bir engelleme gelmez. Bu da az nce sylediimiz "Private eriim belirleyici tretilmeye engel deildir." tezini dorular. rnek:

using System; class A { static private int Ozellik; static public void metot() { Console.WriteLine(Ozellik); } } class B:A { static void Main() { metot(); } }
Bu program herhangi bir hata vermez.

[dzenle]Yapc

metotlar ve kaltm

C#'ta yapc metotlarn tretimiyle ilgili u kurallar geerlidir: 1. C#'ta yapc metotlar fiziksel olarak tretilmez. 2. Yavru snf trnden bir nesne yaratldnda nce ana snfn parametre almayan yapc metodu, ardndan yavru snftaki imzaya uyan yapc metot altrlr. 3. Yavru snf trnden nesne yaratmnda daima yavru snfn imzaya uyan bir yapc metodu olmas gerekir. 4. Yavru snf trnden nesne yaratmlarnda, ana snfn parametre almayan yapc metodu yavru snfn ye elemanlaryla ilem yapar. 5. Yavru snf trnden nesne yaratmnda, yavru snftaki ilgili (imzas uygun) yapc metoda base taks eklenmise ana snfn parametre almayan yapc metodu altrlmaz. (base taksn birazdan greceiz) imdi bu kurallar rneklendirelim:

using System; class ana { public ana() { Console.WriteLine("ana snfnn parametre almayan yapc metodu"); } } class yavru:ana {

public yavru(int a) { Console.WriteLine("yavru snfnn parametre alan yapc metodu. alnan parametre: "+a); } } class esas { static void Main() { yavru y=new yavru(5); } }
Bu programda ekrana alt alta ana

snfnn parametre almayan yapc

metodu ve yavru snfnn parametre alan yapc metodu. alnan parametre: 5 yazacaktr. Bu ikinci kuraln rneklendirilmesiydi. imdi nc kural rneklendirelim:
using System; class ana { public ana() { Console.WriteLine("ana snfnn parametre almayan yapc metodu"); } } class yavru:ana{} class esas { static void Main() { yavru y=new yavru(); } }
Bu program hata vermez. nk snflar konusunda rendiimiz zere bir snfta hi yapc metot olmad durumlarda varsaylan yapc metot oluturulur. Varsaylan yapc metot parametre almaz ve hibir ey yapmaz. Bu rnekte y nesnesini yaratrken parametre verseydik yukarda bahsettiimiz nc kural ihlal edilmi olacakt ve dolaysyla programmz hata verecekti. imdi drdnc kural rneklendirelim:

using System; class ana { public int ozellik; public ana() { ozellik=5;

} } class yavru:ana{} class esas { static void Main() { yavru y=new yavru(); Console.WriteLine(y.ozellik); } }
Bu rnekte ekrana 5 yazlacaktr. Aslna bakarsanz drdnc kuraln tersinin olmas imkansz. nk zaten ortada ana tipinden bir nesne yok, o yzden ana snfnn parametre almayan yapc metodunun kendi snfnn ye elemanlaryla almas bu rnekte imkansz. Ancak yine de fiziksel olarak bir snfta olmayan bir yapc metodun o snfn ye elemanlaryla almas ilgin. imdi baka bir rnek yapalm:

using System; class ana { public ana(int a){} } class yavru:ana{} class esas { static void Main() { yavru y=new yavru(); } }
Bu program hata verir. nk yukarda saydmz ikinci kural ihlal etmektedir. nk ana snfta parametre almayan bir yapc metot yoktur. Ana snfta bir yapc metot tanmland iin varsaylan yapc metot oluturulmamtr. imdi beinci kural rneklendirelim:

using System; class A { public int Ozellik1; public int Ozellik2; public A() { Console.WriteLine("Deneme"), } public A(int ozellik1,int ozellik2) { Ozellik1=ozellik1; Ozellik2=ozellik2;

} } class B:A { public int Ozellik3; public int Ozellik4; public B(int ozellik3,int ozellik4,int ozellik1,int ozellik2):base(ozellik1,ozellik2) { Ozellik3=ozellik3; Ozellik4=ozellik4; } } class esas { static void Main() { B b=new B(3,4,1,2); Console.WriteLine(b.Ozellik1+" "+b.Ozellik2+" "+b.Ozellik3+" "+b.Ozellik4); } }
Bu program ekrana 1

2 3 4 yazar. Bu rnekte base anahtar szc ana snftaki yapc metodu

temsil etmektedir. rneimizde yavru snfn yapc metodu 4 parametre almakta, bu ald parametrelerin ikisini kendi blounda kullanmakta kalan iki parametreyi de ana snfn imzas uygun yapc metoduna gndermektedir. Ana snfn imzas uygun yapc metodu altnda yavru snfn ye elemanlaryla ilem yapacaktr. Asl konumuza gelecek olursak bu rnekte yavru snfn bir yapc metoduna eklenen base taks ile ana snfn bir yapc metodunu altrdmz iin yavru snftaki base taks eklenmi ilgili yapc meto du altracak ekilde yavru snf trnden bir nesne yaratldnda ana snfn parametre almayan yapc metodu altrlmayacaktr. NOT: base anahtar szc bu ekilde yalnzca yapc metotlarla kullanlabilir. Yani base anahtar szcn yalnzca yavru snftaki yapc metoda ekleyebiliriz ve base anahtar szcnn ana snfta var olan bir yapc metodu belirtmesi gerekir.

[dzenle]oklu

tretmeler

Snflar tpk nine, anne, ocuk yapsnda olduu gibi ard arda tretilebilir. Yani rnein B snf A snfnda tretilip C snf da B snfndan tretilebilir. Bu durumda C snf trnden bir nesne yarattmzda eer C snfnn ilgili yapc metoduna base taksn eklememisek nce A, sonra B, sonra da C snfnn yapc metotlar altrlr. Yani gidiat anadan yavruya dorudur. Ayrca tahmin edebileceiniz gibi C snf hem A'nn hem de B'nin btn ye elemanlarna sahip olur. rnek:

using System; class A {

public A() { Console.WriteLine("A snf"); } } class B:A { public B() { Console.WriteLine("B snf"); } } class C:B { public C() { Console.WriteLine("C snf"); } static void Main() { C nesne=new C(); } }
Bu program ekrana alt alta A

snf, B snf ve C snf yazacaktr. Bu rnekte base

anahtar szcnn kullanm ise yledir:

using System; class A { public int OzellikA; public A(int a) { OzellikA=a; } } class B:A { public int OzellikB; public B(int b,int a):base(a) { OzellikB=b; } } class C:B { public int OzellikC; public C(int c,int b,int a):base(b,a) {

OzellikC=c; } static void Main() { C nesne=new C(12,56,23); Console.WriteLine(nesne.OzellikA+" "+nesne.OzellikB+" "+nesne.OzellikC); } }


Grdnz gibi base anahtar szc kendisinin bir stndeki snfn yapc metoduna parametre gnderiyor ancak tabii ki ilemler alt snftaki ye elemanlar iin yaplyor. Bu durumda -hangi snf trnden nesne yaratrsak yaratalm- hibir snfn parametre almayan yapc metodu altrlmayacaktr (tabii ki nesne yaratrken gerekli parametreleri verdiimiz mddete). Bu rnei yle deitirirsek program hata verir:

using System; class A { public int OzellikA; public A(int a) { OzellikA=a; } } class B:A { public int OzellikB; public B(int b) { OzellikB=b; } } class C:B { public int OzellikC; public C(int c,int b):base(b) { OzellikC=c; } static void Main() { C nesne=new C(12,56); Console.WriteLine(nesne.OzellikA+" "+nesne.OzellikB+" "+nesne.OzellikC); } }

Grdnz gibi bu rnekte B snfnn yapc metodundaki base taks kaldrlm ve gerekli dzenlemeler yaplm. Bu rnekte B snfnn yapc metodu altrld iin ve B snfnn sz konusu yapc metodunda base taks olmad iin B snfna gre ana snfn (bu durumda A snf oluyor) parametre almayan yapc metodu altrlmaya allmtr. A snfnn parametre almayan yapc metodu olmad iin program hata vermitir. Yani ana snfn parametre almayan yapc metodu, tam olarak yavru snf tipinden nesne yaratlmasa da, sadece yavru snfn base taks almayan yapc metodunun altrlmas durumunda da alr.

[dzenle]sim

saklama

Muhtemelen unu merak etmisinizdir: yavru snfta ana snftakiyle ayn isi mli bir ye eleman varsa ne olacak? te bu durumda ana snftaki ye eleman gizlenir ve normal yntemlerle eriilemez. Buna isim saklama denir. rnek:

using System; class A { public int a=10; } class B:A { public int a=20; static void Main() { B nesne=new B(); Console.WriteLine(nesne.a); } }
Bu programda ekrana 20 yazlr yani deeri 20 olan a zellii, deeri 10 olan a zelliini gizlemitir. Ancak derleyici bu programda bizim isim gizlemeyi bilinsiz olarak yaptmz dnr ve uyar verir (hata vermez). Byle bir durumda isim gizlemeyi aka belirtmeliyiz. Bylelikle hem programmzdaki muhtemel gzden kamalar hem de derleyicinin uyar vermesini nleriz. sim gizlemeyi aka belirtmek iin new anahtar szcn kullanrz. Yukardaki program yle yazarsak derleyici uyar vermez:

using System; class A { public int a=10; } class B:A { public new int a=20; static void Main() { B nesne=new B();

Console.WriteLine(nesne.a); } }
Peki gizlediimiz ye elemana eriebilir miyiz? Cevabmz evet. Bunun iin base anahtar szcn kullanrz. rnek:

using System; class A { public int a=10; } class B:A { public new int a=20; int Metot() { return base.a; } static void Main() { B nesne=new B(); Console.WriteLine(nesne.Metot()); } }
Burada ekrana 10 yazlr. base anahtar szc static metotlarn iinde kullanlamaz.

[dzenle]Ana

ve yavru snf nesneleri

C# tr gvenliine maksimum derecede nem vermektedir. Bu yzden, eer zel tr dnm operatrleri bildirilmemise farkl snf trlerinden nesneler birbirlerine atanamaz. Ancak treyen snflarda bu kural delinir. Ana snf trnden nesnelere yavru snf trnden nesneler atanabilir. rnein C#'taki temel veri trlerinin object snfndan tretildiini sylemitik. Bu sayede bir object nesnesine her trden veri atanabilir. rnek bir program:

using System; class A { } class B:A { } class MainMetodu { static void Main() { A nesne1=new A(); B nesne2=new B();

nesne1=nesne2; } }
Bu programda gzden karmamamz gereken nokta nesne1 zerinden B snfnn kendine zg ye elemanlarna eriemeyeceimizdir. Bu ekilde ana snf trnden bir nesnenin kullanlabildii her yerde yavru snf trnden bir nesneyi de kullanabiliriz. rnein bu rneimizi dnecek olursak bir metodun parametresi A tipinden ise bu metoda parametre olarak B tipinden bir nesneyi de verebiliriz. nk her B nesnesi A nesnesinin tad btn ye elemanlar tar. Bunu bilinsiz tr dnmne benzetebiliriz.

[dzenle]object

snf

imdiye kadar btn temel veri trlerinin object snfndan trediini sylemitim. Asl bombay imdi patlatyorum. Btn snflar gizlice object snfndan trer. Bunu kantlamak iin u program yazn:

using System; class A { } class Ana { static void Main() { A nesne=new A(); Console.WriteLine(nesne.ToString()); } }
ToString() metodu normalde object snfna aittir. Ancak btn snf nesneleriyle kullanlabilir. Bu programda ekrana nesnenin tr olan A yazlr. Baka bir rnek:

using System; class A { } class Ana { static void Main() { A nesne=new A(); object a=nesne; } }
Yine bu program da son derece hataszdr.

[dzenle]Sanal

metotlar

Sanal metotlar ana snf iinde bildirilmi ve yavru snf iinde tekrar bildirilen metotlardr. imdilik bunun ad isim saklamadan baka bir ey deildir. Ancak baz anahtar szckler ekleyerek bunun klasik bir isim saklama ileminden farkl olmasn salayacaz. imdi klasik yle bir program yazalm:

using System; class A { public void Metot() { Console.WriteLine("A snf"); } } class B:A { public void Metot() { Console.WriteLine("B snf"); } static void Main() { A nesneA=new A(); B nesneB=new B(); nesneA=nesneB; nesneA.Metot(); } }
Bu program ekrana A

snf yazar. nk nesneA nesnesi A snf trndendir ve bu nesne zerinden

Metot() metoduna eriilirse A snfna ait Metot() metodu altrlr. imdi byle bir durumda B snfna ait Metot() metodunun altrlmasn salayacaz.

using System; class A { virtual public void Metot() { Console.WriteLine("A snf"); } } class B:A { override public void Metot() { Console.WriteLine("B snf"); } static void Main() { A nesneA=new A();

B nesneB=new B(); nesneA=nesneB; nesneA.Metot(); } }


Bu program ekrana B

snf yazacaktr. Dikkat ettiyseniz bu programn ncekinden tek fark A snfna

ait metodun bana virtual anahtar szcnn getirilmesi ve B snfna ait metodun bana da override anahtar szcnn getirilmesi. Ana snftaki virtual anahtar szcyle ana snfa ait metodun bir sanal metot olmasn, yavru snftaki override anahtar szcyle de ana snfa ait ayn adl sanal metodun grmezden gelinmesini saladk. Bu sayede NesneA nesnesinin gizli trne ait metot altrld. Benzer mantkla dnecek olursak object

a='r'; gibi bir ifadede a nesnesinin gizli trnn char olduunu

syleyebiliriz. Bu konu hakknda bilmeniz gereken dier eyler:

Farkndaysanz burada bir nesnenin farkl trden bir nesne gibi davranmas sz konusudur. Programlama jargonunda bunun ad ok biimliliktir (polimorfizm).

Eer ana snftaki metot virtual olarak bildirilmeseydi ve yavru snftaki metot override edilseydi programmz hata verip derlenmezdi.

Eer yavru snftaki metot override olarak bildirilmeseydi ana snftaki metot altrlrd (program hata vermezdi).

Yavru snftaki override olarak belirtilen metotla ana snftaki virtual olarak bildirilen metot ayn isimli ve imzalar da ayn olmaldr.

static metotlar virtual olarak bildirilemez. imdi rneimizi biraz gelitirelim:

using System; class A { virtual public void Metot() { Console.WriteLine("A snf"); } } class B:A { override public void Metot() { Console.WriteLine("B snf"); } } class C:B { public void Metot() { Console.WriteLine("C snf"); }

static void Main() { A nesneA=new A(); C nesneC=new C(); nesneA=nesneC; nesneA.Metot(); } }


Bu program ekrana B

snf yazar. nk C snfna ait metot override edilmedii iin C'den nce

gelen treme zincirindeki son override edilen metot altrlacaktr. imdi baka bir rnek yapalm:

using System; class A { virtual public void Metot() { Console.WriteLine("A snf"); } } class B:A { override public void Metot() { Console.WriteLine("B snf"); } } class C:B { override public void Metot() { Console.WriteLine("C snf"); } } class D:C { public new void Metot() { Console.WriteLine("D snf"); } } class E:D { public new void Metot() { Console.WriteLine("E snf"); } } class F

{ static void Main() { A a=new A(); E e=new E(); a=e; a.Metot(); } }


Bu rnekte ekrana C

snf yazlacaktr. override anahtar szc zaten bilinli bir isim gizleme

yapldn belirtir. Bu yzden override olarak belirtilen bir ye eleman tekrar new olarak belirtmek hataldr. Ayrca bir treme zincirindeki override dngs sondan delinebilir ama ortadan delinemez. nk ortadan delinmeye alldnda normal bir ye eleman override etmemiz gerekir ki bunun yasak olduunu daha nce sylemitik.

[dzenle]zet [dzenle]zet

snf ve ye elemanlar
snflar

Bazen bir ana snfn tek bana bir ilevi olmayabilir. Ana snfn tek grevi yavru snflara ait baz ortak ye elemanlar barndrmak olabilir ve ana snf trnden nesne yaratlmasn engellemek isteyebiliriz. te bu gibi durumlarda ana snf zet snf olarak bildirilir. zet snflar bildirmek iin szc kullanlr. rnek:

abstract anahtar

using System; abstract class A { public string Metot() { return "Deneme"; } } class B:A { static void Main() { B nesne1=new B(); Console.WriteLine(nesne1.Metot()); //A nesne2=new A(); //Yukardaki satr olsayd program hata verirdi. } }
[dzenle]zet

metotlar

Metotlar da, tpk snflar gibi zet olarak bildirilebilir. zet metotlar her yavru snfta bulunmas gereken, ancak ierii bu yavru snf tarafndan belirlenen metotlar oluturmak iin kullanlr. Bu sayede programcnn bu ye elemanlar unutarak es gemesi engellenir. rnek bir zet metot yaratm:

abstract public void Metot();


Grdnz gibi normal metot yaratm satrnn bana bir de abstract anahtar szc ekleniyor. Metodun blou yok, dolaysyla da satr ; iareti ile sonlandrlyor. zet metotlarla ilgili bilmeniz gerekenler:

zet metotlar yalnzca zet snflarn iinde bildirilebilir. Ana snfn iinde bildirilen zet metodu mutlaka, o snftan treyen yavru snflar iinde override etmeliyiz.

zet metotlar isel olarak zaten sanal olduklar iin tekrar virtual olarak bildirmek hataldr. Elbette ki zet bir snf zet olmayan metot ierebilir. zet metotlar private olarak bildirilemez. Ya public ya da protected olmaldrlar. static metotlar zet olarak bildirilemez. Ayn ekilde zet metot bildiriminde virtual ve override anahtar szckleri kullanlamaz.

[dzenle]zet

zellikler

zet zellikler, zet metotlarn tad btn zellikleri tarlar. Bunlara ek olarak unlar sayabiliriz:

Yalnzca sahte zellikler zet olarak bildirilebilir. Ana snftaki zet sahte zellii override eden yavru snftaki zelliin set-get durumu ana snftaki zet zellikle ayn olmaldr. Yani eer zet zellikte sadece get blou varsa bu zellii override eden zelliin de sadece get blou olmaldr. Ayn durum set blou iin de geerlidir. Benzer ekilde zet zellikte hem set hem de get varsa override zellikte de bu ikisi olmaldr. rnek:

using System; abstract class A { abstract public int ozellik { set; get; } } class B:A { override public int ozellik { get{return 100;} set{Console.WriteLine("Bu bir denemedir");} } static void Main() {

B nesne=new B(); Console.WriteLine(nesne.ozellik); nesne.ozellik=200; } }


Grdnz gibi zet sahte zelliin set ve get bloklar ayr olarak yazlmyor. set ve/veya get szcklerinin sonuna ; iareti koyuluyor. NOT: abstract, virtual ve override ye elemanlar private olamaz. NOT: Daha nce sanal metotlar grmtk. Sanal sahte zellikler de olabilir. rnek:

using System; class A { virtual public int ozellik { set{} get{return 12;} } } class B:A { override public int ozellik { get{return 100;} set{Console.WriteLine("Bu bir denemedir");} } static void Main() { B nesne=new B(); A nesne2=new A(); nesne2=nesne; Console.WriteLine(nesne2.ozellik); nesne2.ozellik=200; } }
Bu program alt alta 100 ve Bu

bir denemedir yazacaktr.

[dzenle]sealed

anahtar szc

Bazen bir snftan tretilme yaplamamasn isteyebiliriz. te bu gibi durumlarda sealed anahtar szcn kullanabiliriz. rnek:

sealed class Sinif { ... }

Bir sealed snf yukardaki gibi bildirilir. Bu snf tretilemez. NOT: abstract (zet) snflar sealed olarak iaretlenemez. NOT: sealed snflara ek olarak static snflar ve yaplar da tretilmeyi desteklemez.

[dzenle]Kaltmla

ilgili son notlar

Genel kural olarak yavru snftaki ana snftan devralnan elemanlar, ana snftan devralnan elemanlar; yavru snfta isim gizleme yoluyla yeniden yazlan veya ana snfta bulunmayp yavru snfta yazlan elemanlar yavru snftaki isim gizleyen elemanlar kullanma eilimindedir. Bu durumlar rneklendirelim:

using System; class A { public void Metot1() { Metot2(); } public void Metot2() { Console.WriteLine("A snf"); } } class B:A { public new void Metot2() { Console.WriteLine("B snf"); } } class Ana { static void Main() { B b=new B(); b.Metot1(); } }
Bu programda ekrana A snf yazlr.

using System; class A { public void Metot1() { Metot2(); } public void Metot2()

{ Console.WriteLine("A snf"); } } class B:A { public new void Metot1() { Metot2(); } public new void Metot2() { Console.WriteLine("B snf"); } } class Ana { static void Main() { B b=new B(); b.Metot1(); } }
Bu programda da ekrana B

snf yazlacaktr. stersek bu

ncelikleri virtual ve override anahtar szckleriyle deitirebiliriz. imdi birinci rnei yle deitirelim:

using System; class A { public void Metot1() { Metot2(); } virtual public void Metot2() { Console.WriteLine("A snf"); } } class B:A { override public void Metot2() { Console.WriteLine("B snf"); } } class Ana

{ static void Main() { B b=new B(); b.Metot1(); } }


Bu rnekte ekrana B

snf yazlr. kinci rnekteki durumu zmek iin base anahtar szc

kullanlabilir. Ancak onu rnekleme gereksinimi grmyorum. nk daha nce grmtk. zet gemek gerekirse ana snftan devralnan elemanlarn da isim gizleyen elemanlar kullanmasn istiyorsak ana snftaki eleman virtual, yavru snftaki eleman override olarak belirtiriz. Eer oklu tretme sz konusuysa anne snfta override edilmi eleman torun snfta tekrar override ederek nine snftan devralnan bir elemann torun snftaki isim gizleyen elemanlar kullanmasn salayabiliriz. Eer torun snftaki eleman override etmezsek torun snftaki nine snftan devralnan elemanlar anne snfn elemann kullanacaktr.

C Sharp Programlama Dili/Arayzler


Vikikitap, zgr ktphane
< C Sharp Programlama Dili

sterseniz imdi geen blmn son konularn biraz hatrlayalm. Geen blmde sanal metot ve sanal sahte zellikleri grmtk. Bu sayede bir nesnenin kendi tryle deil, gizli tryle ilem yaplmasn salamtk. Geen blmde grdmz dier nemli ey ise zet metot ve zet sahte zelliklerd i. zet metot ve zet sahte zellikler ana snf iinde bildiriliyordu, ierikleri yoktu ve bu snflardan treyen snflar da bu metot ve sahte zellikleri iermek zorundayd. Yani dier bir deyile ana snftaki zet ye elemanlar yavru snflara unlar diyordu: "Bizi iermek zorundasnz, ancak ieriimizi kendiniz yazacaksnz". Yani zet ye elemanlar klavuza benzetebiliriz. Klavuz bir iin nasl yaplacan ana hatlaryla anlatr, ancak bu ii asl yapan klavuzu okuyan kiidir. imdi yle bir snf dnn ki sadece zet ye elemanlardan olusun. Yani bu snfn ilevsel olarak hibir faydas yok. Sadece kendinden treyen snflara klavuzluk yapyor. te, arayzlere snflarn sadece zet ye eleman ierebilenleri diyebiliriz.
Konu balklar
[gizle]

1 Arayz bildirimi 2 Arayzlerin uygulanmas 3 Arayz nesneleri 4 Ak arayz uygulama 5 rnekler

[dzenle]Arayz

bildirimi

Arayzler interface anahtar szcyle bildirilir. Bir arayzde zellik, metot, indeksleyici, temsilci ve olay bildirilebilir. Temsilci ve olaylar ileride greceiz.

Arayz isimleri geleneksel olarak I harfi ile balar, ancak zorunlu deildir. Arayz elemanlarn static olarak bildiremeyiz. Arayz elemanlar isel olarak zaten publictir. Tekrar bir eriim belirleyici kullanmak hataldr. Arayzler sahte olmayan zellik ieremez. Arayzlerde yapc ve ykc metot olmaz.

imdi iki metodu, bir sahte zellii ve bir indeksleyicisi olan bir arayz yazalm:

interface IArayuz { int Metot1(); int Metot2(); int sahteozellik { set; get; } int this[int indeks] { get; } }
Bu arayzde parmak basmamz gereken nemli bir nokta var. Bu arayz kullanan snftaki indeksleyicinin sadece get blou olabilir veya hem get hem de set blou olabilir. Yani indesleyicilerdeki durum sahte zelliklerden biraz farkldr. Arayz kullanan snftaki indeksleyici en az arayzdeki set-get durumuna sahip olmaldr.

[dzenle]Arayzlerin

uygulanmas

Arayzlerin uygulanmas snf tretmeyle ayn ekilde yaplr. rnek:

class A:IArayuz { //IArayuz arayzndeki btn elemanlar iermeli. }


Bir snf birden fazla arayz kullanabilir. (Bu snf tretmede yoktu). rnek:

class A:Arayuz1,Arayuz2 {

//Hem Arayuz1 hem de Arayuz2 arayzndeki btn elemanlar iermeli. }



Tabii ki arayz kullanan snfta sadece arayzdeki elemanlar bulunur diye bir kural yoktur. Arayzler de snf tretmeyle ayn ekilde birbirlerinden tretilebilir. Bu durumda yavru arayz ana arayzn tad btn elemanlar tar.

Snflardan farkl olarak arayzleri birden fazla arayzden tretebiliriz. rnek:

interface Arayuz1 { int Metot1(); } interface Arayuz2 { string Metot2(); } interface Arayuz3:Arayuz1,Arayuz2 { double Metot4(); }
Burada Arayuz3' kullanan bir snf her metodu da iermelidir.

Tpk snflardaki gibi new anahtar szcn kullanarak isim gizleme yapabiliriz. rnek:

interface Arayuz1 { int Metot1(); } interface Arayuz2:Arayuz1 { new int Metot1(); }


Burada aklnza yle bir sorunun gelmesi doaldr: Arayuz2'yi kullanan bir snfta Metot1()'in bildirimi yapldnda geerli bir bildirim olur mu? Bunun cevab hayrdr. Arayuz2'nin Arayuz1'e ait metodu gizlemesi sonucu deitirmez. Bu sorunu halletmek iin snfmz yle yazabiliriz.

class deneme:Arayuz2 { int Arayuz1.Metot1() { ... } int Arayuz2.Metot1() { ... }

}
Burada hem Arayuz1'in hem de Arayuz2'nin isteklerini yerine getirdik. Ancak unu hatrlatmak isterim: eer snfmz Arayuz2 arayzn kullanmasayd programmz hata verirdi.

[dzenle]Arayz

nesneleri

Kulaa biraz itici gelse de bir arayz trnden nesne oluturulabilir. Arayz nesneleriyle ilgili bilmeniz gereken en nemli ey udur: Tpk tretmedeki gibi bir arayz nesnesine o arayz kullanan snf trnden nesne atanabilir. Bu duru mda o arayz nesnesinin gizli tr o snf olur ve o snfa ait ye elemana arayz nesnesi zerinden eriilebilir. rnek:

using System; interface arayuz { int Metot(); } class A:arayuz { public int Metot() {return 0;} static void Main() { arayuz a; A s=new A(); a=s; Console.WriteLine(a.Metot()); } }
Grdnz gibi arayz nesneleri olutururken new anahtar szcn kullanmyoruz. NOT: Herhangi bir arayzdeki ye elemanlar snfa public, static deil ve doru geri dn tipinde geirilmelidir.

[dzenle]Ak

arayz uygulama

C# dilinde var olan arayzleri uygulamann bir yolu daha vardr. Buna ak arayz uygulama denir. Bunun avantajlar unlardr:

Ak arayz uygulama yntemiyle istenirse snfa ait baz ye elemanlara eriimi snf nesnelerine kapatrken, ayn ye elemanlara arayz nesnesiyle eriimi mmkn klabiliriz.

Bir snfa birden fazla arayz uygulandnda eer arayzlerde ayn isimli ye elemanlar varsa isim akmasnn nne geebiliriz. rnek program:

using System; interface arayuz

{ void Metot(); } class sinif:arayuz { void arayuz.Metot() { Console.WriteLine("Deneme"); } } class mainMetodu { static void Main() { sinif nesne=new sinif(); ((arayuz)nesne).Metot(); } }
Burada sinif trnden olan nesne arayuz trne dntrld ve arayuz nesnesiyle Metot() metoduna eriildi. Direkt nesne zerinden eriilemezdi. Ayn program yle de yazabilirdik:

using System; interface arayuz { void Metot(); } class sinif:arayuz { void arayuz.Metot() { Console.WriteLine("Deneme"); } } class mainMetodu { static void Main() { arayuz nesne=new sinif(); nesne.Metot(); } }
[dzenle]rnekler
imdi arayzlerle ilgili rendiimiz bilgileri pekitirebileceimiz karmak bir rnek yapalm.

using System; using System.Collections;

class Koleksiyon:IEnumerable { int[] Dizi; public Koleksiyon(int[] dizi) { this.Dizi=dizi; } IEnumerator IEnumerable.GetEnumerator() { return new ENumaralandrma(this); } class ENumaralandrma:IEnumerator { int indeks; Koleksiyon koleksiyon; public ENumaralandrma(Koleksiyon koleksiyon) { this.koleksiyon=koleksiyon; indeks=-1; } public void Reset() { indeks=-1; } public bool MoveNext() { indeks++; if(indeks<koleksiyon.Dizi.Length) return true; else return false; } object IEnumerator.Current { get { return(koleksiyon.Dizi[indeks]); } } } } class MainMetodu { static void Main() { int[] dizi={1,2,3,8,6,9,7}; Koleksiyon k=new Koleksiyon(dizi); foreach(int i in k)

Console.Write(i+" "); } }
Bu program kendi tanmladmz herhangi bir snfn foreach dngsyle kullanlabilmesini salyor. Yani foreach(tur1

nesne1 in nesne2){} deyiminde hem nesne1'in trn (tur1) hem de

nesne2'nin trn kendi oluturduumuz trlerden (snf, yap, vb.) biri yapabiliriz. Bu programda nesne2'nin kendi trmzde olmasn salayacaz. Bu rnekten hemen sonraki rnekte de nesne1'in kendi trmzden olmasn salayacaz. Programmza dnecek olursak foreach dngsnde nesne2'yi kendi trmzden yapabilmemiz iin baz metotlar oluturmamz gerekiyor. System.Collections isim alanndaki IEnumerable ve IEnumerator arayzleri de bize bu metotlar oluturmaya zorluyor. Ayrca programmzn ana hattna dikkat ederseniz iki snf i ie gemi. C#'ta bu tr bir kullanm mmkndr. Laf fazla uzatmadan bu programmz satr satr incelemeye balayalm.

using System; using System.Collections;


Bu satrlarla System ve System.Collections isim alanlarndaki trlere direkt eriim hakk elde ettik.

class Koleksiyon:IEnumerable {
Bu satrlarla System.Collections isim alanndaki IEnumerable arayzn kullanan bir snf balattk.

int[] Dizi;
Bu satrla snfmza (Koleksiyon) ait bir zellik bildirdik.

public Koleksiyon(int[] dizi) { this.Dizi=dizi; }


Bu satrlarla snfmzn (Koleksiyon) yapc metodunu bildirdik. Yapc metodumuz int[] trnden bir parametre alyor ve bu ald veriyi snfn bir zellii olan Dizi'ye aktaryor. Burada this anahtar szcnn kullanlmas zorunlu deildir ancak okunurluu artrr.

IEnumerator IEnumerable.GetEnumerator() { return new ENumaralandrma(this); }


Bu satrlarla snfmza, IEnumerable arayzndeki GetEnumerator() metodunu ak arayz uygulama yntemiyle geiriyoruz. Metodun geri dn tipi IEnumerator arayz. Metodun gvdesinde ise ENumaralandrma snfnn yapc metodu kullanlarak ENumaralandrma trnden bir nesne dndrlyor. Buradan ENumaralandrma snfnn yapc metodunun Koleksiyon snf trnden bir nesne aldn anlayabiliyoruz. nk buradaki this anahtar szc bu GetEnumerator metoduna hangi nesne zerinden eriildiini temsil ediyor. Bu metot Koleksiyon snfnda olduuna gre bu metoda da bir Koleksiyon nesnesi

zerinden eriilmelidir. Burada bir terslik varm gibi gzkyor. O da metodun geri dn tipiyle geri dndrllen verinin tipinin birbirine uymamas. Ancak programmzn sonraki kodlarna bakacak olursanz ENumaralandrma snfnn IEnumerator arayzn kullandn greceksiniz. Dolaysyla da bir IEnumerator tipinden nesneye bir ENumaralandrma nesnesi atanabilecek.

class ENumaralandrma:IEnumerator {
Burada Koleksiyon snfnn iinde ENumaralandrma snfn oluturuyoruz ve bu snf da System.Collections isim alanndaki IEnumerator arayzn kullanyor.

int indeks; Koleksiyon koleksiyon;


Burada snfmza (ENumaralandrma) iki tane zellik ekledik.

public ENumaralandrma(Koleksiyon koleksiyon) { this.koleksiyon=koleksiyon; indeks=-1; }


Burada ENumaralandrma snfnn yapc metodunu hazrladk. Yeri gelmiken belirtmek istiyorum. ie snflar i ie gzkselerde aslnda birbirinden bamszdr. ie snflarn normal snflardan tek fark iteki snfa dtaki snfn dndan eriilmek istendiinde grlr. Bu durumda iteki snfa DisSinif.IcSinif yazarak eriilebilir. Ancak tabii ki bu eriimin mmkn olabilmesi iin i snfn public olarak belirtilmesi gerekir.

public void Reset() { indeks=-1; }


Burada snfmza bir metot ekledik. Bu metodu snfmzn kulland IEnumerator arayz gerektiriyordu.

public bool MoveNext() { indeks++; if(indeks<koleksiyon.Dizi.Length) return true; else return false; }
Burada snfmza bir metot daha ekledik. Yine bu metodu da IEnumerator arayz gerektiriyordu.

object IEnumerator.Current { get {

return(koleksiyon.Dizi[indeks]); } }
Burada IEnumerator arayznn gerektirdii bir sahte zellii ak arayz uygulama yntemiyle hazrladk.

class MainMetodu { static void Main() {


Artk programmzn almaya balayaca ksm yazmaya balyoruz.

int[] dizi={1,2,3,8,6,9,7}; Koleksiyon k=new Koleksiyon(dizi);


Dizimizi ve yeni bir Koleksiyon nesnesi oluturduk.

foreach(int i in k) Console.Write(i+" ");


Ve baardk. nesne2'yi kendi trmz yaptk. imdi nesne1'i kendi trmz yapacak program yazalm:

using System; class A { public int Ozellik; public A(int a) { Ozellik=a; } } class Ana { static void Main() { A[] dizi=new A[3]; dizi[0]=new A(10); dizi[1]=new A(20); dizi[2]=new A(50); foreach(A i in dizi) Console.WriteLine(i.Ozellik); } }
Grdnz gibi kendi oluturduumuz snf trnden nesnelerle diziler oluturabiliyoruz. Nasl ki int[] ile int trndeki veriler bir araya geliyorsa bizim rneimizde de A trnden nesneler bir araya geldi.

C Sharp Programlama Dili/Partial (ksmi) tipler

Vikikitap, zgr ktphane


< C Sharp Programlama Dili

imdi daha nceden grdmz bir eyi hatrlatmak istiyorum. Kodlarmz birden fazla dosyaya paralayp bu paralar komut satrnda hep birlikte derleyebiliriz. Yani programmzn bir snfn bir dosyaya, baka bir snfn baka bir dosyaya koyup komut satrnda toplu derleme yaparsak btn bu dosyalar sanki bir dosyadaym gibi ilem grecektir. Ayn olay isim alan dzeyinde de yapabiliriz. Yani bir isim alann bir dosyaya, baka bir isim alann bir dosyaya koyup komut isteminde toplu derleme yaparsak yine iki isim alan da ayn dosyadaym gibi ilem grecektir. Ancak bu durum metot dzeyi nde mmkn deildir. nk metotlar mutlaka bir snfa ait olmaldr. Aklnza yle bir fikir gelebilir: "Metotlar farkl dosyalarda ayn isimli snflara koyalm!". Ancak ne yazkki byle bir durumda dosyalar birletirildiinde derleyici ayn isimli snfn iki kez bildirildiini anlayacak ve hata verecektir. te burada ksmi trler devreye giriyor. Derleyicinin ayn isimli trler (snf, yap, arayz, ...) grdnde hata vermek yerine trlerdeki ye elemanlar tek isim altnda birletirmesini salamak iin ksmi tipler kullanlr. Bir trn ksmi olduunu belirtmek iin partial anahtar szc kullanlr. rnek: bir.cs dosyas

partial class sinif { ... }


iki.cs dosyas

partial class sinif { ... }


Komut isteminden csc

bir.cs iki.cs komutunu verirsek bu iki dosyadaki snflarn ierii

birletirilecektir. Ksmi trlerle ilgili baz ufak bilgiler:

Birletirilmesini istediimiz btn ayn isimli trleri partial olarak bildirmeliyiz. Yalnzca birisini partial olarak bildirmek yeterli deildir.

Snflar, yaplar ve arayzler partial olarak bildirilebilir. Ksmi trlerden biri sealed ya da abstract anahtar szcyle belirtilmise dierinin de belirtilmesine gerek yoktur.

Partial trlerin partial olarak bildirildi diye illaki baka bir dosyayla ilikilendirilmesine gerek yoktur. Partial trler minimum ye eleman dzeyinde i grrler. Yani ayn metodun gvdesinin bir ksmn bir dosyada, baka bir ksmn baka bir dosyada yazmak partial trler ile de mmkn deildir.

C Sharp Programlama Dili/stisnai durum yakalama mekanizmas


Vikikitap, zgr ktphane
< C Sharp Programlama Dili

Muhtemelen u ana kadar fark etmisinizdir. Ancak yine de sylemek istiyorum. Programlarmzdaki hatalar ikiye ayrlr: 1. Derleme zaman hatalar 2. alma zaman hatalar Programmzda bir derleme zaman hatas oluursa derleme ilemi olmaz. Genellikle derleme zaman hatalar yanl sz diziminden (sintaks) kaynaklanr ve tespiti kolaydr. alma zaman hatalar ise daha ok mantksal yanllklardan kaynaklanr ve tespiti nispeten daha zordur. rnein kullancnn girdii iki sayy toplayan bir program yazdmz dnelim. Kullanc saylarn yerine herhangi bir harf girerse programmz alma zaman hatas verir ve kendisini sonlandrr. Byle bir durumu engellemek iin toplama ilemini yapmadan nce kullancnn girdii veriyi bir kontrolden geirebiliriz. rnein kullancnn girdii stringin iinde foreach dngs yardmyla dolap herhangi bir rakam olmayan karakter varsa toplama ileminin yaplmamasn salayabiliriz. Ancak takdir edersiniz ki bu ok zahmetli bir yntemdir. stelik bu kadar basit bir program iin bu kadar zahmetli bir kod yazdmz dnrsek byk lekli projelerde zamanmzn ounu hata yakalamaya ayrmamz gerekirdi. te istisnai durum yakalama mekanizmas byle bir durumda zamanmz byk oranda ksaltr. stisnai durum yakalama mekanizmas programmzn bir alma zaman hatasyla karlatnda hata verip kendini sonlandrmas yerine daha farkl ilemler yaplabilmesini salar. imdi kod yazmaya balayabiliriz.
Konu balklar
[gizle]

1 Hatann trnden bamsz hata yakalama 2 Hatann trne bal hata yakalama 3 throw anahtar szc 4 stisnai durum snflarnda treme 5 ie gemi try bloklar 6 stisnai durum snflar 7 Kendi istisnai durum snflarmz oluturmak

[dzenle]Hatann

trnden bamsz hata yakalama

using System; class deneme { static void Main()

{ string a=Console.ReadLine(); string b=Console.ReadLine(); int toplam=Int32.Parse(a)+Int32.Parse(b); Console.WriteLine(toplam); } }


Bu programn imdiye kadar yazdmz programlardan fark yok. Kullancnn girdii deerlerden en az biri say deilse program hata verip sonlanacaktr. Bunu nlemek iin program yle yazabiliriz:

using System; class deneme { static void Main() { try { string a=Console.ReadLine(); string b=Console.ReadLine(); int toplam=Int32.Parse(a)+Int32.Parse(b); Console.WriteLine(toplam); } catch { Console.WriteLine("Say girmelisiniz!"); } } }
Bu programda try blounda herhangi bir alma zaman hatasyla karlalr ise catch bloundaki satrlar altrlr ve ak catch blounun dndan devam eder. Eer try blounda herhangi bir alma zaman hatasyla karlalmazsa catch bloundaki satrlar altrlmaz ve programn ak catch blounun dndan devam eder. try ve catch bloklar ayn blok iinde olmaldr. Ayrca try'dan hemen sonra catch gelmelidir. Baka bir rnek:

using System; class deneme { static void Main() { try { string a=Console.ReadLine(); string b=Console.ReadLine(); int toplam=Int32.Parse(a)+Int32.Parse(b); Console.WriteLine(toplam); }

catch { Console.WriteLine("Say girmelisiniz!"); } finally { Console.WriteLine("Program sonland!"); } } }


Burada finally blounda hata olusa da olumasa da altrlmas istenen satrlar yazlr. finally blounu belirtmek zorunda deiliz. Ancak try ve catch bloklar istisnai durum yakalama mekanizmasnn almas iin mutlaka gereklidir. Programmzn hata vermemesi iin try bloundan sonra catch ya da finally bloklar gelmelidir. Ancak try bloundan sonra finally blou gelirse istisnai durum yakalama mekanizmas almayaca iin byle bir kullanm tavsiye edilmez.

[dzenle]Hatann

trne bal hata yakalama

Farkndaysanz imdiye kadar try blounda herhangi bir hata gereklemesi durumunda catch bloundaki satrlarn almasn saladk. imdi hatann trne gre farkl catch bloklarnn altrlmasn salayacaz. Ancak bunun iin baz n bilgiler almanz gerekiyor. C#'ta btn hata trleri System isim alanndaki birer snfla temsil edilir ve o hata gerekletiinde o snf trnden bir nesne frlatlr. imdi konuyu anlamak iin en bataki rneimizi biraz deitirelim:

using System; class deneme { static void Main() { try { string a=Console.ReadLine(); string b=Console.ReadLine(); int toplam=Int32.Parse(a)+Int32.Parse(b); Console.WriteLine(toplam); } catch(FormatException nesne) { Console.WriteLine("Say girmelisiniz!"); } } }

System isim alanndaki FormatException metotlara yanl formatta parametre verilmesiyle ilgilenir. Dolaysyla da rneimizde kullanc rakam yerine harf girerse Parse() metodu gerekli dnm yapamayaca iin catch blou alacaktr. Baka bir rnek:

using System; class deneme { static void Main() { try { string a=Console.ReadLine(); string b=Console.ReadLine(); int toplam=Int32.Parse(a)+Int32.Parse(b); Console.WriteLine(toplam); } catch(FormatException nesne1) { Console.WriteLine("Say girmelisiniz!"); } catch(IndexOutOfRangeException nesne2) { Console.WriteLine("Dizi snrlar ald!"); } } }
IndexOutOfRangeException dizi snrlarnn amyla ilgilenen bir snftr. Grdnz gibi birden fazla catch blou tasarlayp farkl hatalara gre programmzn gidiatn ynlendirebiliyoruz. imdi rneimizi biraz daha gelitirelim:

using System; class deneme { static void Main() { try { string a=Console.ReadLine(); string b=Console.ReadLine(); int toplam=Int32.Parse(a)+Int32.Parse(b); Console.WriteLine(toplam); } catch(FormatException nesne) { Console.WriteLine("u hata meydana geldi: "+nesne.Message); } }

}
Hata snflar sonuta bir snf olduuna gre bu snflarn kendine zg ye elemanlar olmal. te Message zellii hemen hemen btn hata snflarnda bulunur ve hatann ne olduunu belirten bir string dndrr (tabii ki ngilizce). Message gibi btn hata snflarnda bulunan baz zellikler daha vardr: Source Hata nesnesinin gnderildii uygulama ya da dosyann addr. (string) StackTrace Hatann olutuu yer hakknda bilgi verir. (string) HelpLink Hatayla ilgili olan yardm dosyasn saklar. Tabii ki bunu programc belirler. (string) TargetSite stisnai durumu frlatan metot ile ilgili bilgi verir. (MethodBase) InnerException catch blou ierisinden bir hata frlatlrsa catch blouna gelinmesine yol aan istisnai durumun Exception nesnesidir. ToString() Bu metot ilgili hataya ilikin hata metninin tamamn string olarak dndrr. Yukardaki ye elemanlarn tamam static deildir. imdi eitli rnekler yapalm:

using System; class deneme { static void Main() { try { Metot(); } catch(IndexOutOfRangeException nesne) { Console.WriteLine("Dizi snrlar ald."); } } static void Metot() { int[] a=new int[2]; Console.WriteLine(a[3]); } }
Bu program ekrana Dizi

snrlar ald. yazacaktr. Yani bir metot baka bir metodun

iinde kullanld zaman adeta kullanlan metot yeni metodun iine kopyalanm gibi ilem yapld. Baka bir rnek:

using System; class deneme { static void Main() { try {

Metot(); } catch(IndexOutOfRangeException nesne) { Console.WriteLine("Metodu kullananda hata yakaland"); } } static void Metot() { try { int[] a=new int[2]; Console.WriteLine(a[3]); } catch(IndexOutOfRangeException nesne) { Console.WriteLine("Metodun kendisinde hata yakaland."); } } }
Bu program ekrana Metodun

kendisinde hata yakaland. yazacaktr. Yani hem metodun

kendisinde hem de metodu kullanan metotta hata yakalama mekanizmas kurulmusa hata durumunda metodun kendisindeki mekanizma alr. Mekanizma yalnzca herhangi birisinde olsayd o metoda ait mekanizma alacakt. Baka bir rnek:

using System; class deneme { static void Main() { try { int[] a=new int[2]; Console.WriteLine(a[3]); } catch(IndexOutOfRangeException) { Console.WriteLine("Dizi snrlar ald"); } } }
Grdnz gibi catch'e parametre verirken illaki nesne oluturulmasna gerek yok. Sadece snfn ad yazlmas yeterli. Ancak tabii ki bu durumda snfa ait ye elemanlara eriemeyiz. Baka bir rnek:

using System; class deneme

{ static void Main() { for(;;) { try { Console.Write("Ltfen kmak iin 0 ya da 1 girin: "); int a=Int32.Parse(Console.ReadLine()); int[] dizi=new int[2]; Console.WriteLine(dizi[a]); break; } catch { continue; } } } }
Bu programda istisnai durum mekanizmasn son derece yaratc bir ekilde kullandk. Program biraz inceleyince ne yapmak istediimizi anlayacaksnz.

[dzenle]throw

anahtar szc

u ana kadar hata nesnelerinin atlmas hata gerekletiinde otomatik olarak yaplyordu. imdi ise throw anahtar szc sayesinde bunu manuel olarak yapabileceiz. Yani tabiri caizse hata gereklememise bile sistemin hata gereklemi gibi davranmasn salayacaz. throw anahtar szcn try blounun iinde kullanmalyz. Aksi bir durumda program hata vermese de iimize yaramaz. Bir hata nesnesi throw anahtar szc yardmyla yle frlatlabilir:

throw new IndexOutOfRangeException("Dizinin snrlar ald");


veya

IndexOutOfRangeException nesne=new IndexOutOfRangeException("Dizinin snrlar ald"); throw nesne;


Birincisinde Message zelliinin deeri "Dizinin snrlar ald" stringi olan yeni bir IndexOutOfRangeException nesnesi frlatlyor. kincisinde ise nce nesne oluturuluyor sonra bu nesne frlatlyor. imdi bunlar az nceki zerinde grelim:

using System; class deneme { static void Main() {

for(;;) { try { Console.Write("Ltfen kmak iin 0 ya da 1 girin: "); string a=Console.ReadLine(); if(a=="0"||a=="1") break; else throw new IndexOutOfRangeException("Devam ediliyor"); } catch(IndexOutOfRangeException nesne) { Console.WriteLine(nesne.Message); continue; } } } }
imdi ayn rnei throw anahtar szcnn deiik formuyla yapalm:

using System; class deneme { static void Main() { for(;;) { try { Console.Write("Ltfen kmak iin 0 ya da 1 girin: "); string a=Console.ReadLine(); if(a=="0"||a=="1") break; else { IndexOutOfRangeException nesne=new IndexOutOfRangeException("Baa dnld"); nesne.HelpLink="http://tr.wikibooks.org"; //Grdnz gibi bu yntemle nesnenin zelliklerini deitirebiliyoruz. throw nesne; } } catch(IndexOutOfRangeException nesne) { Console.WriteLine(nesne.Message); continue; }

} } }
[dzenle]stisnai

durum snflarnda treme

Aslnda btn istisnai durum snflar Exception snfndan tretilmitir. Ancak Exception snfndaki ye elemanlar sanal olarak bildirilmi ve istisnai durum snflar da bu ye elemanlar override etmitir. Benzer ekilde oklu tretmenin yapld snflar da mevcuttur. rnein:

SystemException snf Exception snfndan tremitir. IOException snf SystemException snfndan tremitir. FileNotFoundException snf IOException snfndan tremitir.

Kaltm konusunda da grdmz gibi yavru snf nesneleri ana snf nesneleri yerine kullanlabilir. Dolaysyla bir catch blou IOException hatalarn yakalyorsa ayn zamanda FileNotFoundException hatalarn da yakalar. Ancak tabii ki hem IOException hem de FileNotFoundException catch'leri oluturulmusa FileNotFoundException'n catch'i altrlacaktr. NOT1: Birden fazla catch blou oluturduumuz durumlarda catch bloklar art arda gelmelidir. Yani araya herhangi baka kod giremez. NOT2: Bir C# programnda aadaki iki catch blou varsa ikincisi (parametreli olan) alr.

catch { } catch(Exception nesne) { }


Ancak baka dillerden alnm bir COM parac sz konusuysa birincisi alr. COM paracklar ok ayrntl ve karmak olduundan ve muhtemelen iiniz dmeyeceinden birinci olasl zmsemeniz yeterlidir. NOT3: Birden fazla art arda gelen catch blounun parametreleri aynysa programmz derlenmez.

[dzenle]

ie gemi try bloklar

try-catch-finally yapmzn yle olduunu dnelim:

try { //A try { //B } catch {

//C //teki catch blou } finally { //D //teki finally blou } } catch { //Dtaki catch blou } finally { //Dtaki finally blou }
1. A blgesinden bir hata frlatld zaman dtaki catch blou tarafndan yakalanr. 2. B blgesinden bir hata frlatld zaman nce iteki catch blouna baklr. Uygun tr varsa iteki catch blou altrlr. Uygun tr yoksa dtaki catch blou altrlr. 3. C veya D blgesinden bir hata frlatld zaman dtaki catch blou tarafndan yakalanr. 4. Tabii ki finally bloklar btn durumlarda altrlr. 5. Benzer kurallar ikiden fazla i ie gemi try bloklar i in de geerlidir. Yani uygun tr varsa en iteki try bloundaki hata en iteki catch tarafndan yakalanr. Uygun tr yoksa basamak basamak da klr.

[dzenle]stisnai

durum snflar

imdiye kadar birka istisnai durum snf grdk. imdi bunlar ve sk kullanlan birka snf daha greceiz: System.OutOfMemoryException Programn almas iin yeterli bellek kalmadysa frlatlr. System.StackOverflowException Stack bellek blgesinin birden fazla metot iin kullanlmas durumunda frlatlr. Genellikle kendini aran metotlarn hatal kullanlmasyla meydana gelir. System.NullReferenceException Bellekte yer ayrlmam bir nesne zerinden snfn ye elemanlarna erimeye alrken frlatlr. System.OverflowException Bir veri trne kapasitesinden fazla veri yklemeye allrken frlatlr. System.InvalidCastException Tr dntrme operatryle geersiz tr dnm yaplmaya alldnda frlatlr. System.IndexOutOfRangeException Bir dizinin olmayan elemanna eriilmeye allrken frlatlr. System.ArrayTypeMismatchException Bir dizinin elemanna yanl trde veri atanmaya allrken frlatlr. System.DividedByZero Sfra blme yapld zaman frlatlr.

System.ArithmeticException DividedByZero ve OverflowException bu snftan tremitir. Hemen hemen matematikle ilgili tm istisnalar yakalayabilir. System.FormatException Metotlara yanl formatta parametre verildiinde frlatlr.

[dzenle]Kendi

istisnai durum snflarmz oluturmak

.Net Framework ktphanesinde onlarca istisnai durum snf vardr. Ancak istersek kendi istisnai durum snflarmz da oluturabiliriz. Kendi oluturduumuz snflar ApplicationException snfndan tretiriz. Bu snf Exception snfndan tremitir. Dolaysyla kendi oluturduumuz istisnai durum snflarna da Exception snfndaki Message, HelpLink gibi ye elemanlar otomatik olarak gelecektir. Bu ye elemanlar istersek override edebilir, istersek olduu gibi brakabiliriz. stersek de kendi ye elemanlarmz yazabiliriz. sterseniz imdi rneimize balayalm. rneimizde rencilerin notlarn tutan bir snf tasarlayalm. Sonra bu snfn iinde iki tane hata snf oluturalm. Birinci snf rencinin notu 100'den bykse, ikinci snf 0'dan kkse hata verdirsin. imdi rneimize balayabiliriz:

using System; class Notlar { private int mNot; public int Not { get{return mNot;} set { if(value>100) throw new FazlaNotHatasi(); else if(value<0) throw new DusukNotHatasi(); else mNot=value; } } public class FazlaNotHatasi:ApplicationException { override public string Message { get{return "Not 100'den byk olamaz.";} } } public class DusukNotHatasi:ApplicationException { override public string Message { get{return "Not 0'dan kk olamaz.";} } } }

class Ana { static void Main() { try { Notlar a=new Notlar(); Console.Write("Not girin: "); int b=Int32.Parse(Console.ReadLine()); a.Not=b; Console.WriteLine("Notunuzu baaryla girdiniz."); } catch(Exception nesne) { Console.WriteLine(nesne.Message); } } }
Program inceleyince muhtemelen kendi istisnai durum snflarmz nasl yaptmz anlayacaksnz. Ancak yine de zet bir bilgi vermek istiyorum. Hata snf(lar)mz asl snfmzn iine koyuyoruz. Asl snfmz iinde herhangi bir anda bu hata snflarmz trnden nesne frlatabiliyoruz. Ayrca bu programdaki catch'in Exception trnden nesne almas, ancak bu nesne zerinden yavru snfa ait zellie eriilmesi geen blmde grdmz sanal ye elemanlara ok iyi bir rnek. imdi rneimizi biraz deitirelim:

using System; class Notlar { //Buraya az nceki Notlar snfnn ayns gelecek. } class Ana { static void Main() { try { Notlar a=new Notlar(); Console.Write("Not girin: "); int b=Int32.Parse(Console.ReadLine()); a.Not=b; Console.WriteLine("Notunuzu baaryla girdiniz."); } catch(Notlar.FazlaNotHatasi nesne) { Console.WriteLine(nesne.Message); } } }

Bu programda fazla not hatalar yakalanacak ancak dk not hatalar yakalanmayacaktr. Eer dk not hatas oluursa program alma zamannda unun gibi bir uyar verip kendini sonlandracaktr.

Unhandled Exception: Notlar+DusukNotHatasi: Not 0'dan kk olamaz. at Notlar.set_Not(Int32 value) at Ana.Main()


Buradan hata frlattran snfn Notlar snfndaki DusukNotHatasi snf olduunu, bu snfa ait Message zelliinin deerinin "Not 0'dan kk olamaz." olduunu, hatann Notlar snfndaki Not sahte zelliine Int32 trnden veri atanrken olutuunu ve son tahlilde hatann Ana snfndaki Main() metodunda allrken olutuunu anlyoruz. imdi yle basit bir rnek yapalm:

using System; class deneme { static void Main() { int a=Int32.Parse(Console.ReadLine()); Console.WriteLine(3/a); } }
Kullancnn bu programda 0 girdiini varsayarsak program alma zaman hatasnda yle bir kt verir:

Unhandled Exception: System.DivideByZeroException: Attempted to divide by zero. at deneme.Main()


Buradan hata frlattran snfn System isim alanndaki DivideByZeroException snf olduunu, bu snfn Message zelliinin deerinin "Attempted to divide by zero." olduunu ve hatann deneme snfndaki Main() metodunda olutuunu anlyoruz. Benzer ekilde alarak yeni hata snflar kefedebilirsiniz. NOT: Hatay yakalayan birden fazla catch blou varsa ve bu catch bloklarnn parametreleri arasnda treme varsa bu durumda catch bloklarnn sralamasnn yavru snftan ana snfa doru olmas gerekir. rnein u program derleme zaman hatas verir:

using System; class deneme { static void Main() { try { int a=Int32.Parse(Console.ReadLine()); Console.WriteLine(3/a);

} catch(Exception nesne) { Console.WriteLine("Hata var!"); } catch(DivideByZeroException nesne) { Console.WriteLine("Hata var!"); } } }


NOT: .Net ktphanesindeki istisnai durum snflarnn yapc metodu bir parametre alyordu ve bu parametrede ilgili nesnenin Message zelliinin deeri belirleniyordu. Tabii ki siz de kendi istisnai durum snflarnzn yapc metodu olmasn ve istediiniz sayda parametre almasn salayabilirsiniz. NOT: try-catch ikilisiyle bir istisnai durum yakalanmad zaman ekrana yazlan hata yazs ilgili istisnai durum snfnn ToString() metodunun rettii deerdir. Kendi istisnai durum snflarmzda bu metodu override ederek yakalanmayan hatalarda ekrana kacak yazy deitirebiliriz.

C Sharp Programlama Dili/Temsilciler


Vikikitap, zgr ktphane
< C Sharp Programlama Dili

imdiye kadar rendiklerimiz trler snflar, yaplar, enumlar ve arayzlerdi. imdi temsilci isminde yeni bir tr daha reneceiz. Temsilcilerin nesneleri oluturulabilir ve bu nesneler metotlar temsil ederler. Temsilci bildirimi delegate anahtar szc ile yaplr. Bir temsilci bildirim tasla u ekildedir:

delegate GeriDnTipi Temsilcismi(parametreler);


Bu taslaa gre rnek bir temsilci bildirimi yle yaplr:

delegate int temsilci(int a,string b);


Temsilciler eriim belirleyicisi alabilir. Temsilciler genellikle programlarmza belirli bir ifadeyle birden fazla metodu arabilme yetenei vermek iin kullanlr. rnek program:

using System; class deneme { delegate void temsilci(); static void Metot1() { Console.WriteLine("Buras Metot1()"); } static void Metot2() {

Console.WriteLine("Buras Metot2()"); } static void Main() { temsilci nesne=new temsilci(Metot1); nesne(); nesne=new temsilci(Metot2); nesne(); } }
Bu program ekrana alt alta Buras

Metot1() ve Buras Metot2() yazacaktr. Yani bir snf

nesnesi oluturur gibi bir temsilci nesnesi oluturuyoruz. Yapc metoda parametre verir gibi temsilci nesnesinin hangi metodu temsil edeceini belirtiyoruz. Sonra bu temsilci nesnesi zerinden temsil edilen metodu altryoruz. Daha sonra temsilci nesnesinin deerini yani hangi metodu temsil ettiini deitirebiliyoruz. Burada dikkat etmemiz gereken nokta temsilci nesnesinin geri dn tipi ve parametre olarak kendiyle uyumlu metodu temsil edebileceidir. Eriim belirleyicisi, static olup olmama durumu, vs. bu uyuma dhil deildir. Bu rneimizde parametre almayan ve geri dn tipi void olan temsilcimiz her iki metodu da temsil edebildi. imdi daha karmak bir rnek yapalm. rneimizde her satrn aklamas yorum olarak verilmitir.

using System; class Temsilciler { public delegate void KomutMetodu(); //Geri dn tipi void olan ve parametre almayan bir temsilci bildirdik. public struct KomutYapisi //KomutYapisi isminde bir yap balattk. { public KomutMetodu KomutMetot; //Yapmza geri dn tipi KomutMetodu temsilcisi olan bir zellik ekledik. public string Komut; //Yapmza bir zellik daha ekledik. } public static void Komut1() //Snfmza bir metot ekledik. { Console.WriteLine("Komut1 alt."); } public static void Komut2() //Snfmza bir metot daha ekledik. { Console.WriteLine("Komut2 alt."); } public static void Komut3() //Snfmza bir metot ekledik. { Console.WriteLine("Komut3 alt."); } public static void Komut4() //Snfmza bir metot ekledik. { Console.WriteLine("Komut4 alt.");

} static void Main() { KomutYapisi[] komutlar=new KomutYapisi[4]; //KomutYapisi nesnelerinden oluan bir dizi oluturduk. (4 elemanl) komutlar[0].Komut="komut1"; //komutlar[0] nesnesinin Komut zelliine deer atadk. komutlar[0].KomutMetot=new KomutMetodu(Komut1); //Artk komutlar[0] nesnesinin KomutMetot zellii Komut1'i temsil ediyor. Ayn durumlar dier komutlar iin de geerli. komutlar[1].Komut="komut2"; komutlar[1].KomutMetot=new KomutMetodu(Komut2); komutlar[2].Komut="komut3"; komutlar[2].KomutMetot=new KomutMetodu(Komut3); komutlar[3].Komut="komut4"; komutlar[3].KomutMetot=new KomutMetodu(Komut4); Console.Write("Komut girin: "); string GirilenKomut=Console.ReadLine(); for(int i=0;i<komutlar.Length;i++)//komutlar dizisi iinde dolamaya kyoruz. if(GirilenKomut==komutlar[i].Komut) komutlar[i].KomutMetot(); } }
Bu programdaki KomutYapisi yaps hem komutu string olarak hem de komutun temsilcisini ieriyor. Bu yapnn drt tane nesnesi oluturuluyor. Bu nesnelerin ye elemanlarnn her birine uygun deerler atanyor. Sonra kullancnn girdii komut her bir string komutla karlatrlyor. Eer eleen olursa ilgili temsilci altrlyor. Bu tr bir rnek komutlarla alan DOS gibi programlar iin son derece uygundur. NOT: Temsilciler snflarn tad zelliklerin bazlarn tarlar. rnein bir metot parametre olarak bir temsilci tipinden nesne kabul edebilir veya bir trn bir zellii bir temsilci tipinden olabilir.
Konu balklar
[gizle]

1 oklu temsilciler 2 Delegate snf 3 simsiz metotlar 4 Temsilcilerde kaltm durumlar

[dzenle]oklu

temsilciler

imdiye kadar bir temsilci nesnesi ayn anda yalnzca bir tane metodu temsil edebiliyordu. Artk bir temsilci nesnesinin ayn anda birden fazla metodu temsil edebilmesini salayacaz. Bu sayede temsilci nesnesi arldnda temsil ettii btn metotlar srasyla altrlacaktr. Bir temsilci nesnesinin birden fazla

metodu temsil etmesini salamak iin += ve -= operatrleri kullanlr. += operatr temsilci nesnesine metot eklemek iin, -= operatr ise temsilci nesnesinden metot karmak iin kullanlr. Aslnda ayn i iin + ve operatrlerini de kullanabilirdik. Ancak += ve -= bu ii biraz olsun kolaylatryor. rnek:

using System; class deneme { delegate void temsilci(); static void Metot1() { Console.WriteLine("Metot1 arld."); } static void Metot2() { Console.WriteLine("Metot2 arld."); } static void Metot3() { Console.WriteLine("Metot3 arld."); } static void Main() { temsilci nesne=null; nesne+=new temsilci(Metot2); nesne+=new temsilci(Metot1); nesne+=new temsilci(Metot3); nesne(); Console.WriteLine("***"); nesne-=new temsilci(Metot1); nesne(); } }
Bu programn ekran kts yle olacaktr:

Metot2 Metot1 Metot3 *** Metot2 Metot3

arld. arld. arld. arld. arld.

Yani metotlarn alma sras metotlarn temsilci nesnesine eklenme srasyla ayndr. Eer programda Metot1 temsilci nesnesine tekrar eklenirse bu sefer Metot1() en sona geecektir. NOT:

nesne+=new temsilci(Metot2);

nesne-=new temsilci(Metot1);
satrlaryla

nesne=nesne+new temsilci(Metot2); nesne=nesne-new temsilci(Metot1);


satrlar denktir.

[dzenle]Delegate

snf

Kendi yarattmz temsilciler gizlice System isim alanndaki Delegate snfndan trer. Dolaysyla kendi yarattmz temsilcilerin nesneleri zerinden bu snfn static olmayan ye elemanlarna eriebiliriz. Ayrca Delegate snf zet bir snf olduu iin new anahtar szcyle bu snf trnden nesne yaratamayz. Yalnzca kendi yarattmz temsilci nesneleri zerinden bu snfn ye elemanlarna eriebiliriz. imdi isterseniz Delegate snfnn baz ye elemanlarn grelim.: GetInvocationList() Bu metot bir oklu temsilcideki btn metotlar bir System.Delegate dizisine aktarr. DynamicInvoke(object[] parametreler) Bu metot bir temsilcinin temsil ettii metodu armak iin kullanlr. GetInvocationList() metodu ile oklu bir temsilcinin metotlar bir Delegate dizisine atand zaman bu dizinin elemanlarn normal yollarla altrmak mmkn olmaz. te DynamicInvoke() metodu bu dizinin elemanlarn altrmak iin kullanlabilir. imdi isterseniz GetInvocationList() ve DynamicInvoke() metotlarn bir rnek zerinde grelim:

using System; class deneme { delegate void temsilci(); static void Metot1() { Console.WriteLine("Buras Metot1()"); } static void Metot2() { Console.WriteLine("Buras Metot2()"); } static void Main() { temsilci nesne=null; nesne+=new temsilci(Metot1); nesne+=new temsilci(Metot2); Delegate[] dizi=nesne.GetInvocationList(); dizi[0].DynamicInvoke(); dizi[1].DynamicInvoke(); } }

Bu program alt alta Buras

Metot1() ve Buras Metot2() yazacaktr. Eer Delegate

dizisindeki temsilci nesnelerinin temsil ettii metotlarn parametreleri varsa bu parametreler DynamicInvoke() metoduna object dizisi olarak verilmelidir. Combine(Delegate[] temsilciNesneleri) Combine(Delegate temsilciNesnesi1, Delegate temsilciNesnesi2) Birinci metot temsilciNesneleri adl Delegate dizisindeki tm metotlar bir oklu temsilci nesnesi olarak tutar. kinci metot ise temsilciNesnesi1 ve temsilciNesnesi2 temsilci nesnelerindeki tm metotlar arka arkaya ekleyip bir temsilci nesnesi olarak tutar. Her iki metot da statictir. rnek:

//Dier ksmlar yukardaki programn ayns. (Buras Main() metodu) temsilci nesne=null; nesne+=new temsilci(Metot1); nesne+=new temsilci(Metot2); Delegate[] dizi=nesne.GetInvocationList(); Delegate nesne2=Delegate.Combine(dizi); nesne2.DynamicInvoke();
imdi ikinci metodu rnekleyelim:

//Dier ksmlar yukardaki programn ayns. (Buras Main() metodu) temsilci nesne1=null; nesne1+=new temsilci(Metot1); nesne1+=new temsilci(Metot2); temsilci nesne2=new temsilci(Metot1); Delegate nesne3=Delegate.Combine(nesne1,nesne2); nesne3.DynamicInvoke();
Bu program ekran kts yle olmaldr:

Buras Metot1() Buras Metot2() Buras Metot1()


NOT: Delegate snf trnden bir nesnenin daima gizli tr olur, ve bu tr de daima bir temsilcidir. Yani Delegate snf sadece bir kap vazifesi grr. Ayrca Delegate snf trnden bir nesneyle, bir temsilci nesnesinden farkl olarak normal metot ars, += operatryle metot eklemesi ve -= operatryle metot kartm yaplamaz. Delegate nesneleriyle bu ilemler yalnzca Delegate snfna ait olan ye elemanlarla yaplr. Ayrca istersek tr dntrme operatryle Delegate nesnesini gizli trne (ki bu bir temsilci oluyor) dntrebiliriz. rnek:

using System; class Ana { delegate void temsilci(); static void Metot1() {

Console.WriteLine("Metot1"); } static void Metot2() { Console.WriteLine("Metot2"); } static void Metot3() { Console.WriteLine("Metot3"); } static void Main() { temsilci t=new temsilci(Metot1); t+=new temsilci(Metot2); t+=new temsilci(Metot3); Delegate d=t; temsilci c=(temsilci)d; c(); } }
Bu program ekrana alt alta Metot1, Metot2 ve Metot3 yazar. NOT: Tr dntrme operatryle bir nesneyi daima gizli trne dntrebiliriz. Bu ilem iin tr iinde bir explicit metot tanmlamaya gerek yoktur.

[dzenle]simsiz

metotlar

u ana kadar rendiklerimize gre temsilcilerin var olma nedeni metotlard. Yani bir metot olmadan bir temsilci de olmuyordu. Ancak artk bir metot olmadan ie yarayan bir temsilci tasarlayacaz. rnek:

using System; class isimsiz { delegate double temsilci(double a,double b); static void Main() { //temsilci nesnesine bir kod blou balanyor. temsilci t=delegate(double a,double b) { return a+b; }; //temsilci nesnesi ile kodlar altrlyor. double toplam=t(1d, 9d); Console.WriteLine(toplam); } }
Grdnz gibi bir temsilci nesnesine bir metot yerine direkt kodlar atand.

[dzenle]Temsilcilerde

kaltm durumlar

C# 2.0'dan nce temsilci nesnelerinin temsil edecei metotlarn prototipi temsilcinin prototipi ile ayn olmalyd. Yani gerek geri dn tipi, gerekse de parametrelerin tipi arasnda bir treme sz konusu olsa bile tr uyumsuzluu var saylyordu. C# 2.0 ve daha sonraki srmlerde programclar bu gereksiz tr uyumu derdinden kurtulmutur. rnek program:

using System; delegate Ana temsilciAna(); delegate Yavru temsilciYavru(); class Ana { } class Yavru:Ana { } class program { static Ana MetotAna() { return new Ana(); } static Yavru MetotYavru() { return new Yavru(); } static void Main() { temsilciAna nesneAna=new temsilciAna(MetotYavru); //ancak aadaki kod hatal //temsilciYavru nesneYavru=new temsilciYavru(MetotAna); } }
Grdnz gibi geri dn tipi Ana olan temsilciAna() temsilcisi trnden nesne geri dn tipi Yavru olan MetotYavru metodunu temsil edebildi. Ancak geri dn tipi Yavru olan temsilciYavru() temsilcisi trnden nesne geri dn tipi Ana olan MetotAna metodunu temsil edemezdi.

C Sharp Programlama Dili/Olaylar


Vikikitap, zgr ktphane
< C Sharp Programlama Dili

Olaylar geen derste rendiimiz temsilcilerle yakndan ilikilidir. Olaylar daha ok Windows uygulamalar gelitirirken karmza kar. Olaylarn ne demek olduunu sanrm en iyi Windows uygulamalarndan bir rnek vererek anlatabilirim. Dnn ki bir form var ve bu forma bir buton getirdik. Bu yaptmz ilem

aslnda Button snf trnden bir nesne yaratmaktr. Button snfnn iinde eitli zellikler vardr. rnein Text zellii butonun zerindeki yazy belirtir. Benzer ekilde Button snfnn iinde olaylar da vardr. rnein Click olay butonun tklanmasn temsil eder. Button snfnn bunun gibi daha farkl olaylar da vardr. Bu olaylara baz komutlar balayarak olay gerekletiinde baz komutlarn altrlmasn salarz. C#'ta olaylar event anahtar szcyle tanmlanr. Olaylar snflarn bir ye elemandr. Bir olay bildirimi yle yaplr:

eriim_belirleyici event temsilci olay_ismi;


imdi olaylarla ilgili bir rnek yapalm:

using System; delegate void OlayYoneticisi(); //Olay yneticisi bildirimi class Buton //Olayn iinde bulunaca snf bildirimi { public event OlayYoneticisi Click; //Olay bildirimi public void Tiklandi() //Olay meydana getirecek metot { if(Click!=null) Click(); } } class AnaProgram { static void Main() { Buton buton1=new Buton(); buton1.Click+=new OlayYoneticisi(Click); //Olay sonras iletilecek metotlarn eklenmesi buton1.Tiklandi(); //Olayn meydana getirilmesi. } //Olay sonras iletilecek metot static void Click() { Console.WriteLine("Butona tkland."); } }
Bu program ekrana Butona

tkland. yazacaktr. imdi programmz derinlemesine inceleyelim.

Programmzdaki en nemli satrlar:

delegate void OlayYoneticisi();


ve Buton snfndaki

public event OlayYoneticisi Click;

satrdr. Birinci satr bir temsilci, ikinci satr da bir olay bildirimidir. Bu iki satrdan anlamamz gereken Click olay gerekletiinde parametresiz ve geri dn tipi void olan metotlarn altrlabileceidir. Ana metottaki

buton1.Tiklandi();
satr ile olay gerekletiriliyor. Tiklandi metoduna bakacak olursak;

public void Tiklandi() { if(Click!=null) Click(); }


Burada bir kontrol gerekletiriliyor. Burada yaplmak istenen tam olarak u: Eer Click olay gerekletiinde alacak bir metot yoksa hibir ey yapma. Varsa olay gerekletir.

buton1.Click+=new OlayYoneticisi(Click);
Main() metodundaki bu satrla da buton1'in Click olayna bir metot ekliyoruz. Yani buton1 nesnesinin Click olay gerekletiinde Click metodu alacak. NOT: rneimizde olay kendimiz gerekletirdik. Ancak Windows programlarnda programc genellikle olayn gereklemesiyle deil olaydan sonra altrlacak metotlarla ilgilenir. NOT: rneimizde olay buton1.Click+=new

OlayYoneticisi(Click); satryla

yalnzca bir metoda baladk. stersek tpk temsilcilerde yaptmz gibi olaya birden fazla metot balayabilirdik. NOT: rneimizde OlayYoneticisi temsilcisi geri dn tipi void olan ve herhangi bir parametre almayan metotlar temsil etmektedir. Dolaysyla olayn gereklemesinin ardndan bu zelliklere sahip metotlar altrlabilecektir. Ancak bu art deildir. OlayYoneticisi temsilcisi deiik zelliklere sahip metotlar tems il edebilir. Bu durumda olaya o zelliklere sahip metotlar balanabilecektir. NOT: Olaydan sonra altrlacak metot ya da metotlarn static olma zorunluluu yoktur. rnek:

using System; delegate void OlayYoneticisi(); //Olay yneticisi bildirimi class Buton //Olayn iinde bulunaca snf bildirimi { public event OlayYoneticisi Click; //Olay bildirimi public void Tiklandi() //Olay meydana getirecek metot { if(Click!=null) Click(); } } class AnaProgram { static void Main() {

Buton buton1=new Buton(); AnaProgram nesne=new AnaProgram(); buton1.Click+=new OlayYoneticisi(nesne.Click); //Olay sonras iletilecek metotlarn eklenmesi buton1.Tiklandi(); //Olayn meydana getirilmesi. } //Olay sonras iletilecek metot void Click() { Console.WriteLine("Butona tkland."); } }
imdi program biraz daha gelitirelim:

using System; delegate void OlayYoneticisi(); //Olay yneticisi bildirimi class Buton //Olayn iinde bulunaca snf bildirimi { public event OlayYoneticisi Click; //Olay bildirimi public void Tiklandi() //Olay meydana getirecek metot { if(Click!=null) Click(); } } class Pencere { int a; public Pencere(int a) { this.a=a; } public void Click() { Console.WriteLine("Pencere snfndaki metot arld - "+a); } } class AnaProgram { static void Main() { Buton buton1=new Buton(); Pencere nesne1=new Pencere(1), nesne2=new Pencere(2); buton1.Click+=new OlayYoneticisi(Click); //Olay sonras iletilecek metotlarn eklenmesi buton1.Click+=new OlayYoneticisi(nesne1.Click); buton1.Click+=new OlayYoneticisi(nesne2.Click); buton1.Tiklandi(); //Olayn meydana getirilmesi.

} //Olay sonras iletilecek metot static void Click() { Console.WriteLine("Butona tkland."); } }


Bu programn ekran kts yle olacaktr:

Butona tkland. Pencere snfndaki metot arld - 1 Pencere snfndaki metot arld - 2
Yani isimleri ayn olsa bile bellekteki farkl noktalarda bulunan her farkl metot olaya ayr ayr balanabilir. Baka bir rnek:

using System; delegate void OlayYoneticisi(); //Olay yneticisi bildirimi class AnaProgram { static void Main() { AnaProgram nesne=new AnaProgram(); nesne.Olay+=new OlayYoneticisi(Metot); //Olay sonras iletilecek metotlarn eklenmesi nesne.Olay(); //Olayn gerekletirilmesi } //Olay sonras iletilecek metot static void Metot() { Console.WriteLine("Butona tkland."); } event OlayYoneticisi Olay; //Olay bildirimi }
Burada btn ye elemanlar ayn snfta bildirildi. Aslnda olay mantn anlayabilmeniz iin en basit rnek bu. Bu dersteki ilk rneimizde

public void Tiklandi() { if(Click!=null) Click(); }


gibi bir kontrol gerekletirmitik. nk C# derleyicisi program satr satr derliyordu. Yukardaki satrlara gelindiinde henz olaya herhangi bir metot balanmam olacak ve hata verecekti. nk

henz Click(); satrnda hangi metodun arlacan bilmiyordu. Bu rneimizde ise Olay olayn herhangi bir metot zerinden deil, direkt ardk. Grdnz gibi olaylar temsilcilere olduka benziyor. NOT: Olaylar tpk metotlar, zellikler ve indeksleyiciler gibi bir arayz eleman olarak bildirilebilir . Bu durumda o arayz kullanan snfn o olay iermesini zorlarz. rnek:

using System; public delegate int OlayYoneticisi(); interface IArayuz { int Metot1(); int Metot2(); int sahteozellik { set; get; } int this[int indeks] { get; } event OlayYoneticisi Olay; } class deneme:IArayuz { public int Metot1() { return 1; } public int Metot2() { return 2; } public int sahteozellik { set{} get{return 3;} } public int this[int indeks] { get{return indeks;} } public event OlayYoneticisi Olay; static void Main() { deneme nesne=new deneme(); nesne.Olay+=new OlayYoneticisi(nesne.Metot1); Console.WriteLine(nesne.Olay()); }

}
Biraz uzun bir rnek oldu ama aslnda son derece basit bir rnek. Grdnz gibi temsilciler arayzlerin iine giremedii iin darda belirtilmi. Bylelikle arayzler konusunu bir tekrar etmi olduk. Ayrca olaylar zet ya da sanal olarak bildirilebilir. Bunlar rneklemeye gerek grmyorum. NOT: Tpk temsilcilerde olduu gibi bir olaydan metot karmak iin -= operatr kullanlr.

[dzenle]add

ve remove eriimcileri

Bazen bir olaya += operatr ile metot eklendiinde veya -= operatr ile metot karldnda belirli kod bloklarnn altrlmasn isteyebiliriz. te bunun iin ilgili olayn bloklar iine add ve remove bloklar koyulur. add ve remove bloklarn sahte zelliklerdeki set ve get bloklarna benzetebiliriz.

rnek program: using System; class deneme { delegate void OlayYoneticisi(); event OlayYoneticisi Olay { add { Console.WriteLine("Olaya metot eklendi."); } remove { Console.WriteLine("Olaydan metot karld."); } } static void Main() { deneme d=new deneme(); d.Olay+=new OlayYoneticisi(d.Metot1); d.Olay+=new OlayYoneticisi(d.Metot2); d.Olay-=new OlayYoneticisi(d.Metot1); } void Metot1(){} void Metot2(){} }
Bu programn ekran kts yle olur:

Olaya metot eklendi. Olaya metot eklendi. Olaydan metot karld.


imdi add ve remove eriimlerini bir olaya en fazla iki metodun balanabilmesi amacyla kullanalm.

using System; delegate void OlayYoneticisi(); //Olay yneticimizi tanmladk. class Buton { OlayYoneticisi[] olay=new OlayYoneticisi[2]; //Olay yneticimiz trnden iki elemanl bir dizi oluturduk. public event OlayYoneticisi ButonKlik { add //Buradaki kodlar olaya metot eklendiinde altrlacak. { int i; for(i=0;i<2;++i) if(olay[i]==null) //Eer olay[i]'nin temsil ettii bir metot yoksa { olay[i]=value; //Buradaki value olaya eklenen metottur. (OlayYoneticisi temsilcisi trnden) break; } if(i==2) Console.WriteLine("Olaya en fazla iki metot eklenebilir."); } remove //Buradaki kodlar olaydan metot karldnda altrlacak. { int i; for(i=0;i<2;++i) if(olay[i]==value) //Buradaki value olaydan karlan metottur. (OlayYoneticisi temsilcisi trnden) { olay[i]=null; break; } if(i==2) Console.WriteLine("Metot bulunamad"); } } public void Kliklendi() { for(int i=0;i<2;++i) if(olay[i]!=null) olay[i](); } } class Pencere { int PencereNo;

public Pencere(int no) { PencereNo=no; } public void ButonKlik() { Console.WriteLine("{0} nolu pencere olay alglad.",PencereNo); } } public class OlayTest { static void Main() { Buton buton=new Buton(); Pencere p1=new Pencere(1); Pencere p2=new Pencere(2); //Geerli ekleme: buton.ButonKlik+=new OlayYoneticisi(ButonKlik); buton.Kliklendi(); Console.WriteLine(); //Geerli ekleme: buton.ButonKlik+=new OlayYoneticisi(p1.ButonKlik); buton.Kliklendi(); Console.WriteLine(); //Geersiz ekleme (Olay dolu): buton.ButonKlik+=new OlayYoneticisi(p2.ButonKlik); buton.Kliklendi(); Console.WriteLine(); buton.ButonKlik-=new OlayYoneticisi(p1.ButonKlik); buton.Kliklendi(); Console.WriteLine(); buton.ButonKlik-=new OlayYoneticisi(ButonKlik); buton.Kliklendi(); Console.WriteLine(); //Geersiz karma (metot yok): buton.ButonKlik-=new OlayYoneticisi(ButonKlik); buton.Kliklendi(); } public static void ButonKlik() { Console.WriteLine("Buton kliklendi"); }

}
Bu programn ekran kts yle olmaldr:

Buton kliklendi Buton kliklendi 1 nolu pencere olay alglad. Olaya en fazla iki metot eklenebilir. Buton kliklendi 1 nolu pencere olay alglad. Buton kliklendi

Metot bulunamad
NOTLAR: 1. add ve remove bloklarn ieren olaylar zet (abstract) olarak bildirilemez. 2. Bir olayda add ve remove bloklar birlikte olmaldr. Ayr ayr olamazlar.

[dzenle]Windows

uygulamalarnda olaylar

leride greceimiz Windows uygulamalar gelitirirken olaylarla i ie yaayacaz. Daha nce demitim ancak yine sylemek istiyorum. Forma bir buton getirdiimizde aslnda Button snf trnden bir nesne yaratrz. Button snfnn Click olay vardr. te biz form tasarlama penceresinde (ileride greceiz) herhangi bir butona ift tklarsak o butonun Click olayna balanan metodun ieriini yazabileceimiz bir kod penceresi alr. Bu metodun genellikle prototipi u ekildedir:

void EvenHandler(object kaynak, EventArgs e)


kaynak olay hangi nesnenin altrddr. Yani forma bir buton getirdiimizde, yani bir Button nesnesi oluturduumuzda, bu nesnenin bir ad olmaldr. Forma buton getirmeyi kodlarla yapmadmz iin Visual Studio bu Button nesnesine button1, button2 gibi adlar verir. te kaynak demek bu buton nesnesinin addr. Button snf trndendir. Kukusuz forma sadece buton getirmeyeceimiz, baka form elemanlar da getirebileceimiz iin bu parametre object trndedir. EventArgs ise System isim alannda bulunan bir snftr. Bu snftaki eitli zellikler olayla ilgili ayrntl bilgi ierirler. Yani Button snfnn Click olayna otomatik olarak EventArgs snfnn eitli zelliklerini olaya gre deitiren gizli metotlar da balanr. rnein EventArgs snfndaki zelliklerle kullancnn butonun hangi koordinatlarna tkladn renebiliriz. .Net olaylar oluturulurken System isim alanndaki EventHandler temsilcisi kullanlr. Doal olarak bu temsilci yukardaki metot prototipindedir.

C Sharp Programlama Dili/nilemci komutlar


Vikikitap, zgr ktphane
< C Sharp Programlama Dili

imdiye kadar grdmz kodlar direkt olarak exe dosyasna katlyordu. imdi greceimiz nilemci komutlarnn grevi ise sadece derleyiciye derlemenin nasl yaplaca hakknda bilgi vermektir. nilemci komutlar derleme sonucu oluan exe dosyasna aktarlmazlar. nilemci komutlar # karakteri ile belirtilirler. C# kodlarndan farkl olarak nilemci komutlar enter'la sonlandrlmaldr. Sonlarnda ; karakteri bulunmaz. imdi isterseniz btn nilemci komutlarn teker teker grelim.
Konu balklar
[gizle]

1 #define 2 #undef 3 #if ve #endif 4 #else 5 #elif 6 #error 7 #warning 8 #line 9 #region ve #endregion 10 Neden nilemci komutlar?

[dzenle]#define
#define komutu bir sembol tanmlamak iin kullanlr. Sembollerin tek balarna bir anlam yoktur. leride greceimiz dier nilemci komutlarnn alabilmeleri iin gereklidirler. #define ile sembol tanmlama program kodlarnn en banda, (using deyimlerinden de nce) olmaldr. rnek program:

#define ENGLISH #define TURKISH using System; class Onislemci { static void Main() { } }
Bu programda ENGLISH ve TURKISH isimli iki sembol tanmlanmtr. Dier btn nilemci komutlarnda olduu gibi nilemci komut paralar arasnda (rnein

#define ileTURKISH arasnda) en az bir

boluk olmaldr. Ayn semboln tekrar tekrar tanmlanmas hata verdirmez.

[dzenle]#undef
#define ile tanmlanm bir sembol kaldrmak iin kullanlr. Olmayan bir sembol kaldrmaya almak hata verdirmez. Programn herhangi bir satrnda olabilir. rnek program:

#define ENGLISH using System; #undef ENGLISH class Onislemci { static void Main() { } }
Sembollerin byk ya da kk harf olmas zorunlu deildir. Ancak tamamen byk harf okunurluu artrd iin tavsiye edilir. Sembollerin byk-kk harf duyarll vardr.

[dzenle]#if

ve #endif

#if ve #endif komutlar bir semboln tanmlanm olup olmamasna gre birtakm kodlarn derlenip derlenmemesinin salanmas iin kullanlr. Yani son tahlilde kaynak kodun bir ksm exe dosyasna ya eklenir ya eklenmez. nilemci komutlarnda bloklar olmad iin #endif komutu da #if komutunun at kod blgesini kapatmak iin kullanlr. Yani #if ve #endif arasndaki kodlar koula gre derlenip derlenmez. rnek program:

#define ENGLISH using System; class Onislemci { static void Main() { Console.WriteLine("Programa ho geldiniz."); #if ENGLISH Console.WriteLine("Bu program ENGLISH"); #endif } }
Bu program ekrana u kty verecektir.

Programa ho geldiniz. Bu program ENGLISH


Eer programn bana #define

ENGLISH satrn eklemeseydik program ktsndaki ikinci satr

olmayacakt. #if nilemci komutuyla mantksal operatrleri de kullanabiliriz. rnek program:

#define ENGLISH

#define TURKISH using System; class Onislemci { static void Main() { Console.WriteLine("Programa ho geldiniz."); #if ENGLISH && (!TURKISH) Console.WriteLine("Bu program ENGLISH"); #endif } }
Bu program sonucunda ekrana yalnzca Programa mantksal operatr durumlarn topluca grelim: #if ENGLISH && TURKISH ENGLISH ve TURKISH varsa #if ENGLISH || TURKISH ENGLISH veya TURKISH varsa #if ENGLISH && (!TURKISH) ENGLISH var ama TURKISH yoksa #if ENGLISH && (TURKISH==false) ENGLISH var ama TURKISH yoksa Benzer ekilde oklu koullandrmalar da mmkndr. rnek: #if ENGLISH && TURKISH && FRANSIZCA

ho geldiniz. satr yazlacaktr. imdi bu

[dzenle]#else
#else nilemci komutu C#'taki else ile ayn greve sahiptir. Koul salanmsa bir kod blounun derlenmesini salayan #if komutu ile birlikte kullanlr. rnek:

#define ENGLISH using System; class Onislemci { static void Main() { Console.WriteLine("Programa ho geldiniz."); #if ENGLISH Console.WriteLine("Bu program ENGLISH"); #else Console.WriteLine("Bu program ENGLISH deil"); #endif } }
Grdnz gibi #else komutu #if ile #endif arasnda kullanlyor. Baka bir rnek:

#define ENGLISH using System; #if ENGLISH class Onislemci

{ static void Main() { Console.WriteLine("Bu program ENGLISH"); } } #else class Onislemci { static void Main() { Console.WriteLine("Bu program ENGLISH deil"); } } #endif
Bu programda ayn isimli birden fazla snf ayn kaynak kodda olmasna ramen program hata vermedi. nk her halukarda bu snflardan yalnzca biri derlenecektir.

[dzenle]#elif
#elif C#'taki else if'in ksaltlmdr. Yani deilse bir de bu koula bak anlam verir. rnek program:

#define ENGLISH using System; class Onislemci { static void Main() { Console.WriteLine("Programa ho geldiniz."); #if ENGLISH Console.WriteLine("Bu program ENGLISH"); #elif TURKISH Console.WriteLine("Bu program TURKISH"); #else Console.WriteLine("Bu program hem TURKISH, hem de ENGLISH deil"); #endif } }
#elif komutlarnn saysn bir #if-#endif aralnda istediimiz kadar artrabiliriz. NOT: ie gemi #if-#elif-#else komutlar da olabilir. rnek program:

#define ENGLISH using System; class Onislemci { static void Main()

{ #if ENGLISH #if TURKISH Console.WriteLine("Bu program hem ENGLISH hem TURKISH"); #endif #elif TURKISH Console.WriteLine("Bu program sadece TURKISH"); #endif } }
[dzenle]#error
#error komutu derleyiciyi hata vermeye zorlamak iin kullanlr. rnek program:

#define ENGLISH #define TURKISH using System; class Onislemci { static void Main() { #if ENGLISH && TURKISH #error Hem TURKISH hem ENGLISH ayn anda olamaz. #endif } }
Bu program kodumuz derlenmeyecek, hata mesaj olarak da ekrana Hem

TURKISH hem ENGLISH

ayn anda olamaz. yazacaktr.


[dzenle]#warning
#warning komutu #error komutu ile ayn mantkta alr. Tek fark ekrana hata deil, uyar verilmesidir. Yani programmz derlenir, ama uyar verilir. rnek program:

#define ENGLISH #define TURKISH using System; class Onislemci { static void Main() { #if ENGLISH && TURKISH #warning Hem TURKISH hem ENGLISH tavsiye edilmez. #endif } }

[dzenle]#line
Eer programmzda bir hata var ve derleyici de (csc.exe) bu hatay tespit etmise bize bu hatann hangi dosyann hangi satrnda olduunu verir. stersek #line komutuyla bu dosya adn ve satr numarasn deitirebiliriz. Yani tabiri caizse derleyiciyi kandrabiliriz. #line komutu kendinden hemen sonra gelen satrn zelliklerini deitirmek iin kullanlr. rnek program:

using System; class Onislemci { static void Main() { #line 1 "YeniDosya.cs" int a="deneme"; } }
Bu programda int trnden olan a deikenine yanl trde sabit atadk. Bu hatay bilinli olarak yaptk. Derleyici hatann 1. satrda ve YeniDosya.cs dosyasnda olduunu iddia edecektir. nk artk derleyici #line

1 "YeniDosya.cs" komutundan hemen sonra gelen satr 1. satr

ve YeniDosya.cs dosyas olarak tanyor.

[dzenle]#region

ve #endregion

#region ve #endregion komutlarnn, kodlar Not Defteri'nde yazan bizler iin pek bir nemi yok. nk #region ve #endregion komutlar kodlar blgelere ayrmaya yaryor. Kod blgesinin yanndaki + iaretine tklaynca kodlar gsteriliyor, gsterilen kodlarn yanndaki - iaretine tklaynca da kodlarmz gizleniyor. Bu komut Visual Studio veya Not Defteri'nden daha gelimi bir editr program kullananlar iin faydal olabilir. rnek:

using System; class Onislemci { static void Main() { #region YeniAlan //Bu ksm yeni bir blge yaptk #endregion } }
[dzenle]Neden

nilemci komutlar?

nilemci komutlar genellikle belirli koullara gre programmzn yalnzca bir ksmn derlemek iin kullanlr. rnein bir programn hem ngilizce hem Trke versiyonunu ayn kaynak kodda bulunduruyorsak

nilemci komutlarn programn yalnzca Trke ya da yalnzca ngilizce versiyonunu derlemek amacyla kullanabiliriz.

C Sharp Programlama Dili/Gstericiler


Vikikitap, zgr ktphane
< C Sharp Programlama Dili

Gstericiler (pointer) yap nesnelerinin bellekteki adreslerini tutan bir veri tipidir. Temel veri trlerinden byte, sbyte, short, ushort, int, uint, long, ulong, float, double, decimal, char ve bool birer yapdr. (string ve object ise birer snftr.) Bu yaplarn yannda .Net Framework ktphanesindeki dier yaplar ve kendi oluturduumuz yap nesneleriyle de gstericileri kullanabiliriz. Ancak C# normal yollarla gsterici kullanlmasna izin vermez. Programmzn herhangi bir yerinde gsterici kullanabilmek iin o yeri unsafe anahtar szcyle belirtmemiz gerekir. unsafe anahtar szcn u ekillerde kullanabiliriz:

Bir snf unsafe olarak belirtirsek o snf iinde gsterici kullanabiliriz.

unsafe class Sinif { ... }

Herhangi bir metodun iinde bir unsafe blou oluturarak o bloun iinde gsterici kullanabiliriz.

int Metot() { unsafe { ... } }

Normal bir metodu unsafe olarak belirterek o metot iinde gsterici kullanabiliriz.

unsafe int Metot() { ... }

zellikleri unsafe olarak belirterek yeni bir gsterici oluturabiliriz. Bu durumda snf unsafe olarak belirtmeye gerek kalmaz. Ancak bir metot iinde bir gsterici oluturabilmek iin ya o metodun unsafe olarak bildirilmesi ya da bir unsafe blounun almas gerekir. Ayrca iinde gsterici kullandmz bir kaynak kod dosyas normal yollarla derlenemez. inde gsterici kullandmz bir k aynak kod dosyamz aadaki iki yoldan biriyle derleriz.

csc /unsafe KaynakKod.cs


veya

csc -unsafe KaynakKod.cs


Konu balklar
[gizle]

1 Gsterici bildirimi 2 & operatr 3 * operatr 4 Gstericiler arasnda tr dnm 5 void gstericiler 6 sizeof operatr 7 Gsterici aritmetii 8 fixed anahtar szc 9 Gstericiler ile dizi ilemleri

9.1 Ynetilmeyen diziler

10 Yap trnden gstericiler

10.1 -> operatr

11 Gstericiler ve string tr

[dzenle]Gsterici

bildirimi

Gsterici bildirimi ilgili yap adnn sonuna * iareti koyularak yaplr. rnekler:

char* gosterici1; int* gosterici2;


Bu gstericilerden birincisi bir char trnden nesnenin (deikenin), ikincisi de bir int trnden nesnenin adresini tutabilir. Birden fazla ayn trde gsterici oluturmak iin normal veri trlerinde olduu gibi virgl kullanlabilir. rnek:

int* gosterici1, gosterici2;


Gstericileri sabit ifadeler ile de bildirebiliriz. rnek:

double* gosterici=(double*)123456;
Burada bellekteki 123456 adresi gosterici gstericisine atanyor. Ancak biz 123456 adresinde ne olduunu bilmediimiz iin bu tr bir kullanm son derece tehlikelidir.

[dzenle]&

operatr

& operatr yap nesnelerinin bellekteki adreslerini retir. Operand hangi trdeyse o trn gsterici tipinde bir deer dndrr. rnek:

int a=5; int* gosterici; gosterici=&a;


[dzenle]*

operatr

* operatr adreslerdeki veriyi grmek veya deitirmek iin kullanlr. * operatr hangi tr gstericiyle kullanldysa o trde nesne geri dndrlr. rnek:

double a=5; double* gosterici; gosterici=&a; *gosterici=10;


Yani ksaca & ve * operatrleri gsterici ve nesne arasnda dnm yapmak iin kullanlr. NOTLAR: 1-) Henz adresi olmayan bir gstericiye deer atanamaz. rnein u kod hataldr:

int* gosterici; *gosterici=10;


2-) Ancak henz bir deeri olmayan bir nesnenin adresi alnabilir. Yani u kod hata vermez:

int a; int* ptr=&a;


[dzenle]Gstericiler

arasnda tr dnm

Gstericiler arasnda bilinli tr dnm yaplabilir. Ancak dikkatli olunmaldr. nk byk trn kk tre dnmnde veri kayb yaanabilir. Kk trn byk tre dnmnde de kk tr bellekte kendine ait olmayan alanlardan da alr. Dolaysyla her iki durumda da istemediimiz durumlar oluabilir. Gstericiler arasnda bilinsiz tr dnm ise imkanszdr. rnek bir program:

using System; class Gostericiler { unsafe static void Main() { char c='A'; int i=80; char* cg=&c; int* ig=&i; cg=(char*)ig; Console.WriteLine(*cg); } }

Bu program sonucunda ekrana P yazlacaktr. (80'in Unicode karl P'dir.) Bu programda herhangi bir veri kayb gereklemedi. nk 80 char trnn kapasitesindeydi. Dersin en banda sylemitik: Gstericiler yap nesnelerinin bellekteki adreslerini tutarlar. te bu adresi elde etmek iin ilgili gsterici bir tam say trne dntrlmelidir. rnek:

using System; class Gostericiler { unsafe static void Main() { int i=80; int* ig=&i; uint adres=(uint)ig; Console.WriteLine("{0:X}",adres); } }
Bu program sonucunda benim bilgisayarm 13F478 ktsn verdi. Ancak bu sizde deiebilir. nk ilemcinin verileri nereye koyacan hi birimiz bilemeyiz. Ayrca adresi ekrana yazdrrken formatlama yapp 16'lk dzende yazdrdmn da farknda olmalsnz. nk bellek adresleri genellikle 16'lk dzendeki saylarla ifade edilir. Gstericilerin adreslerini elde ederken uint trne dnm yapmak zorunlu deildir. stediiniz tam say trne dnm yapabilirsiniz. Ancak uint, bir bellek adresini tam olarak tutabilecek en kk veri tipi olduu iin ilgili gstericiyi uint trne dntrmeniz tavsiye edilir.

[dzenle]void

gstericiler

void tipinden gstericilere her trden adres atanabilir. void tr nesnelerdeki object trne benzer. rnek kod

int* gosterici1; void* gosterici2; gosterici2=gosterici1;


[dzenle]sizeof

operatr

sizeof operatr yaplarn bellekte ne kadar yer kapladklarn bayt trnden verir. Geri dn tipi inttir. rnek kod:

Console.WriteLine(sizeof(int));
Bu kod ekrana 4 ktsn verir. sterseniz bir de yle bir rnek yapalm:

using System; class Gostericiler { struct yapi { public int Ozellik1;

public int Ozellik2; } unsafe static void Main() { Console.WriteLine(sizeof(yapi)); } }


Bu program 8 ktsn verir.

[dzenle]Gsterici

aritmetii

Gstericilerin bir adres ksm, bir de tr ksm olmak zere iki ksm bulunur. Tr ksm 4 bayt yer kaplar. Adres ksmnn kaplad alan ise tre gre deiir. rnein tr int* ise adres ksm 4 bayt yer kaplar ve gsterici toplam olarak 8 bayt yer kaplar. Herhangi bir gstericinin adres ksmyla ilgili matematiksel ilem yapmaya gsterici aritmetii denir. Gstericilerle matemetiksel ilem yapmak gstericinin trne baldr. int* trnden bir gstericiyi 1 ile toplarsak o gstericinin adres ksm 4 ile toplanr. Yani herhangi bir gstericiyi herhangi bir tam say ile toplarsak ya da herhangi bir tam sayy herhangi bir gstericiden karrsak ilgili tam say deil, ilgili tam saynn gstericinin trnn bayt cinsinden boyutu ile arpm ileme sokulur. rnek:

using System; class Gosterici { unsafe static void Main() { int* g1=(int*)500; char* g2=(char*)500; double* g3=(double*)500; byte* g4=(byte*)500; g1+=2; g2+=5; g3+=1; g4+=6; Console.WriteLine("{0} {1} {2} {3}",(uint)g1,(uint)g2,(uint)g3,(uint)g4); } }
Bu programn ekran kts 508

510 508 506 olmaldr. Gstericiler yalnzca tam saylarla

matematiksel ileme girerler. +, -, --, ++, -= ve += operatrleri gstericilerle kullanlabilir. void gstericiler matematiksel ileme girmezler. ki gsterici birbirinden karlabilir. Ancak bu durumda bir gsterici deil, long trnden bir nesne oluur. rnek:

using System;

class Gosterici { unsafe static void Main() { int* g1=(byte*)500; int* g2=(byte*)508; long fark=g2-g1; Console.WriteLine(fark); } }
Bu program sonucunda ekrana 2 yazlr. nk gstericilerde karma yaplrken u forml kullanlr:

(Birinci gstericinin adresi - kinci gstericinin adresi)/Ortak trn byte cinsinden boyutu
Bu formlden de anlyoruz ki yalnzca ayn trdeki gstericiler arasnda karma yaplabilir. Eer bu forml sonucunda bir tam say olumuyorsa ondalkl ksm atlr. Gstericilerle kullanlabilecek dier operatrler ==, <, > gibi karlatrma operatrleridir. Bu operatrler iki gstericinin adres bilgilerini karlatrp true veya false'tan uygun olann retirler.

[dzenle]fixed

anahtar szc

Garbage Collection mekanizmas snf nesnelerinin adreslerini program boyunca her an deitirebilir. Dolaysyla bu snf nesnesi zerinden eriilen ilgili snfa ait yap trnden olan zelliklerin de adresleri deiecektir. Ancak istersek bir snf nesnesi zerinden eriilen bir yap nesnesinin bir blok boyunca deimemesini isteyebiliriz. Bunu fixed anahtar szc ile yaparz. imdi klasik rnei yapalm (fixed'sz):

using System; class ManagedType { public int x; public ManagedType(int x) { this.x=x; } } class Gosterici { unsafe static void Main() { ManagedType mt=new ManagedType(5); int* g=&(mt.x) } }

Bu programn derlenmesine C# izin vermeyecektir. nk x bir snf nesnesidir ve snf nesnelerinin adresleri program boyunca deiebilir. Biz burada bu snf nesnesine ait olan bir zelliin (yap trnden) adresini aldk. Ancak muhtemelen program esnasnda nesnemizin adresi deiecek ve bu adrese baka veriler gelecek. te karkl engellemek iin C# bu programn derlenmesini engelledi. imdi rneimizi yle deitirelim:

using System; class ManagedType { public int x; public ManagedType(int x) { this.x=x; } } class Gosterici { unsafe static void Main() { ManagedType mt=new ManagedType(5); fixed(int* g=&(mt.x)) { //Bu blok boyunca x zelliinin adresi deitirilmeyecektir. } } }
Birden fazla zellii fixed yapmak iin:

ManagedType mt1=new ManagedType(5); ManagedType mt2=new ManagedType(10); fixed(int* g1=&(mt1.x)) fixed(int* g2=&(mt2.x)) { //Bu blok boyunca x zelliinin adresi deitirilmeyecektir. }
Ayn eyi yle de yapabilirdik:

ManagedType mt1=new ManagedType(5); ManagedType mt2=new ManagedType(10); fixed(int* g1=&(mt1.x), g2=&(mt2.x)) { //Bu blok boyunca x zelliinin adresi deitirilmeyecektir. }
[dzenle]Gstericiler

ile dizi ilemleri

Diziler bir System.Array snf trnden nesnedir. Dolaysyla diziler bir managed type'dr. Yani dizi elemanlarnn adreslerini fixed anahtar szcn kullanmadan elde edemeyiz. ok boyutlu diziler de dhil

olmak zere tm dizilerin elemanlar bellekte ardl sralanr. Bu hem performansta az da olsa bir art hem de az sonra dizi elemanlarnn bellekteki adreslerini alrken kolaylk salar. rnek program:

using System; class Gosterici { unsafe static void Main() { int[] a={1,2,3,4}; fixed(int* g=&a[0]) { for(int i=0;i<a.Length;i++) Console.WriteLine(*(g+i)); } } }
Bu program dizinin elemanlarn alt alta yazacaktr. Programda ncelikle dizinin ilk elemannn bellekteki adresini alp g gstericisine atadk. Sonra a dizisinin eleman says kadar dnen bir dng balattk. Dngnn her iterasyonunda ilgili gstericiyi birer birer artrdk. Yani adres her seferinde birer birer telendi. Gsterici aritmetiinde de grdmz gibi aslnda adresler 4'er bayt telendi. Eer gsterici aritmetiinde teleme tre baml olmayp teker teker olsayd dngde her dizinin trne gre farkl atlay miktar belirlememiz gerekecekti ve bu da olduka zahmetli olacakt. NOT: Gstericiler ile indeksleyici kullanlabilir. Gstericilerde u eitlikler vardr:

*(g+0) == g[0] *(g+1) == g[1] *(g+2) == g[2] *(g+3) == g[3] vb.

Yani indeksleyici alm bir gsterici demek ilgili gstericinin balang adresinin indeksleyicideki say kadar telenmi hlinin nesne karl demektir. Yani g[1] bir nesne belirtirken g+1 bir gsterici belirtir. Bir diziyle ayn dizinin ilk elemannn adresi birbiriyle ayndr. Bunu ispatlamak iin u program yazabiliriz:

using System; class Gosterici { unsafe static void Main() { int[] a={1,2,3,4}; fixed(int* g1=a, g2=&a[0]) { Console.WriteLine((uint)g1); Console.WriteLine((uint)g2);

} } }
Grdnz gibi bir diziyi bir gstericiye aktarmak iin & operatrn kullanmamza gerek kalmad. nk aslnda btn diziler ayn zamanda bir gstericidir. Bu program sonucunda ekrana iki tane birbiriyle ayn adres yazlacaktr.

[dzenle]Ynetilmeyen

diziler

imdiye kadar grdmz diziler System.Array snf trnden birer nesne olduklarna gre bunlar ynetilen dizilerdir. nk snflar ynetilen bir trdr. Yaplar, enum sabitleri, vs. ise ynetilmeyen trlerdir. Ynetilmeyen trlerle ilgili ilem yapmak daha hzldr. nk ynetilmeyen trlerde C# bellek sorumluluunu bize verir. Hatrlarsanz C# bir dizinin eleman says aldnda alma zamannda IndexOutOfRangeException istisnai durumunu veriyordu. Yani dizimizin kendine ait olmayan bir bellek blgesine mdahale etmesini engelliyordu. Bu ou durumda son derece gzel bir zelliktir. Ancak istersek C#'n byle bir durumda alma hatas vermemesini salayabiliriz. Bu ynetilmeyen dizilerle mmkn olur. Ynetilmeyen diziler ynetilen dizilere oranla daha hzl alr. Ynetilmeyen diziler stackalloc anahtar szcyle belirtilir. stackalloc bize bellekte istediimiz kadar alan tahsis eder ve bu alann balang adresini bir gsterici olarak dndrr. rnek:

int* dizi=stackalloc int[10];


Grdnz gibi new anahtar szc yerine stackalloc anahtar szc gelmi. Bu komut ile bellekte kendimize 10*sizeof(int)=40 baytlk alan ayrdk. rnek program:

using System; class Gosterici { unsafe static void Main() { int* dizi=stackalloc int[10]; for(int i=0;i<10;i++) Console.WriteLine("*(dizi+{0})={1}",i,dizi[i]); } }
imdi baka bir rnek:

using System; class Gosterici { unsafe static void Main() { int* dizi=stackalloc int[10]; for(int i=0;i<50;i++) Console.WriteLine("*(dizi+{0})={1}",i,dizi[i]); } }

Bu programda dizinin snrlar alm olmasna ramen program almaya devam eder. Ancak baka programlarn bellekteki verilerine de mdahale etmi oluruz. Bir programc iin pek tavsiye edilmeyen bir durumdur. Ayrca normal dizilerde olduu gibi stackalloc bir dizinin eleman saysnn derlenme zaman bilinmesi zorunlu deildir. stersek dizinin eleman saysn kullanc belirleyebilir.

[dzenle]Yap

trnden gstericiler

imdiye kadar int, double gibi temel veri trleri tipinden gstericiler oluturduk. Blmn en banda da sylediimiz gibi btn yaplardan gsterici oluturulabilir. Ancak bir art vardr: lgili yapnn iinde geri dn tipi bir snf olan zellik olmamaldr. Geri dn tipi bir snf olan metot ya da sahte zellik olabilir. Buradan anlyoruz ki int, double vb. yaplarn iinde geri dn tipi bir snf olan zellik yokmu.

[dzenle]->

operatr

-> operatr bir gsterici zerinden ilgili yapnn ye elemanlarna erimek iin kullanlr. imdi yukardaki bilgilerle bu bilgiyi bir rnek zerinde grelim:

using System; struct Yapi { //string k; ---> Bu kod eklenseydi program derlenemezdi. public int x; int s; public Yapi(int x, int s) { this.x=x; this.s=s; } public string Metot() { return "Deneme"; } public string Ozellik { set{} get{return "Deneme";} } } class Prg { unsafe static void Main() { Yapi a=new Yapi(2,5); Yapi* b=&a; Console.WriteLine(b->Metot()); //Grdnz gibi gstericiler zerinden ilgili yapnn ye elemanlarna eriebiliyoruz. Console.WriteLine(b->Ozellik); Console.WriteLine(b->x);

} }
Bildiiniz zere nesneler zerinden yaplarn ye elemanlarna erimek iin . operatrn kullanyorduk. Yani -> ile . operatrleri bir bakma benzeiyorlar.

[dzenle]Gstericiler

ve string tr

Stringlerin gstericiler iin zel bir anlam vardr. Char trnden herhangi bir gstericiye bir string atanabilir. Bu durumda gstericiye stringin ilk karakterinin bellekteki adresi atanr. Stringlerin karakterleri tpk diziler gibi bellekte ardl sralanr. Dolaysyla ilk karakterinin adresini bildiimiz bir stringin tm karakterlerini elde edebiliriz. rnek:

using System; class Stringler { unsafe static void Main() { fixed(char* g="Vikikitap") { for(int i=0;g[i]!='\0';i++) Console.WriteLine(g[i]); } } }
Grdnz gibi string bir snf olduu iin fixed anahtar szc kullanld. Ayrca programdaki

for(int

i=0;g[i]!='\0';i++) satr dikkatinizi ekmi olmal. Buradaki '\0' karakteri stringin sonuna gizlice
eklenenen bir karakterdir. Biz bu karakterden stringin bittiini anlyoruz.

C Sharp Programlama Dili/Assembly kavram


Vikikitap, zgr ktphane
< C Sharp Programlama Dili

Derlenmi exe ve dll dosyalarna assembly denir. alan programmz iinde bir assembly olabilecei gibi birden fazla assembly de olabilir. Programmzda birden fazla assembly olmas demek programmzn ilikide olduu bir ya da daha fazla dll dosyas mevcut demektir. System isim alanndaki AppDomain snf oklu assembly ilemleriyle ilgilenirken, System.Reflection isim alanndaki Assembly snf ise tek bir assembly ile ilgili ilemler yaplmasn salar. imdi bu iki snfn eitli zelliklerini inceleyelim:

AppDomain snfnn static CurrentDomain zellii o an zerinde allan assembly grubunu bir AppDomain nesnesi olarak dndrr.

AppDomain snfnn static olmayan GetAssemblies() metodu, ilgili AppDomain nesnesindeki btn assemblyleri bir Assembly dizisi olarak tutar.

Assembly snfnn static olmayan Location zellii ilgili assemblynin sabit diskteki yolunu string olarak verir. imdi bu teorik bilgileri bir rnek zerinde grelim:

using System; using System.Reflection; class Assemblyler { static void Main() { AppDomain ad=AppDomain.CurrentDomain; Assembly[] assembly=ad.GetAssemblies(); Console.WriteLine("Toplam assembly says: "+assembly.Length); for(int i=0;i<assembly.Length;i++) Console.WriteLine("Assembly yeri: "+assembly[i].Location); } }
Benim bilgisayarmda bu programn ekran kts yle oldu:

Toplam assembly says: 2 Assembly yeri: C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\mscorlib.dll Assembly yeri: C:\Documents and Settings\Bekir Oflaz\new2.exe
mscorlib.dll dosyas imdiye kadar sklkla kullandmz System isim alan ve bu isim alanna bal alt isim alanlarnn iinde bulunduu dosyadr. C# derlediimiz her dosyaya bu dosyay otomatik olarak ilikilendirir. Bu dosyann yolu kullandnz .Net Framework srmne bal olarak sizde deiebilir. Bazen programmzn ilikiye girdii dll dosyasnn da ilikiye girdii baka bir dll dosyas olabilir. Bu durumda AppDomain snfnn CurrentDomain zelliiyle oluturulan AppDomain nesnes ine sz konusu btn dll dosyalar dhildir. Ancak tabii ki farkl assemblyler ayn dll dosyasn kullanyorsa yalnzca bir tane dll AppDomain nesnesine dhil edilir. Ayrca AppDomain snfnn GetAssemblies() metodu ile oluturulan Assembly dizisinde sra esas programda karlalma srasna gredir. Eer programda System isim alan kullanlmsa ilk e mscorlib.dll'dir. Ondan sonra gelen e esas programmz, bundan sonra gelen eler ise karlalma srasna gre dll dosyalardr. Eer herhangi bir dll dosyasn programmza ilikilendirir ancak sz konusu dll'i programmzda kullanmazsak sz konusu assembly programmza dhil deilmi gibi hesaba katlr.

Assembly snfnn static GetExecutingAssembly() metodu ile o an alan assemblynin kendisi bir Assembly nesnesi olarak dndrlr.

Assembly snfnn static olmayan EntryPoint zellii ilgili assemblynin balang metodunu MethodInfo snf trnden bir nesne olarak dndrr. MethodInfo snfn ileride greceiz. Balang metodu altrlabilir exe dosyalarnda genellikle Main() metodudur. Dll dosyalarnda ise balang metodu yoktur. Bu yzden bu zellik dll dosyalar iin null deeri dndrr. imdi bu iki bilgiyi rnekleyelim:

using System; using System.Reflection; class Assemblyler { static void Main() { Assembly nesne=Assembly.GetExecutingAssembly(); Console.WriteLine("Assemblynin balang metodu: "+nesne.EntryPoint); } }

Yeri gelmiken sylemek istiyorum. Bir snfn ya da yapnn bir nesnesini Console.Write() ya da Console.WriteLine() metodu ile ekrana yazdrrsak aslnda o nesnenin ToString() metodunun geri dn deerini ekrana yazdrm oluruz. ToString() metodu normalde object snfna baldr ve ilgili nesnenin trn string olarak dndrr. Ancak tabii ki istersek kendi snf ya da yaplarmzda bu metodu override edip ilgili nesnemizin Console.Write() ya da Console.WriteLine() ile ekrana yazdrlrken nasl davranmas gerektiini ayarlayabiliriz. rnek:

using System; class Sinif { override public string ToString() { return "Deneme"; } } class Ana { static void Main() { Sinif a=new Sinif(); Console.WriteLine(a); } }
Bu program sonucunda ekrana Deneme yazlacaktr. stersek Sinif snfna yeni ye elemanlar ekleyip ekrana yazdrlacak eyin nesneye bal olmasn salayabiliriz. Bu rneimizde ekrana yazlacak ey nesneye bal deildir. Bu ipucundan sonra asl konumuza dnebililiriz.

Assembly snfnn static LoadFrom(string nesnesi dndrr. rnek:

assembly_yolu) metodu bir assembly

using System; using System.Reflection; class deneme { static void Main()

{ string yol=@"C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\mscorlib.dll"; Assembly nesne=Assembly.LoadFrom(yol); Console.WriteLine("Assemblynin balang metodu: "+nesne.EntryPoint); } }


Bu program sonucunda assemblynin balang noktas olarak ekrana hibir ey yazlmayacaktr. nk null demek yokluk demektir.

Assembly snfnn static olmayan GetTypes() metodu ilgili assemblydeki tm trleri (snf, yap, vb.) bir System.Type dizisi olarak dndrr. System.Type snfn ileride greceiz. Ancak imdilik buna basit bir rnek verelim:

using System; using System.Reflection; class deneme { static void Main() { AppDomain ad=AppDomain.CurrentDomain; Assembly[] assembly=ad.GetAssemblies(); for(int i=0;i<assembly.Length;i++) { Console.WriteLine("Assembly: "+assembly[i].Location); Console.WriteLine("Tr says: "+assembly[i].GetTypes().Length); Console.WriteLine("*******"); } } }
Bu program bende u kty verdi:

Assembly: C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\mscorlib.dll Tr says: 2319 ******* Assembly: C:\Documents and Settings\Bekir Oflaz\new2.exe Tr says: 1 *******
Buradan anlyoruz ki mscorlib.dll dosyasnda tam 2319 tr varm. Sizdeki .Net Framework srmne gre bu say deiebilir.

Assembly snfnn static olmayan GetType(string tr System.Type nesnesi olarak tutar. rnek:

Tr) metodu ilgili assemblydeki belirli bir

using System; using System.Reflection; class deneme { static void Main() { string yol=@"C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\mscorlib.dll"; Assembly nesne=Assembly.LoadFrom(yol); Type a=nesne.GetType("System.Console"); Console.WriteLine(a); } }
Grdnz gibi tr bal olduu isim alanyla belirtmemiz gerekir.

C Sharp Programlama Dili/Yansma


Vikikitap, zgr ktphane
< C Sharp Programlama Dili

Geen derste assembly kavramn ve assemblylerle kullanlan baz snflar incelemitik. imdi ise bir assemblydeki tr ve ye eleman bilgilerini alma zamannda elde etmek demek olan yansma konusunu inceleyeceiz. Konumuza tam giri yapmadan nce bir operatr ve bir metodu tantmak istiyorum:

typeof() operatr herhangi bir tr System.Type trne evirip tutar. rnek:

Type a=typeof(int);

GetType() metodu herhangi bir nesnenin trn System.RuntimeType trnden tutar. static deildir. object snfnn bir metodudur. Dolaysyla btn trlere kaltm yoluyla gemitir. rnek:

int a; Console.WriteLine(a.GetType());
Bu kod ekrana System.Int32 yazacaktr. System.RuntimeType snf System.Type snfndan tremitir. Dolaysyla bir Type nesnesine bir RuntimeType nesnesini atayabiliriz. Ancak System.RuntimeType snf private olarak bildirilmitir. Dolaysyla System.RuntimeType snfn kodlarmzda kullanamayz. imdi esas konumuza balayabiliriz.
Konu balklar
[gizle]

1 Type snf

2 MemberInfo snf 3 MethodInfo snf 4 ParameterInfo snf 5 ConstructorInfo snf 6 PropertyInfo, FieldInfo ve EventInfo snflar 7 alma zamannda metot arma

[dzenle]Type

snf

Type snf System isim alannda bulunan zet (abstract) bir snftr. Dolaysyla

Type t=new Type();


gibi bir ifade mmkn deildir. Type trnden nesneler belirli bir tr temsil ederler. Type snfndaki static olmayan IsClass, IsAbstract, IsEnum, IsInterface, IsNotPublic, IsPublic, IsSealed ve IsValueType zellikleri vardr. Bunlar aadaki koullar salanyorsa true, salanmyorsa false deer dndrr: IsClass lgili tr snfsa IsAbstract lgili tr zetse IsEnum lgili tr enumsa IsInterface lgili tr arayzse IsNotPublic lgili tr public deilse IsPublic lgili tr publicse IsSealed lgili tr sealed ise IsValuType lgili tr ynetilmeyen tr ise Ayrca Type snfnn static olmayan IsAssignableFrom(Type tr) metodu parametred eki tr nesnesinin ilgili tr nesnesine atanp atanamayacann anlalmas iin kullanlr. Atanabiliyorsa true, atanamyorsa false deer dndrr. rnek:

//yavru snfnn ana snfndan trediini varsayalm. Type a=typeof(ana); Type y=typeof(yavru); Console.WriteLine(a.IsAssignableFrom(y)); Console.WriteLine(y.IsAssignableFrom(a));
Bu kod alt alta True ve False yazacaktr.

[dzenle]MemberInfo

snf

Bir trdeki ye elemanlar temsil etmek iin kullanlr. zet bir snftr, dolaysyla new operatryle yeni MemberInfo nesnesi tanmlanamaz. MemberInfo snfnn nemli zellikleri:

Type DeclaringType lgili ye elemann iinde bulunduu tr Type trnden dndrr.

MemberTypes MemberType lgili ye elemann ne tr bir eleman olduunu MemberTypes enumu trnden dndrr. MemberTypes enumu Constructor, Method, Event, Field ve Property szcklerini ierir. Bunlar u anlamlara gelir: Constructor yapc metot Method metot Event olay Field zellik Property sahte zellik

string Name ilgili ye elemann ismini string olarak verir. Type snfnn GetMembers() metodu kullanlarak bir trdeki btn ye elemanlar MemberInfo trnden bir diziye aktarlr. Ayrca yine Type snfnn GetMember(string eleman) metodu, ismi belirtilen string olan ye elemanlar bir MemberInfo dizisi olarak dndrr. rnek bir program:

using System; using System.Reflection; class deneme { static void Main() { Type t=typeof(string); MemberInfo[] elemanlar=t.GetMembers(); foreach(MemberInfo mi in elemanlar) { if(mi.MemberType==MemberTypes.Method) Console.WriteLine(mi.Name); } } }
Bu program String snfndaki tm metotlar ekrana yazacaktr.

[dzenle]MethodInfo

snf

Trlerdeki metotlar temsil etmek iin kullanlan bir snftr. Bu snf MemberInfo snfndan tremi olan MethodBase snfndan tremitir. Dolaysyla MemberInfo snfndaki tm ye elemanlar tar. Bu snfta ek olarak metotlarn geri dn tipini Type trnden dndren ReturnType zellii ve metotlarn parametrelerini ParameterInfo snf trnden bir dizi olarak dndren GetParameters() metodu da bu snfta bulunan ye elemanlardandr. Type snfnn GetMethods() metodu bir trdeki tm metotlar bir MethodInfo snf dizisi trnden dndrr. Ayrca Type snfnn GetMethods(BindingFlags kriterler) metodu bir trdeki belirli kriterlere uyan metotlar bir MethodInfo dizisi olarak dndrr. BindingFlags System.Reflection isim alanndaki bir enumdur. BindingFlags enumundaki nemli szckler:

DeclaredOnly Yalnzca ilgili trn kendi metotlar diziye aktarlr. Kaltm yoluyla gelenler aktarlmaz. NonPublic public olarak iaretlenmemi metotlar Public public olarak iaretlenmi metotlar Static static olarak iaretlenmi metotlar

Type snfnn GetMethod(string metotismi) metodu ilgili trdeki stringte verilen metodu MethodInfo trnden dndrr.

MethodInfo snfndaki IsStatic zellii ilgili metot staticse true deilse false deer dndrr. rnek program:

using System; using System.Reflection; class Yansima { static void Main() { Type t=typeof(Array); MethodInfo[] metotlar=t.GetMethods(); foreach(MethodInfo mi in metotlar) { Console.WriteLine("Metot ismi: "+mi.Name); Console.WriteLine("Geri dn tipi: "+mi.ReturnType); Console.WriteLine(mi.IsStatic?"Static":"Static deil"); } Console.WriteLine("Toplam metot: "+metotlar.Length); } }
Farkndaysanz programmzda ok nceden grdmz ?: operatrn kullandk. Bu operatr if ile 3-4 satrda yazabileceimiz kodu tek satra indirdi. Baka bir rnek:

using System; using System.Reflection; class Yansima { static void Main() { AppDomain ad=AppDomain.CurrentDomain; Assembly[] assembly=ad.GetAssemblies(); Type[] tipler=assembly[0].GetTypes(); foreach(Type tip in tipler) { Console.WriteLine("Tip: "+tip.Name); Console.WriteLine("Metot says: "+tip.GetMethods().Length); Console.WriteLine();

} } }
MethodInfo snfnn IsStatic zellii yannda IsAbstract, IsConstructor, IsPublic, IsPrivate, IsVirtual zellikleri de mevcuttur.

[dzenle]ParameterInfo

snf

Metotlarn parametreleriyle ilgilenen bir snftr. Bir metodun parametrelerini elde etmek iin MethodInfo snfnn GetParameters() metodu kullanlabilir. MethodInfo snfnn GetParameters() metodu bir ParameterInfo dizisi dndrr. ParameterInfo snfnn ParameterType zellii ilgili parametrenin trn Type trnden dndrr. Yine ParameterInfo snfnn Name zellii ilgili parametrenin ismini string olarak dndrr.

[dzenle]ConstructorInfo

snf

Bir trn yapc metoduyla ilgilenir. Type snfnn GetConstructors() metodu bu snf trnden bir dizi dndrr. Bu snfa ait en nemli metot GetParameters() tr. ParameterInfo snf trnden bir dizi dndrr.

[dzenle]PropertyInfo,

FieldInfo ve EventInfo snflar

Bu snflar srasyla bir trdeki sahte zellikler, normal zellikler ve olaylarla ilgilenir. Type snfnn GetProperties(), GetFields() ve GetEvents() metotlar bu snflar trnden dizi dndrrler. Her snfta da Name zellii mevcuttur. EventInfo snfnn u nemli zellikleri mevcuttur.

IsMulticast Olayn multicast olup olmadn verir. EventHandlerType Olayn trn RuntimeType trnden verir. (Bir temsilci) NOT: Type snfnn GetMethods(), GetProperties() gibi metotlar yalnzca public ye elemanlar dndrr. NOT: Grdmz MethodInfo, EventInfo gibi snflarn tamam System.Reflection isim alanndadr. Yalnzca Type System isim alanndadr. Yine konuyu ilerken karmza kan enumlar da System.Reflection isim alanndadr.

[dzenle]alma

zamannda metot arma

imdiye kadar metotlarmz derleme zamannda ardk. Ancak artk System.Reflection isim alanndaki snflar sayesinde metotlarmz alma zamannda arabileceiz. Bunun iin MethodInfo ve ConstructorInfo snflarnda bulunan

object Invoke(object nesne,object[] parametreler)


metodunu kullanacaz. Eer ConstructorInfo snfndaki metodu arrsak alma zamannda nesne oluturmu oluruz. Invoke() metodunun birinci parametresi metodun hangi nesne zerinden

arlacan belirtir. kinci parametre ise arlacak metoda verilec ek parametreleri ieren object tipinden bir dizidir. alma zamannda arlacak metot static ise birinci parametre null olmaldr. Benzer ekilde arlacak metot parametre almyorsa ikinci parametre null olmaldr. Programmz u ekilde:

using System; using System.Reflection; class Deneme { public static int Topla(int a, int b) { return a+b; } } class Ana { static void Main() { object[] parametreler={9,5}; int a=(int)MetotInvoke("Topla","Deneme",parametreler); Console.WriteLine(a); } static object MetotInvoke(string metot,string tip,object[] args) //tip ile metodun hangi trn iinde olduunu anlyoruz. { Type t=Type.GetType(tip); //Aldmz string hlindeki tipi Type trne dntryoruz. if(t==null) throw new Exception("Tr bulunamad"); MethodInfo m=t.GetMethod(metot); //Aldmz string hlindeki metodu MethodInfo trne dntryoruz. if(m==null) throw new Exception("Metot bulunamad"); if(m.IsStatic) return m.Invoke(null,args); object o=Activator.CreateInstance(t); return m.Invoke(o,args); } }
Bu program sonucunda ekrana 14 yazlacaktr. Burada MetotInvoke() metodu kendimizin oluturduu bir metottur. Kendiniz bu metoda farkl isimler verebilirsiniz. Bu metodun Invoke() metoduna iletilecek veriler iin bir "ulak" vazifesi grmektedir. Yani bu metodun yapt tek i Invoke() metoduna gerekli dnmleri yaparak ve gerekli hata durumlarn gz nnde bulundurrarak gerekli verileri iletmektir. Programn kritik satrlar unlardr:

if(m.IsStatic)

return m.Invoke(null,args); object o=Activator.CreateInstance(t); return m.Invoke(o,args);


Birinci ve ikinci satrda altrlmak istenen metodun static mi deil mi olduu kontrol ediliyor. Eer staticse metoda herhangi bir nesne zerinden eriilmiyor. nc satrda System isim alanndaki Activator snfndaki CreateInstance() metoduyla yeni bir nesne oluturuluyor. Bu metot parametre olarak nesnenin hangi trden oluturulacan belirten Type trden bir tr alr. Son satrda ise oluturulan sz konusu nesneyle ve parametrelerle metot arlyor.

C Sharp Programlama Dili/Nitelikler


Vikikitap, zgr ktphane
< C Sharp Programlama Dili

Nitelikler koda bir eleman hakknda ekstra bilgi eklemek iin kullanlan elemann bildiriminden hemen nce yazlan zel kodlardr. C#'ta hazr nitelikler olduu gibi kendi niteliklerimizi de yazabiliriz. imdi isterseniz nce hazr niteliklerden balayalm.
Konu balklar
[gizle]

1 Hazr nitelikler

o o o o

1.1 Conditional nitelii 1.2 DllImport nitelii 1.3 Obsolote nitelii 1.4 AttributeUsage nitelii

2 Kendi niteliklerimizi oluturmak

[dzenle]Hazr nitelikler
[dzenle]Conditional nitelii
Bu nitelik yalnzca metotlarla kullanlr. nilemci komutlarnda grdmz sembol programda varsa ilikili metot arlr, nitelikteki sembol programda yoksa metot arlmaz. Bu nitelik System.Diagnostics isim alannda bulunur. rnek program:

#define TURKCE using System; using System.Diagnostics; class Deneme { [Conditional("TURKCE")] static void Turkce()

{ Console.WriteLine("Bu program Trkedir."); } [Conditional("ENGLISH")] static void English() { Console.WriteLine("Bu program ngilizcedir."); } static void Main() { Turkce(); English(); } }
Bu program ekrana programn Trke olduunu yazacaktr. Yani program hata vermedi, yalnzca English() metodunun altrlmasn engelledi. nk ilgili sembol programda yoktu.

[dzenle]DllImport nitelii
Bu nitelik bir metodun .Net ortamnda gelitirilmediini belirtmek iin kullanlr. .Net ktphanesini deil de Windows API'lerini kullanabilmek iin bu nitelik gereklidir. Ayrca ilgili metodun dardan alndn belirtmek iin extern anahtar szcn kullanrz. Bu nitelik System.Runtime.InteropServices isim alannda bulunur. DllImport niteliini bir Windows API fonksiyonu olan MessageBox() zerinde grebiliriz. Bu fonksiyonu C# programmzda kullanabilmek iin DllImport nitelii ile belirtmeli, ayrca extern anahtar szc ile de ayr bir belirtim yapmalyz. MessageBox Windows programlarnda ska grebileceimiz uyar penceresi anlamna gelir ve zerinde eitli uyar metinlerinin olduu bir uyar penceresi karr. Kullanc ekrandaki "Tamam" ve/veya "ptal" gibi butonlar tklayabilir. imdi bunlar kodsal olarak rnekleyelim.

using System; using System.Runtime.InteropServices; class Nitelikler { [DllImport("User32.dll")] public static extern int MessageBox(int aile, string mesaj, string baslik, int tip); static void Main() { MessageBox(0,"Bu bir uyar mesajdr","C#",1); } }
Grdnz gibi kendi metodumuzu oluturmu gibi gzkyoruz. Ancak aslnda tek yaptmz ey User32.dll dosyasndan ilgili fonksiyonu alp programmza bir metotmu gibi geirmek. MessageBox() metodunun son parametresini 0-6 aralnda bir tam say yapp deiik buton kombinasyonlar elde edebilirsiniz.

[dzenle]Obsolote nitelii
Bu nitelikle bir metodun arlmas durumunda hata ya da uyar verilmesi salanr. nilemci komutlarndaki #error ve #warning komutlarna benzer. ki kullanm vardr:

[Obsolote("Uyar mesaj")]
veya

[Obsolote("Uyar mesaj", bool hata)]


Birinci rnekte eer ilgili metot arlrsa derleyici uyar verecektir. Yani program derlenecektir. kinci rnekte ise eer hata parametresi true ise program hata verecektir. Yani program derlenmeyecektir. Eer ikinci rnein hata parametresi false olursa birincisinden fark kalmaz. lk parametreler ise ekrana yazlan hata metnini belirlememizi salar. Obsolote nitelii System isim alannda bulunur.

[dzenle]AttributeUsage nitelii
Bu nitelik ile kendi yazdmz niteliklerin hangi elemanlarla kullanlabileceini belirleriz. Parametre olarak AttributeTargets isimli enum nesnesi almaktadr. Bu enumun ierdii szckler unlardr: All, Assembly, Class, Constructor, Delegate, Enum, Event, Field, Interface, Method, Module, Parameter, Property, ReturnValue, Struct. Bu szcklerden tek anlamn karamadnz tahminimce Module'dr. Module szc isim alanlarn ifade eder. rnek

[AttributeUsage(AttributeTargets.Method)]
Burada niteliimizin yalnzca metotlara uygulanabileceini belirttik. imdilik buna kafa takmanza gerek yok. Az sonra kendi niteliklerimizi olutururken AttributeUsage niteliini uygulamal olarak greceksiniz.

[dzenle]Kendi niteliklerimizi oluturmak


Nitelikler aslnda System.Attribute snfndan tretilmi snflardan baka bir ey deildir. O hlde biz de kendi niteliklerimizi System.Attribute snfndan tretme yaparak oluturabiliriz. rnek:

using System; [AttributeUsage(AttributeTargets.Method)] class KendiNiteligimiz:Attribute { public string Mesaj; public KendiNiteligimiz(string mesaj) { Mesaj=mesaj; } } class AnaProgram { [KendiNiteligimiz("Mesajmz")] static void Metot(){} static void Main(){} }

Bu programda kendi niteliimizi oluturduk ve bu niteliimizi bir metot zerinde uyguladk. Niteliklerle ilgili dier ilgin bir nokta ise nitelii kullanrken parametre verirken nitelikteki zelliklere deer verilebilmesidir. rnein:

[KendiNiteligimiz("Mesajmz",konu="C#",no=5.6)]
Burada niteliimiz yalnzca bir parametre almasna ramen dier parametreler nitelikteki public zelliklere deer atamtr. Bunu bir rnek zerinde grelim:

using System; [AttributeUsage(AttributeTargets.Method)] class OzelNitelik:Attribute { public string Mesaj; public int No; public string Konu; public OzelNitelik(string mesaj) { Mesaj=mesaj; } } class Deneme { [OzelNitelik("Mesajmz",No=5,Konu="C#")] static void Metot(){} static void Main(){} }
lk parametre normal parametre olmaldr. Dierlerinden bazlar ya da tamam olmayabilir. lk parametre dndakilerin kendi arasndaki sras nemli deildir. Bir elemana ilikin nitelikleri yansma yoluyla elde etmek iin Attribute snfnn static GetCustomAttribute() metodu kullanlabilir. rnek:

using System; class Yansima { static void Main() { Type t=typeof(Array); Attribute[] dizi=Attribute.GetCustomAttributes(t); foreach(Attribute a in dizi) Console.WriteLine(a); } }
Benim bilgisayarmda program u kty verdi:

System.SerializableAttribute

System.Runtime.InteropServices.ComVisibleAttribute
Yani System.Array snf bu iki nitelii kullanyormu.

C Sharp Programlama Dili/rnekler


Vikikitap, zgr ktphane
< C Sharp Programlama Dili

Bu ksmda yeni bir ey renmeyeceiz. Sadece nceki grdmz konular pekitirecek birka rnek yapacaz.
Konu balklar
[gizle]

1 rnek-1 2 rnek-2

o o o

2.1 Arayz DLL'ini yazma 2.2 Eklentiyi yazma 2.3 Esas programmz yazma

[dzenle]rnek-1
Bu rneimizde kendimizi C# programclarnn faydalanmas iin DLL hazrlayan bir programc gibi dneceiz. Bu DLL'de bir snf ve bu snfn iinde de iki metot olacak. Bu metotlardan birisi toplama, birisi arpma yapacak. Ayrca DLL'de bu iki metoda ek olarak bu iki metodun isimlerinin listesini tutan bir metot ve DLL'i kullanan programcnn parametreye verdii metoda gre ilgili metodun ne ie yaradn string olarak tutan bir metot daha olacak. imdi DLL'imizi yazmaya balayabiliriz.

using System; using System.Reflection; public class Islem { [Nitelik("Toplamaya yarar")] public static int Topla(int a,int b) { return a+b; } [Nitelik("arpmaya yarar")] public static int Carp(int a,int b) { return a*b; }

[Nitelik("Bu snftaki metotlar listeler")] public static string MetotListesi() { Assembly a=Assembly.GetExecutingAssembly(); Type[] t=a.GetTypes(); MethodInfo[] mi=t[0].GetMethods(BindingFlags.Static|BindingFlags.Public|BindingFlags .Instance|BindingFlags.DeclaredOnly); string GeriDonus=""; foreach(MethodInfo m in mi) GeriDonus+=m.Name+"\n"; return GeriDonus; } [Nitelik("Metotlar hakknda bilgi verir.")] public static string bilgi(string metot) { Type t=typeof(Islem); MethodInfo mi=t.GetMethod(metot); Attribute[] dizi=Attribute.GetCustomAttributes(mi); Nitelik a=(Nitelik)dizi[0]; return ((mi.IsStatic)?"static ":"")+mi.ToString()+" --"+a.Bilgi; } } [AttributeUsage(AttributeTargets.Method)] class Nitelik:Attribute { public string Bilgi; public Nitelik(string bilgi) { Bilgi=bilgi; } }
Bu DLL dosyasn edinen programcnn bu DLL dosyasn refere ederek yle bir program yazdn dnrsek:

using System; class ana { static void Main() { Console.WriteLine(Islem.Topla(5,10)); Console.WriteLine(Islem.Carp(5,10)); Console.WriteLine(Islem.MetotListesi()); Console.WriteLine(Islem.bilgi("Topla")); Console.WriteLine(Islem.bilgi("Carp")); Console.WriteLine(Islem.bilgi("MetotListesi")); Console.WriteLine(Islem.bilgi("bilgi"));

} }
Bu programn ekran kts yle olur.

15 50 Topla Carp MetotListesi bilgi static Int32 Topla(Int32, Int32) --- Toplamaya yarar static Int32 Carp(Int32, Int32) --- arpmaya yarar static System.String MetotListesi() --- Bu snftaki metotlar listeler static System.String bilgi(System.String) --- Metotlar hakknda bilgi verir.
Programdaki en kritik nokta

Nitelik a=(Nitelik)dizi[0];
satrdr. Burada Attribute trnden olan dizi[0], bu snftan treyen Nitelik snfna bilinli olarak dntrld. Bilinsiz dntrlemezdi. Ayrca u satr da ilginizi ekmi olmal:

MethodInfo[] mi=t[0].GetMethods(BindingFlags.Static|BindingFlags.Public|BindingFlags .Instance|BindingFlags.DeclaredOnly);


Bu satrda ilgili trdeki static, public, static olmayan ve treyerek gelmemi olan metotlar mi dizisine atanyor. Aslnda burada tek yapmak istediimiz object snfndan gelen metotlar elemekti. A ncak bu metot yalnzca BindingFlags.DeclaredOnly'yi kabul etmez. Metotlarn dier zelliklerinin de ak ekilde belirtilmesi gerekir. Eer bu enumu hi kullanmasaydk bu sefer tm public metotlar diziye atanacakt.

[dzenle]rnek-2
Bu rneimizde plugin (eklenti) tabanl bir program yazacaz. Yani isteyen programclar DLL yazarak programmzn yapabilecei eyleri artrabilecekler. Sonra yazdklar DLL'i programmza tantacaklar. Tabii ki DLL'i tanma iini programmz yapacak. DLL'i yazan kii sadece programmza DLL'i tanma komutu verecek. Ancak programmzn tanyaca DLL'in bir standart olacak. rnein metot isimleri, metotlarn geri dn tipleri vs. bizim istediimiz gibi olacak. Bu yzden iinde istediimiz arayzn olduu DLL'i programclar nce edinecek sonra bu arayze gre DLL'i yazacaklar. br trl programmzda karmaa oluurdu. imdi ncelikle iinde arayzn olduu ve programclara datacamz DLL'imizi yazalm:

[dzenle]Arayz DLL'ini yazma


public interface Gereksinimler { string Bilgi(); }
Bu dosyay DLL olarak derleyelim. Grdnz gibi programclarn yazacaklar DLL Bilgi() isminde bir metot iermeli. Arayzler konusundan hatrlayacanz gibi bir arayzn elemanlar eriim belirleyicisi alamaz ve static olamaz. Ayrca arayz uygulayan snf arayzdeki yeleri kendine public, static deil, doru geri dn tipinde, parametre says, sras ve trleri de ayn olacak ekilde geirmelidir.

[dzenle]Eklentiyi yazma
imdi kendimizi eklentiyi yazan programc yerine koyalm. Arkadamzdan arayz DLL'ini edindik ve bu DLL'e gre DLL'imizi yazacaz. Yine snfa Sinif ismini vermemiz gerektiini arkadamzdan rendik.

public class Sinif:Gereksinimler { public string Bilgi() { return "Eklentili versiyon."; } }


Artk eklentiyi yazdk. Tabii ki bu DLL derlenirken arayz DLL'i ile ilikilendirilmelidir.

[dzenle]Esas programmz yazma


imdi esas programmza sra geldi. Bu program eklenti ykleyip yklemeyeceimizi soracak. Eer yklemek istersek yolunu isteyecek. DLL'in yolunu verdikten sonra artk programmz ilgili DLL'deki ktphaneyi kullanabilir hle gelecek. imdi program yazmaya balayabiliriz:

using System; using System.Reflection; class AnaProgram { static void Main() { Console.Write("Eklenti kurmak istiyor musunuz? (e|h): "); string a=Console.ReadLine(); if(a=="h") { Console.WriteLine("Eklenti kurulmad."); return; } else if(a=="e") { EklentiYukleme(); } else

throw new Exception("Yalnzca e veya h girmeliydiniz."); } static void EklentiYukleme() { Assembly a; try { Console.Write("Ltfen DLL dosyasnn sabit diskteki adresini girin: "); a=Assembly.LoadFrom(Console.ReadLine()); } catch { Console.WriteLine("Belirttiiniz dosya yok. Ltfen tekrar deneyiniz."); EklentiYukleme(); return; } Type[] t=a.GetTypes(); MethodInfo[] mi=t[0].GetMethods(); if(t[0].Name!="Sinif"||mi[0].ToString()!="System.String Bilgi()") throw new Exception("Eklentideki elemanlar/trler uyumsuz"); Console.WriteLine(mi[0].Invoke(Activator.CreateInstance(t[0]),null)); } }
Bu program kullancdan bir DLL dosyas adresi ald. Bu adresteki DLL'i bir Assembly nesnesi olarak tuttu. Sonra bu Assembly nesnesindeki tipleri bir Type dizisi olarak tuttu. Sonra bu Type dizisinin ilk elemann bir MethodInfo dizisi olarak tuttu. Sonra ilgili trn ve metot dizisinin ilk elemannn istenildii gibi olup olmad kontrol edildi. Eer istenilen tr ve metotsa ilgili metot arld. Eer istenilen tr ve metot deilse hata verip program sonlandrdk.

C Sharp Programlama Dili/ablon tipler


Vikikitap, zgr ktphane
< C Sharp Programlama Dili

imdiye kadar bir snftaki tr bilgileri snf bildirimi esnasnda belliydi. Ancak artk ablon tipler sayesinde snftaki istediimiz trlerin nesne yaratm srasnda belli olmasn salayacaz. stelik her nesne iin sz konusu trler deiebilecek. ablon tipler sayesinde trden bamsz ilemler yapabileceiz. imdi ablon tipleri bir rnek zerinde grelim:

using System; class Sinif<SablonTip>

{ public SablonTip Ozellik; } class AnaProgram { static void Main() { Sinif<int> s1=new Sinif<int>(); s1.Ozellik=4; Sinif<string> s2=new Sinif<string>(); s2.Ozellik="deneme"; Console.WriteLine(s1.Ozellik+" "+s2.Ozellik); } }
Bu programda s1 nesnesinin Ozellik zelliinin geri dn tipi int, ancak s2 nesnesinin Ozellik zelliinin geri dn tipi stringdir. Benzer eyi metotlarn geri dn tipleri, metotlarn parametre tipleri vb . iin de yapabilirdik. Bu programdaki Sinif snf trden bamsz bir snftr. Yani bu snfla istediimiz trdeki verilerle alabiliriz. Bu programclar iin byk esneklik salar. Snflar, arayzler, yaplar, temsilciler ve metotlar ablon tip olarak bildirilebilir.
Konu balklar
[gizle]

1 Snf ar ykleme 2 ablon tipler arasnda treme 3 ablon tipler ve arayzler 4 ablon tiplerin metotlara etkisi 5 default operatr 6 Kstlar 7 ablon tipli metotlar

7.1 ablon tipi karsama

8 ablon tipli temsilciler 9 null deer alabilen yap nesneleri 10 ? iareti 11 ?? operatr

[dzenle]Snf

ar ykleme

Bir snf (veya yap, arayz vs.) birden fazla ablon tip alabilir. rnek:

class Sinif<SablonTip1, SablonTip2>


Bu durumda bu snf trnden nesne unun gibi yaratlr:

Sinif<int,string> s=new Sinif<int,string>();

Ayn isim alannda isimleri ayn olsa bile farkl sayda ablon tipi olan snflar bildirilebilir. Buna snf ar ykleme denir.

[dzenle]ablon

tipler arasnda treme

ablon tipler arasnda treme ile ilgili ok fazla kombinasyon dnebiliriz. Ancak biz burada karmza en ok kacak iki kombinasyondan bahsedeceiz:

class AnaSinif<T> { //... } class YavruSinif<T,Y>:AnaSinif<T> { //Grdnz gibi yavru snf en az ana snfn ablon tipini ierdi. } class YavruSinif2<T>:AnaSinif<int> { /*Grdnz gibi yavru snf ana snfn ablon tipine belirli bir tr koydu. Bylelikle yavru snftaki ana snftan gelen T harfleri int olarak deitirilecektir.*/ }
[dzenle]ablon

tipler ve arayzler

Arayzlerin de ablon tipli versiyonlar yazlabilir. rnein System.Collections.Generic isim alannda birok ablon tipli arayz bulunmaktadr. Bunlardan birisi de IEnumerable arayznn ablon tipli versiyonudur. IEnumerable arayznn ablon tipli versiyonu aadaki gibidir.

interface IEnumerable<T>:IEnumerable { IEnumerator<T> GetEnumerator(); }


Buradan anlyoruz ki bu arayz uygulayan snf geri dn tipi IEnumerator<T> olan GetEnumerator() metodunu ve IEnumerable arayznn ierdii tm yeleri iermeli. Bu arayz bir snfta yle uygulayabiliriz:

class Sinif:IEnumerable<int> { IEnumerator IEnumerable.GetEnumerator() { //... } IEnumerator<int> IEnumerable<int>.GetEnumerator() { //... } }

Burada hem IEnumerable hem de IEnumerable<T> arayzlerinin metotlar uyguland. nk IEnumerable<T> arayz, IEnumerable arayznden tremiti.

[dzenle]ablon

tiplerin metotlara etkisi

Bildiiniz gibi snf dzeyinde bir ablon tip belirlediimizde bu ablon tip metotlarn geri dn tipine, parametre tiplerine koyulabilir. Ancak bunun sonucunda bazen bir akma oluabilir. rnein:

class Sinif<T> { public int Metot(T a) { return 0; } public int Metot(int a) { return 1; } }
Bu snf trnden nesneyi yle tanmlayp kullanrsak;

Sinif<int> a=new Sinif<int>(); Console.WriteLine(a.Metot(10));


Sizce ne olur? Bu gibi bir durumda Metot(int a) metodu alr. Yani normal tipli versiyon ablon tipli versiyonu gizler. NOT: ablon tipler metotlarla kullanld gibi zellik, indeksleyici ve olaylarla da kullanlabilir.

[dzenle]default

operatr

Bildiimiz gibi ablon tipler herhangi bir tipi temsil ederler. Bu yzden C#, yalnzca baz trlere zg olan operatrler (+, -, *, ...) kullanlmasna izin vermedii gibi ablon tip trnden bir nesne yaratlp bu nesneye bir deer verilmesine engel olur. rnekler:

class Sinif<T> { public int Metot(T a) { return a+2; } }


Bu snf derlenmez. nk T tipinin hangi tip olduunu bilmiyoruz. + operatr bu tip iin ar yklenmi olmayabilir. Bu yzden C# bu gibi tehlikeli durumlar nlemek iin bu tr bir kullanm engeller. Baka bir kullanm:

class Sinif<T> { public int Metot(T a)

{ T nesne=0; } }
Yine burada da bir hata sz konusudur. nk her tipten nesneye 0 atanmayabilir. Benzer ekilde yap nesnelerine de null deer atanamaz. Gelelim default operatrne. default operatr bir ablon tipin varsaylan deerini elde etmek iin kullanlr. rnek:

class Sinif<T> { public void Metot() { T nesne=default(T); } }


Varsaylan deer baz trler iin 0 (int, short, float vs.) baz trler iin null (tm snflar) bool tr iin de false'tur.

[dzenle]Kstlar
Daha nce ablon tip trnden nesnelerle herhangi bir operatr kullanlamayacn, bu ablon trden nesnelere herhangi bir sabit atanamayacan vs. sylemitik. Bunlara paralel olarak ablon tr nesneleriyle herhangi bir ye de (metot, zellik vs.) altramayz. nk ablon tipin ne olduunu bilmediimiz iin olmayan bir metodu altrmaya alyor olabiliriz. Tm bunlarn sebebi aslnda ablon snf trnden nesne yaratrken ablonu herhangi bir tr yapabilmemizdi. Eer ablona koyulabilecek trleri kstlarsak bunlar yapabiliriz. C#'ta u kstlar bulunmaktadr: struct ablon tip yalnzca yaplar olabilir. class ablon tip yalnzca snflar olabilir. new() ablon tip yalnzca nesnesi yaratlabilen tiplerden olabilir. (tr abstract, static, vb. olamaz) tretme ablon tip mutlaka belirtilen bir trden tremi olmaldr. interface ablon tip mutlaka belirtilen bir arayz uygulamaldr. Kstlar where anahtar szcyle yaplmaktadr. imdi tretme kstna bir rnek verelim:

class A{} class B:A{} class C:A{} class D<T> where T:A{} class AnaProgram { static void Main() { D<B> nesne1=new D<B>(); D<C> nesne2=new D<C>(); //Aadaki olmaz. //D<int> nesne3=new D<int>();

} }
Treme kst sayesinde ablon tip nesnesiyle bir metodu arabiliriz. Bunun iinde ana snfa o metodu koyarz, bu snftan treyen yavru snflarda o metodu override ederiz. Son olarak ablon tipe ana snftan treme zorunluluu getiririz. Ana snftan treyen btn snflar sz konusu metodu ierecei iin artk C#, bu metodu ablon tip nesneleri zerinden armamza izin verecektir. Ancak halen new operatryle ablon tip trnden nesne oluturamayz. Bunun iin ablon tipe new() kstn eklemeliyiz. Yani ablon tipe yalnzca nesnesi oluturulabilen trler koyulabilecek. rnek :

class Sinif<T> where T:new() {}


Artk bu snfn iinde T trnden nesneleri new operatryle oluturabiliriz. Tabii ki C# ablon tipe nesnesi oluturulamayan bir tr koyulmasn engelleyecektir. Baka bir nemli kst ise arayz kstdr. Arayz kst sayesinde ablon tipe koyulan tipin mutlaka belirli bir arayz kullanm olmasn salarz. rnek program:

using System; class Karsilastirici<T> where T:IComparable<T> { public static int Karsilastir(T a,T b) { return a.CompareTo(b); } } class Program { static void Main() { int s1=Karsilastirici<int>.Karsilastir(4,5); int s2=Karsilastirici<float>.Karsilastir(2.3f,2.3f); int s3=Karsilastirici<string>.Karsilastir("Ali","Veli"); int s4=Karsilastirici<DateTime>.Karsilastir(DateTime.Now,DateTime.Now.AddDa ys(1)); Console.WriteLine("{0} {1} {2} {3}",s1,s2,s3,s4); } }
Bu program ekrana -1

0 -1 -1 ktsn verecektir. .Net Framework ktphanesindeki IComparable

arayznde CompareTo() metodu bulunmaktadr. Dolaysyla bu arayz uygulayan her snfta da bu metot bulunur. Bu sayede de C# ablon tip nesnesinden ilgili metodun arlmasna izin vermitir. Dier nemli iki kst ise ablon tipe yalnzca bir snf koyulabilmesini salayan class ve ayn eyi yaplar iin yapan struct kstlardr. rnekler:

class Sinif1<T> where T:class{} class Sinif2<T> where T:struct{}

Tabii ki bir ablon tipe birden fazla kst eklenebilir. Bu durumda kstlar virglle ayrlr. rnek:

class Sinif<T> where T:class,IComparable,new(){}


Kstlarda dierlerinin sras nemli deildir. Ancak -varsa- new() kst en sonda olmaldr. Bir snfa eklenen birden fazla ablon tip varsa her biri iin ayr ayr kstlar koyulabilir. rnek:

class Sinif<T,S> where T:IComparable,IEnumerable where S:AnaSinif


NOT: Main() metodu mutlaka ablon tipli olmayan bir snfn iinde olmaldr. Ayrca Main() metodu ya bir snfn iinde ya da bir yapnn iinde olmaldr. Dier bir deyile alabilir her program en az bir snf ya da yap iermelidir.

[dzenle]ablon

tipli metotlar

imdiye kadar ablon tipler snf seviyesinde tanmlanmt. Halbuki ablon tipler metot ve temsilci dzeyinde de tanmlanabilir. rnek:

using System; class karsilastirma { static void Main() { Console.WriteLine(EnBuyuk<int>(4,5)); Console.WriteLine(EnBuyuk<string>("Ali","Veli")); } static T EnBuyuk<T>(T p1,T p2) where T:IComparable { T geridonus=p2; if(p2.CompareTo(p1)<0) geridonus=p1; return geridonus; } }
Bu program alt alta 5 ve Veli yazacaktr.

[dzenle]ablon

tipi karsama

Az nceki rnein sadece Main() metodunu alalm:

static void Main() { Console.WriteLine(EnBuyuk<int>(4,5)); Console.WriteLine(EnBuyuk<string>("Ali","Veli")); }


Burada parametrelerin trleri belli olduu hlde ayrca int ve string trlerini de belirttik. stersek bunu yle de yazabilirdik:

static void Main() {

Console.WriteLine(EnBuyuk(4,5)); Console.WriteLine(EnBuyuk("Ali","Veli")); }
Bu programda metot yle dnecektir: "Benim parametrelerim T trnden, o hlde yalnzca parametreme bakarak T'nin hangi tr olduunu bulabilirim." Grdnz gibi metotlarn ar ykleyerek saatlerce uraarak yazabileceimiz programlar ablon tipli metotlar kullanarak birka dakikada yazabiliyoruz.

[dzenle]ablon

tipli temsilciler

Temsilciler de ablon tip alabilirler. Bu sayede temsilcinin temsil edebilecei metot miktarn artrabiliriz. rnek:

using System; delegate T Temsilci<T>(T s1,T s2); class deneme { static int Metot1(int a,int b){return 0;} static string Metot2(string a,string b){return null;} static void Main() { Temsilci<int> nesne1=new Temsilci<int>(Metot1); Temsilci<string> nesne2=new Temsilci<string>(Metot2); Console.WriteLine(nesne1(1,2)); Console.WriteLine(nesne2("w","q")); } }
Temsilci ablon tipleri de kst alabilirler. rnek:

delegate T Temsilci<T>(T s1,T s2) where T:struct


Burada T yalnzca bir yap olabilir. Yani bu temsilcinin temsil edecei metodun parametreleri ve geri dn tipi yalnzca bir yap olabilir.

[dzenle]null

deer alabilen yap nesneleri

Bildiiniz gibi yap nesneleri null deer alamaz. rnein u kod hataldr:

int a=null;
Ancak System isim alanndaki Nullable<T> yaps sayesinde yap nesnelerinin de null deer alabilmesini salayabiliriz. System.Nullable<T> yaps u gibidir:

public struct Nullable<T> where T:struct { private T value; private bool hasValue; public T Value{get{...}} public bool HasValue{get{...}} public T GetValueOrDefault(){...} }

Bu yapya gre null deer alabilen yap nesneleri yle oluturulur:

Nullable<int> a=new Nullable<int>(); a=5; a=null; Nullable<double> b=new Nullable<double>(2.3); Console.WriteLine("{0}{1}",a,b);


Grdnz gibi deerler yapc metot yoluyla ya da normal yolla verilebiliyor. Nullable<T> yapsnn GetValueOrDefault() metodu ilgili nesnenin deeri null ise ilgili nesnenin tipinin varsaylan deerini dndrr (int iin 0), ilgili nesnenin deeri null deilse ilgili nesnenin deerini olduu gibi dndrr. Yine ayn yapya ait Value zellii ilgili nesnenin deerini dndrr. Ancak az nceki metottan farkl olarak nesnenin deeri null ise null dndrr. Eer bu zelliin dndrd deer null ise alma zaman hatas oluacaktr. nk bir yap nesnesi null alamaz. Nullable tipler daha ok veri taban ilemlerinde kullanlr. nk veri tabanndaki int, double vb. gibi veri tipleri null deer alabilir. Nullable tipler veri tabanndaki verileri programmza olduu gibi aktarmak iin kullanlabilir.

[dzenle]?

iareti

C#' tasarlayan mhendisler bizim nullable tiplere oka ihtiya duyabileceimizi dnm olacaklar ki ? iaretini gelitirmiler. ? taks ksa yoldan nullable tipte nesne oluturmak iin kullanlr. rnein:

Nullable<double> d=10;
ile

double? d=5;
satrlar birbirine denktir. Yani aadaki gibi bir satr mmkndr:

double? d=null;
Nullable nesneleri normal nesnelere tr dntrme operatrn kullanarak dntrebiliriz. Ancak nullable nesnenin deeri null ise alma zaman hatas alrz. rnek:

int? a=5; int b=(int)a;


Benzer ekilde tr dnm kurallarna uymak artyla farkl dnm kombinasyonlar da mmkndr:

int? a=5; double b=(double)a;


Normal ve nullable nesneler arasnda ters dnm de mmkndr. Normal nesneler nullable nesnelere bilinsiz olarak dnebilir. rnek:

int a=5; int? b=a;


Nullable nesneler operatrler ile kullanlabilir. rnek:

int? a=5; int? b=10;

int c=(int)(a+b);
Burada a+b ifadesinin rettii deer yine int? trnden olduu iin tr dnm operatr kullanld.

[dzenle]??

operatr

?? operatr Nullable<T> yapsndaki GetValueOrDefault() metoduna benzer ekilde alr. rnek:

int? a=null; int b=a??0;


Burada eer a null ise ?? operatr 0 deerini dndrr. ?? operatrnn dndrd deer normal (nullable olmayan) tiptedir. Eer ilgili nullable nesne null deilse olduu deeri dndrr. Baka bir rnek:

int? a=null; int b=a??50;


Burada ise eer a null ise 50 dndrlr. Yani ?? operatrnde GetValueOrDefault() metodundan farkl olarak ilgili nesne null olduunda dndrlecek deeri belirleyebiliyoruz.

C Sharp Programlama Dili/Koleksiyonlar


Vikikitap, zgr ktphane
< C Sharp Programlama Dili

Koleksiyonlar nesneleri gruplamaya yarayan snflardr. Yani bir koleksiyon nesnesi birden fazla nesneyi temsil eder. .Net Framework ktphanesindeki koleksiyon snflar System.Collections isim alanndadr. Koleksiyonlarla diziler arasnda u farklar vardr:

Diziler System.Array trnden birer nesnedir. Koleksiyonlar ise System.Collections isim alanndaki eitli snflar trnden birer nesnedir. Koleksiyonlar dizilere gre bize daha fazla zgrlk verir. nk koleksiyonlar iinde her trden nesne tutabiliriz. Ayrca koleksiyonlarn boyutu sabit deildir. Eleman eklendike boyut dinamik olarak artar. Koleksiyonlar bize bunun gibi benzer avantajlar da verir. Konuyu iledike bu avantajlar greceksiniz.

Koleksiyon snflarnn tamam IEnumerable arayzn uygulamtr. Dolaysyla tm koleksiyon nesneleri foreach dngsyle kullanlabilir. Ayrca bunun haricinde her koleksiyon snf kendine zg birtakm arayzleri de uygulam olabilir. rnein birazdan greceimiz ArrayList snf IList ve ICollection arayzlerini de uygulamtr. Bu arayzlerin her birinin farkl anlamlar vardr. imdi bu arayzleri grelim: ICollection Bu arayz bir koleksiyonda bulunabilecek en temel ye elemanlar ierir. System.Collections isim alanndaki btn koleksiyon snflar bu arayz uygulamtr. ICollection arayz IEnumerable arayznden tremitir. Dolaysyla ICollection arayzn uygulayan bir snf IEnumerable arayzn de uygulam demektir. IComparer Bu arayz iki nesnenin karlatrlabilmesini salayan Compare() metodunu ierir. Bu metot iki nesnenin nasl karlatrlacan belirler. Compare() metodunun prototipi u ekildedir:

int Compare(object o1,object o2)


Compare metodu -1, 0 ya da 1 deeri dndrr. Karlatrma genellikle byklk -kklk ilikisine gre yaplr. IDictionary Bu arayz anahtar-kilit ilikisini uygulayan koleksiyon snflar uygular. Anahtar-kilit ilikisini daha sonra greceiz. IDictionary arayz ICollection arayznden tremitir. IDictionaryEnumerator IDictionary arayznn zellemi bir eklidir. leride greceiz. IEnumerable lgili koleksiyon nesnesinin foreach dngsyle kullanlabilmesini salayan arayzdr. IEnumerator IEnumerable arayzyle son derece ilikilidir. IEnumerable arayz IEnumerator arayznn kullanlmasn zorlar. Aslnda foreach dngsnn kurulabilmesi iin gerekli ye elemanlar IEnumerator arayzndedir. IEnumerable arayz sadece IEnumerator arayzn zorlamak iin arac vazifesi grr. IList Koleksiyon nesnelerine bir indeks numarasyla eriilebilmesini salayan arayzdr. IList ICollection arayznden tremitir. IHashProvider leride greceimiz Hashtable koleksiyon snfyla ilgilidir. System.Collections isim alanndaki arayzlerden sonra artk ayn isim alanndaki koleksiyon snflarna geebiliriz. Bunlar ArrayList, Hashtable, SortedList, BitArray, Stack ve Queue snflardr. imdi bu snflar teker teker inceleyelim.
Konu balklar
[gizle]

1 ArrayList snf 2 Hashtable snf 3 SortedList snf 4 BitArray snf 5 Stack snf 6 Queue snf 7 ablon tipli koleksiyonlar

o o o o o

7.1 List<T> snf 7.2 Dictionary<T,V> snf 7.3 SortedDictionary<K,V> snf 7.4 IEnumerable<T> ve IEnumerator<T> arayzleri 7.5 Queue<T> ve Stack<T> snflar

8 Koleksiyonlara kendi nesnelerimizi yerletirmek

[dzenle]ArrayList

snf

Koleksiyon snflarnn en genel amal olandr. Dizilere olduka benzer. Dizilerden tek fark eleman saysnn sabit olmamas ve yalnzca object tipinden nesneleri saklamasdr. ArrayList snf ICollection, IEnumerable, IList ve ICloneable arayzlerini uygular. ArrayList snfnn ar yklenmi tane yapc metodu vardr. Bunlar:

ArrayList al=new ArrayList();


Bu ekilde kapasitesi olmayan bir ArrayList nesnesi oluturulur. Tabii ki koleksiyona yeni nesneler eklendike bu kapasite dinamik olarak artacaktr.

ArrayList al=new ArrayList(50);


Bu ekilde 50 kapasiteli bir ArrayList nesnesi oluturulur. Yine kapasite alrsa dinamik olarak artrlr.

ArrayList al=new ArrayList(ICollection ic);


Burada ICollection arayzn uygulam herhangi bir snf nesnesi parametre olarak verilir. Daha nceden dediim gibi ArrayList snf nesneleri object olarak tutar. Yani bu koleksiyondan nesneleri elde ettiimizde object hldedirler. Genellikle bu nesneleri kullanabilmek iin orijinal tre tr dnm operatryle dnm yapmak gerekir. Bir ArrayList nesnesine nesne eklemek iin Add() metodu kullanlr. Bu metot parametre olarak object nesnesi alr ve bu nesneyi koleksiyonun sonuna ekler. Ayn ekilde bir ArrayList koleksiyonundan eleman karmak iin Remove() metodu kullanlr. Parametre olarak verilen object nesnesi koleksiyondan karlr. Eer nesne bulunamazsa hata olumaz, program ileyiine devam eder. Ayrca herhangi bir ArrayList koleksiyonunun kapasitesini renmek iin ArrayList snfnn Capacity zellii kullanlr. imdi btn bu ye elemanlar bir rnek zerinde grelim:

using System; using System.Collections; class Koleksiyonlar { static void Main() { ArrayList al=new ArrayList(); Console.WriteLine("Kapasite: "+al.Capacity); al.Add(5); Console.WriteLine("Kapasite: "+al.Capacity); al.Add("Deneme"); Console.WriteLine("Kapasite: "+al.Capacity); al.Add('D'); Console.WriteLine("Kapasite: "+al.Capacity); al.Add(1.2f); Console.WriteLine("Kapasite: "+al.Capacity); al.Add(3.4); Console.WriteLine("Kapasite: "+al.Capacity); al.Add(1.2m); Console.WriteLine("Kapasite: "+al.Capacity); al.Add("Vikikitap"); Console.WriteLine("Kapasite: "+al.Capacity); al.Add('e'); Console.WriteLine("Kapasite: "+al.Capacity); al.Add(2); Console.WriteLine("Kapasite: "+al.Capacity);

EkranaYaz(al); al.Remove("Deneme"); Console.WriteLine("Kapasite: "+al.Capacity); EkranaYaz(al); } static void EkranaYaz(ArrayList al) { foreach(object o in al) Console.Write(o.ToString()+" "); Console.WriteLine(); } }
Bu programn ekran kts yle olmaldr:

Kapasite: 0 Kapasite: 4 Kapasite: 4 Kapasite: 4 Kapasite: 4 Kapasite: 8 Kapasite: 8 Kapasite: 8 Kapasite: 8 Kapasite: 16 5 Deneme D 1,2 3,4 1,2 Vikikitap e 2 Kapasite: 16 5 D 1,2 3,4 1,2 Vikikitap e 2
Bu ekran ktsndan unlar anlyoruz:

Kapasite bata 0, sonra 4, sonra da gerekli olduunda kapasite ikier kat artrlyor. Remove() metoduyla koleksiyonunun elemann silmek kapasiteyi deitirmiyor. Yani Remove() metoduyla yaplan ey koleksiyondan bir nesne silip onun yerine sona bir null eklemek.

NOT: C#'ta geersiz trler arasnda dnm yapmak yasaktr. rnein bir object nesnesinin gizli tr string deilse bunu

string s=(string)o;
eklinde stringe eviremeyiz. Bir ArrayList koleksiyonuna nesne yerletirmek (araya sktrmak) iin Insert metodu kullanlr. Prototipi u ekildedir:

void Insert(int indeks,object deger)

Bu metotla ilgili koleksiyonun indeks nolu elemanna deger koyulur. Bu indeksteki nceki eleman ve bu indeksten sonraki elemanlar ileriye bir birim telenir. Bildiimiz zere bu normal dizilerde mmkn deildi. Sabit kapasiteli ArrayList koleksiyonu oluturmak iinse ArrayList snfnn static FixedSize metodu kullanlr. rnek:

ArrayList al=ArrayList.FixedSize(ArrayList koleksiyon);


Yani burada nceden tanmlanm bir ArrayList nesnesi baka bir ArrayList nesnesine sabit kapasiteli olarak atanyor. Eer al koleksiyonunun kapasitesi alrsa tpk dizilerdeki gibi istisnai durum meydana gelir. NOT: ArrayList koleksiyonunun elemanlarna tpk dizilerdeki gibi indeksleyici ile de eriilebilir. imdi istersek ArrayList snfnn dier nemli ye elemanlarna bir gz atalm. nce zellikl er: Count lgili ArrayList nesnesindeki toplam eleman saysn verir. Capacity zellii ile kartrlmamaldr. Count zellii "doldurulmu" eleman saysn verir. Geri dn tipi inttir. IsFixedSize lgili ArrayList nesnesinin sabit kapasiteli olup olmadn verir. Eer sabit kapasiteli ise true, deilse false deer dndrr. IsReadOnly lgili ArrayList nesnesinin salt okunur olup olmadn verir. Eer salt-okunur ise true, deilse false deer dndrr. Salt-okunur ArrayList nesneleri elde etmek iin ArrayList snfnn static ReadOnly() metodu kullanlr. Kullanm FixedSize() metodu ile ayndr. Sra geldi metotlara: AddRange(ICollection ic) Bu metot ile parametredeki koleksiyonun tm elemanlar ilgili koleksiyonun sonuna eklenir. Parametrenin ICollection tipinden olmas demek bu snfn ICollection arayzn uygulamas gerekliliini belirtir. Bildiiniz gibi System.Generic isim alanndaki btn koleksiyonlar ICollection arayzn uygulamtr. Sort() Koleksiyonlar sralamak iin kullanlr. Eer koleksiyon salt-okunur ise istisnai durum oluur. farkl ar yklenmi hli vardr: void Sort() lgili koleksiyonu ilgili koleksiyonun Compare() metodu kullanarak sralar. Tabii ki ilgili koleksiyon IComparer arayzn uygulamaldr. void Sort(IComparer ic) IComparer arayzn uygulayan baka bir snfn Compare() metodu kullanlarak sralama yaplr. void Sort(int indeks,int adet,IComparer ic) sttekinden tek fark bunda sadece indeksten itibaren adet kadar elemann sralanmasdr. int BinarySearch(object o) Sralanm koleksiyonlarda arama yaplr. Eer o nesnesi bulunursa bulunulan indeksle geri dnlr, bulunamazsa negatif bir sayyla geri dnlr. Bu metodun aadaki gibi iki versiyonu daha vardr: int BinarySearch(object o,IComparer ic) Arama iin baka bir snfn Compare() metodu kullanlr. Bu metot daha ok kullancnn tanmlad trden nesneler ieren koleksiyonlarda arama yapmak iin kullanlr. int BinarySearch(int indeks,int adet,object o,IComparer ic) stekinden tek fark indeksten itibaren adet kadar eleman iinde arama yaplmasdr. void Reverse() lgili koleksiyon ters evrilir. Baka bir kullanm daha vardr.

void Reverse(int indeks,int adet) Ters evirme ilemi yalnzca indeksten itibaren adet kadar elemana uygulanr. void Clear() lgili koleksiyonun tm elemanlar temizlenir. Dolaysyla Count zellii sfrlanrken Capacity zelliinin deeri deimez. void TrimToSize() Koleksiyonun kapasitesi eleman saysndan fazla olduu durumlarda gereksiz ksmlar silinir. Dolaysyla kapasiteyle eleman says eitlenir. bool Contains(object o) Parametre ile verilen nesnenin ilgili koleksiyonda bulunup bulunmad kontrol edilir. Eer varsa true, yoksa false deer dndrr. void CopyTo() ArrayList nesnesindeki elemanlar normal tek boyutlu dizilere (System.Array) kopyalamak iin kullanlr. farkl kullanm vardr: void CopyTo(Array a) Metodu aran ArrayList nesnesindeki tm elemanlar a dizisine ilk indeksten itibaren kopyalanr. void CopyTo(Array a,int indeks) sttekiyle ayn greve sahiptir. Tek fark kopyalamann indeks. elemandan itibaren yaplmasdr. void CopyTo(int indeks,Array a,int dizi_indeks,int adet) Metodu aran ArrayList nesnesindeki indeksten itibaren adet kadar eleman a dizisinde dizi_indeks indeksli eleman ve sonrasna kopyalanr. ArrayList GetRange(int indeks,int adet) Metodu aran ArrayList nesnesinin indeks nolu elemanndan itibaren adet kadar eleman yeni bir ArrayList nesnesi olarak tutulur. int IndexOf(object o) Parametre olarak verilen o nesnesinin ilgili ArrayList nes nesinde ilk bulunduu indeksi dndrr. Object nesnesi bulunamazsa negatif deer dndrlr. object[] ToArray() lgili ArrayList nesnesindeki elemanlar bir object dizisi olarak tutar. Farkl bir versiyonu daha vardr: Array ToArray(Type t) lgili ArrayList nesnesindeki elemanlar t trnden bir dizi olarak tutar. Yani gerekli tr dnm ilemleri otomatik olarak yaplr. void RemoveAt(int indeks) lgili ArrayList nesnesindeki indeks nolu eleman siler. Belirtilen indeks 0'dan kk ya da koleksiyonun Count deerinden bykse istisnai durum oluur.

[dzenle]Hashtable

snf

Array ve ArrayList snflarnda dizideki elemanlara belirli bir indeks numaras ile eriiriz. Ancak bu bazen uygun yntem olmayabilir. nk hangi nesnenin hangi indekse karlk geldiini bilmemiz gerekir. Halbuki System.Collections isim alanndaki Hashtable snfnda koleksiyonumuzun her nesnesine istediimiz bir ismi verip koleksiyonumuzun elemanlarna bu isimlerle eriebiliriz. Bunun dier ad anahtar-deer ilikisidir. Yani bir anahtarla yalnzca bir nesneyi ifade ederiz. rnek:

Hashtable h=new Hashtable(); h.Add("Anahtar1","Deer1"); h.Add("Anahtar2","Deer2");

Grdnz gibi her Hashtable nesnesinin iki ksm var. Bunlardan birisi ilgili nesnenin ismi (anahtar) tekisi de nesnenin kendisi (deer). Bu ikisinin tipi string olmak zorunda deildir. istenilen tr olabilir. lgili Hashtable nesnesine eleman eklerken Add() metodunda ilk parametre anahtar, ikinci parametre deerdir. Hashtable nesnesine yukardakinin yan sra aadaki gibi de eleman ekleyebiliriz:

h["Anahtar1"]="Deer1"; h["Anahtar2"]="Deer2";
stersek daha sonra Hashtable nesnesindeki anahtarlarn deerlerini deitirebiliriz. rnek:

h["Anahtar1"]="Yeni Deer";
Burada Anahtar1'in deerini deitirdik. Add() metoduyla var olan bir anahtar eklemeye almak istisnai durum olumasna neden olur. Hashtable snfnn Count zellii ilgili Hashtable nesnesindeki anahtardeer ifti saysn dndrr. Ayrca bir Hashtable nesnesindeki tm anahtarlar elde etmek iin Keys zellii kullanlr. Bu zellik ilgili Hashtable nesnesindeki tm anahtarlar bir ICollection nesnesi (bir koleksiyon) olarak dndrr. Values zellii ise ayn eyi deerler iin yapar. rnek program:

using System; using System.Collections; class hashtable { static void Main() { Hashtable Sozluk=new Hashtable(); Sozluk.Add("araba","car"); Sozluk["kitap"]="book"; ICollection anahtarlar=Sozluk.Keys; foreach(string s in anahtarlar) Console.WriteLine(s); ICollection degerler=Sozluk.Values; foreach(string s in degerler) Console.WriteLine(s); Console.WriteLine("Toplam kelime: "+Sozluk.Count); } }
Bu programn kts u ekildedir:

kitap araba book car Toplam kelime: 2


Bu program yle de yazabiliriz:

using System; using System.Collections; class hashtable { static void Main() { Hashtable Sozluk=new Hashtable(); Sozluk.Add("araba","car"); Sozluk["kitap"]="book"; IDictionaryEnumerator ide=Sozluk.GetEnumerator(); while(ide.MoveNext()) Console.WriteLine(ide.Key+" = "+ide.Value); Console.WriteLine("Toplam kelime: "+Sozluk.Count); } }
Yani Hashtable snfnn static olmayan GetEnumerator() metodu IDictionaryEnumerator arayz trnden bir nesne dndryor. Bu nesne zerinden MoveNext() metoduna eriiyoruz. MoveNext() metodu ilgili IDictionaryEnumerator nesnesinin temsil ettii anahtar-deer iftini bir teleyip true dndryor. Eer teleyemiyorsa false dndryor. Bir Hashtable nesnesinden bir anahtar-deer iftini silmek iin Hashtable snfnn Remove() metodu kullanlr. Parametre olarak anahtar alr. rnek:

Sozluk.Remove("araba");
Bu satr Sozluk koleksiyonundaki "araba" anahtarn ve buna karlk gelen deeri silecektir. Eer ilgili koleksiyon salt-okunur ise, sabit kapasiteli ise, belirtilen anahtar yok ya da deeri null ise istisnai durum oluur. IsReadOnly ve IsFixedSize zellikleri Hashtable snfnda da bulunmaktadr. Hashtable snfnn dier nemli metotlar: void Clear() lgili Hashtable nesnesindeki tm anahtar-deer iftlerini siler. Dolaysyla Hashtable nesnesinin Count zelliinin deeri 0 olur. bool ContainsKey(object anahtar) Parametre ile verilen anahtar ilgili Hashtable nesnesinde varsa true, yoksa false deer dndrr. Ayn snftaki Contains() metodu da ayn ileve sahiptir. bool ContainsValue(object deger) Parametre ile verilen deer ilgili Hashtable nesnesinde varsa true, yoksa false deer dndrr. void CopyTo(Array dizi,int indeks) lgili Hashtable nesnesindeki anahtar-deer iftlerini bir boyutlu Array dizisine indeks indeksinden itibaren kopyalar. Kopyalama ileminin yapld dizi DictionaryEntry yaps trndendir. Bu yapdaki Key ve Value zellikleri ilgili Hashtable nesnesindeki anahtar ve deerleri tutar. lgili Hashtable nesnesindeki sadece anahtarlar bir diziye kopyalamak iin;

hashtable.Keys.CopyTo(dizi,indeks);
Ayn ilemi sadece deerler iin yapmak iinse;

hashtable.Values.CopyTo(dizi,indeks);
[dzenle]SortedList

snf

SortedList koleksiyonunda elemanlara hem anahtar-deer iftli hem de ArrayList snfnda olduu gibi indeksli olarak eriebiliriz. Ancak SortedList snfnn nceki grdmz iki snftan en byk fark elemanlarn daima sral olmasdr. eitli ekillerde SortedList nesneleri oluturulabilir:

SortedList sl1=new SortedList(); SortedList sl2=new SortedList(50); SortedList sl3=new SortedList(IDictionary id);
Birincisinde henz kapasitesi olmayan bir SortedList nesnesi oluturulur. kincisinde balang kapasitesi 50 olan bir SortedList nesnesi oluturulur. ncsnde ise IDictionary arayzn uygulam olan bir snfn nesnesi parametre olarak alnr ve bu snfn (koleksiyonun) elemanlarndan SortedList nesnesi oluturulur. Daha nce grdmz Hashtable snf IDictionary arayzn uygulamtr. nde de kapasite alrsa otomatik olarak kapasite artrlr. SortedList snfnda Hashtable snfndaki Add(), Clear(), Contains(), ContainsKey(), ContainsValue(), GetEnumerator() ve Remove() metotlar bulunur. Kendine zg metotlar ise object GetByIndex(int indeks) lgili SortedList nesnesindeki indeks nolu anahtar-deer iftinin deer ksm dndrlr. object GetKey(int indeks) lgili SortedList nesnesindeki indeks nolu anahtar-deer iftinin anahtar ksm dndrlr. IList GetKeyList() lgili SortedList nesnesindeki anahtarlar IList arayz trnden dndrlr. IList GetValueList() lgili SortedList nesnesindeki deerler IList arayz trnden dndrlr. int IndexOfKey(object anahtar) lgili SortedList nesnesindeki parametrede verilen anahtarn hangi indekste olduu dndrlr. Anahtar bulunamazsa negatif deer dndrlr. int IndexOfValue(object deger) Yukardaki eyi deerler iin yapar. void SetByIndex(int indeks,object deger) lgili SortedList nesnesindeki indeks nolu elemann deeri deger olarak deitirilir. Anahtarda deime olmaz. void TrimToSize() lgili SortedList nesnesinin kapasitesi eleman saysna eitlenir. SortedList snfnn zellikleri ise Capacity, Count, IsFixed, IsReadOnly, Keys ve Values'dir. Keys ve Values zellikleri ile Hashtable snfnda olduu gibi ICollection nesnesi elde edilir. lgili SortedList nesnesindeki elemanlara erimek iin Keys ve Values zellikleri kullanlabilecei gibi DictionaryEntry yaps da kullanlabilir. Bu yap ilgili koleksiyondaki deer ve anahtarlar temsil eden zellikler ierir. rnee gemeden nce SortedList snfnn sralamay nasl yaptn sylemek istiyorum: Herhangi bir SortedList nesnesiyle her ilem yapldktan sonra ilgili koleksiyon sralanr. Sralama anahtarlara gredir. Dolaysyla biz anahtarlarn srasn deitiremeyiz. imdi SortedList snfyla ilgili bir rnek yapalm:

using System; using System.Collections; class sortedlist { static void Main() {

string[] kelimeler={"araba","masa","defter","kitap","okul"}; SortedList sozluk=new SortedList(); sozluk.Add("araba","car"); sozluk.Add("masa","table"); sozluk.Add("kalem","pencil"); sozluk["kitap"]="book"; sozluk["bilgisayar"]="computer"; EkranaYaz(sozluk); for(int i=0;i<kelimeler.Length;i++) if(sozluk.ContainsKey(kelimeler[i])) Console.WriteLine(kelimeler[i]+"="+sozluk[kelimeler[i]]); else Console.WriteLine(kelimeler[i]+" szlkte bulunamad."); Console.WriteLine(); sozluk.Add("doru","line"); EkranaYaz(sozluk); Console.WriteLine(); Console.WriteLine("Sral listede toplam {0} eleman bulunmaktadr.",sozluk.Count); Console.WriteLine("Bu elemanlar: "); ICollection anahtarlar=sozluk.Keys; foreach(string s in anahtarlar) Console.Write(s+"-"); } static void EkranaYaz(SortedList sl) { foreach(DictionaryEntry de in sl) Console.WriteLine("{0,-12}:{1,-12}",de.Key,de.Value); Console.WriteLine(); } }
[dzenle]BitArray

snf

BitArray iinde yalnzca bool trnden nesneler saklayabilen bir koleksiyondur. Bir BitArray nesnesi u yollarla oluturulabilir.

BitArray BitArray BitArray BitArray BitArray BitArray

ba1=new ba3=new ba4=new ba5=new ba6=new ba7=new

BitArray(BitArray ba2); BitArray(bool[] b); BitArray(byte[] by); BitArray(int[] i); BitArray(int boyut); BitArray(int boyut,bool deger);

Birincisinde baka bir BitArray nesnesinden yeni bir BitArray nesnesi oluturulur. Yani tabiri caizse kopyalama ilemi yaplm olur. kincisinde bir bool dizisinden yeni bir BitArray nesnesi oluturulur.

ncsnde bir byte dizisinden yeni bir BitArray nesnesi oluturulur. Bir bayt 8 bittir. Yani bir baytn iinde 8 tane 1 veya 0 vardr. te bu 1 veya 0'lar BitArray koleksiyonuna true ve false olarak geirilir. Yani son tahlilde BitArray dizisindeki eleman says 8*by.length olur. Drdncsnde bir int dizisinden yeni bir BitArray nesnesi oluturulur. Bir int nesnesinin iinde 32 tane 1 veya 0 vardr. nk int 32 bitlik bir veri tipidir. Bu 1 veya 0'lar BitArray koleksiyonuna true veya false olarak geirilir. Yani son tahlilde BitArray dizisindeki eleman says 32*i.Length olur. Beincisinde boyut tane false eleman ieren bir BitArray nesnesi oluturulur. Altncsnda boyut tane degerden oluan bir BitArray nesnesi oluturulur. BitArray snf ICollection ve IEnumerable arayzlerini uygulamtr. rnek bir program:

using System; using System.Collections; class bitarray { static void Main() { int[] i={1}; BitArray ba=new BitArray(i); EkranaYaz(ba); } static void EkranaYaz(BitArray ba) { IEnumerator ie=ba.GetEnumerator(); int i=0; while(ie.MoveNext()) { i++; Console.Write("{0,-6}",ie.Current); if(i%8==0) Console.WriteLine(); } Console.WriteLine(); } }
Bu programn ekran kts yle olmaldr:

True False False False

False False False False

False False False False

False False False False

False False False False

False False False False

False False False False

False False False False

Bu programda ba'y ekrana klasik foreach ile de yazdrabilirdik. Ancak byle bir yntemin de olduunu bilmenizde fayda var.

BitArray snfnn Count ve Length adl iki zellii vardr. kisi de ilgili BitArray nesnesinin eleman saysn verir. Ancak Count salt-okunur olmasna ramen Length deildir. Yani Length zellii ile ilgili BitArray nesnesinin eleman saysn deitirebiliriz. Eer var olan eleman saysn azaltrsak sonundan ger ekli sayda eleman silinecektir. Eer eleman saysn artrsak sona gerekli sayda false eleman eklenir. BitArray snfnn nemli metotlar: bool Get(int indeks) lgili BitArray nesnesindeki parametre ile verilen indeksteki eleman geri dndrlr. void Set(int indeks,bool deger) lgili BitArray nesnesindeki parametre ile verilen indeksteki eleman deger olarak deitirilir. void SetAll(bool deger) lgili BitArray nesnesindeki tm elemanlar deger olarak deitirilir. BitArray And(BitArray ba) lgili BitArray nesnesindeki elemanlarla parametredeki BitArray nesnesindeki elemanlar karlkl olarak VE ilemine sokar. Sonucu yine bir BitArray nesnesi olarak tutar. Eer iki nesnenin eleman saylar eit deilse istisnai durum oluur. BitArray Or(BitArray ba) And() metoduyla ayn mantkta alr. Tek deien elemanlarn VE deil de VEYA ilemine sokulmasdr. BitArray Xor(BitArray ba) And() ve Or() metotlaryla ayn mantkta alr. Tek deien elemanlarn ZEL VEYA ilemine sokulmasdr. BitArray Not() lgili BitArray nesnesindeki elemanlarn deilini alr ve yeni bir BitArray nesnesi olarak dndrr.

[dzenle]Stack

snf

System.Collections isim alanndaki Stack snf bilgisayar bilimlerinde oka karmza kabilecek ynlarla almamz salar. Ynlar st ste koyulmu kitaplar gibi dnebiliriz. En stteki kitab rahatlkla alp okuyabiliriz. Ancak okuyacamz kitap ortalarda veya altlarda ise nce okuyacamz kitabn stndeki kitaplar teker teker yndan karp sonra okuyacamz kitab almalyz. br trl kitap destesi devrilebilir. te ynlarda da ayn mantk sz konusudur. Ynlara koleksiyonlara bu mantn eklenmi hlidir diyebiliriz. Normal koleksiyonlarda istediimiz her an koleksiyonun istediimiz elemanna eriebiliyorduk. Ancak ynlarda bir anda ynn yalnzca bir elemanna eriebiliriz. Daha alttaki ele manlara eriebilmek iin stteki elemanlarn teker teker yndan karlmas gerekir. Ynlarn mantn u cmleyle zetleyebiliriz: "En nce giren en son kar, en son giren en nce kar." Yani yna eklenen her bir elemann birbirinin stne geldiini syleyebiliriz. Stack snfnda tpk dier koleksiyonlardaki gibi eleman eklendike otomatik olarak kapasite artar. Bir Stack nesnesi u yollardan biriyle olturulabilir.

Stack s1=new Stack(); Stack s2=new Stack(int kapasite); Stack s3=new Stack(ICollection ic);
Birincisinde klasik bir Stack nesnesi oluturulur. kincisinde kapasitesi kapasite olan bir Stack nesnesi oluturulur. Tabii ki kapasite alrsa otomatik olarak kapasite artrlr. ncsnde ICollection arayzn kullanan baka bir koleksiyon nesnesinden yeni bir Stack nesnesi oluturulur. Stack snfnn nemli ye elemanlar:

object Pop() lgili yndaki en stteki eleman dndrr ve yndan karr. object Peek() lgili yndaki en stteki eleman dndrr ama yndan karmaz. void Push(object o) lgili ynn en stne o elemann ekler. void Clear() lgili yndaki btn elemanlar siler. object[] ToArray() lgili yndaki elemanlar object dizisi olarak dndrlr. bool Contains(object o) Eer o nesnesi ilgili ynda varsa true, yoksa false dndrlr. int Count Bu zellik ilgili yndaki eleman saysn verir. Peek() ve Pop() metotlar ilgili yn boken kullanlrsa istisnai durum oluur. Bir yndaki elemanlarn tamamna bir koleksiyonmu gibi erimek iin Stack snfnn GetEnumerator() metodu kullanlr. Bu metot bir IEnumerator nesnesi dndrr. IEnumerator arayznn MoveNext() metoduyla bir while dngs kurarsak ilgili yndaki tm elemanlara eriebiliriz. rnek:

using System; using System.Collections; class stack { static void Main() { Stack s=new Stack(); s.Push(5); s.Push(10); EkranaYaz(s); } static void EkranaYaz(Stack s) { IEnumerator ie=s.GetEnumerator(); while(ie.MoveNext()) Console.WriteLine(ie.Current); } }
Bu programdaki EkranaYaz() metodunu yle de yazabilirdik:

static void EkranaYaz(Stack s) { Stack yeniyigin=(Stack)s.Clone(); while(yeniyigin.Count>0) Console.WriteLine(yeniyigin.Pop().ToString()); }


Buradaki Clone() metodu bir ynn kopyasn object olarak alr. Dolaysyla bu yeni yn bir Stack nesnesine atamak iin tekrar Stack trne dnm yapmak gerekir. Yine EkranaYaz() metodunu klasik foreach dngsyle de yazabilirdik:

static void EkranaYaz(Stack s) { foreach(object o in s)

Console.WriteLine(o); }
[dzenle]Queue

snf

Queue snf Stack snfna olduka benzer. Ancak Stack snfnn tam tersi bir manta sahiptir. Queue snfnda "En nce giren en erken kar, en son giren en ge kar." mant geerlidir. Bunu yle kavrayabiliriz: Kendimizi bankada bir veznedar olarak dnelim. Kuyrukta bekleyen birok kii var. Tabii ki kuyruktaki en ndeki kiinin ii en erken bitecek ve kuyruktan en nce o ayrlacaktr. Kuyruun en arkasndaki kiinin ii ise en ge bitecektir. Bizim veznedar olarak en arkadaki kiinin iini halledebilmemiz iin o kiinin nndeki kiilerin de ilerini bitirmemiz gerekir. Queue snfnn nemli ye elemanlar: object Dequeue() lgili kuyruun en bandaki eleman dndrr ve kuyruktan karr. void Enqueue(object o) o nesnesi ilgili kuyruun en sonuna eklenir. object Peek() lgili kuyruun en bandaki eleman dndrr ama kuyruktan karmaz. int Count lgili kuyruktaki eleman saysn verir. object[] ToArray() lgili kuyruk bir object dizisi olarak tutulur. void TrimToSize() lgili kuyruun kapasitesiyle eleman says eitlenir. Yeni bir Queue nesnesi yle oluturulabilir.

Queue q1=new Queue(); Queue q2=new Queue(int kapasite); Queue q3=new Queue(ICollection ic);
Bir Queue nesnesinin iinde Stack nesnelerinin iinde dolatmz gibi dolaabiliriz. Buna rnek verilmeyecektir.

[dzenle]ablon

tipli koleksiyonlar

imdiye kadar BitArray hari btn koleksiyon snflarnda koleksiyona eklenen nesne objecte dntrlp saklanr. Sonra bu nesneyi elde etmek istediimizde ise tekrar orijinal tre dnm yapmak gerekir. Bunun sonucunda hem performans kayb (tr dnmlerinden dolay) hem de tr emniyetsizlii olumaktadr. Tr emniyetsizliinin nedeni ise ilgili koleksiyonda her trden veri saklayabilmemizdir. Szlk iin kullanacamz bir koleksiyonun yalnzca string nesneleri kabul etmesi gerekir. Ancak klasik koleksiyonlarda her trden nesne atayabilmemiz bu kontrol imkansz klmaktadr. ablon tipli koleksiyon snflar System.Collections.Generic isim alanndadr. imdiye kadar grdmz btn koleksiyonlarn ablon tipli versiyonlar bu isim alannda bulunmaktadr. ablon tipli koleksiyon snflarnn karl olduklar normal koleksiyon snflarndan ablon tipli olmalar dnda fazla fark yoktur. Burada bu ablon tipli koleksiyon snflar ksaca tantlacaktr.

[dzenle]List<T>

snf

ArrayList snfnn ablon tipli versiyonudur. rnek bir List<T> nesnesi yaratm:

List<int> l=new List<int>();

[dzenle]Dictionary<T,V>

snf

Hashtable snfnn ablon tipli versiyonudur. rnek bir Dictionary<T,V> nesnesi yaratm:

Dictionary<int,string> d=new Dictionary<int,string>();


[dzenle]SortedDictionary<K,V>

snf

SortedList snfnn ablon tipli versiyonudur. rnek bir SortedDictionary<K,V> nesnesi yaratm:

SortedDictionary<int,string> sd=new SortedDictionary<int,string>();


[dzenle]IEnumerable<T>

ve IEnumerator<T> arayzleri

Klasik versiyonlarndan tretilen bu arayzler ablon tipli koleksiyon snflarna arayzlk yapmaktadr. Kendimiz de ablon tipli koleksiyon snflar yazmak istiyorsak bu arayzleri kullanmalyz.

[dzenle]Queue<T>

ve Stack<T> snflar

Queue ve Stack snflarn ablon tipli versiyonlardr.

[dzenle]Koleksiyonlara

kendi nesnelerimizi yerletirmek

imdiye kadar koleksiyonlara string, int gibi .Net Framework ktphanesindeki hazr snflarn nesnelerini koyduk. Halbuki kendi oluturduumuz snflarn nesnelerini de koleksiyonlara koyabiliriz. Ancak bu durumda bir sorun ortaya kar. Derleyici koleksiyonu sralarken nasl sralayacak? Bu sorunu zmek iin snfmza IComparable arayzn uygulattrrz. Bu arayz nceden de bildiiniz gibi CompareTo() metodunu iermektedir. imdi programmz yazmaya balayalm:

using System; using System.Collections; class Sayi:IComparable { public int sayi; public Sayi(int sayi) { this.sayi=sayi; } public int CompareTo(object o) { Sayi s=(Sayi)o; return sayi.CompareTo(s.sayi); } } class AnaProgram { static void Main() { ArrayList al=new ArrayList(); Sayi s1=new Sayi(10); Sayi s2=new Sayi(20);

Sayi s3=new Sayi(-23); al.Add(s1); al.Add(s2); al.Add(s3); al.Sort(); foreach(Sayi s in al) Console.WriteLine(s.sayi); } }

C Sharp Programlama Dili/Koleksiyonlar


Vikikitap, zgr ktphane
< C Sharp Programlama Dili

Koleksiyonlar nesneleri gruplamaya yarayan snflardr. Yani bir koleksiyon nesnesi birden fazla nesneyi temsil eder. .Net Framework ktphanesindeki koleksiyon snflar System.Collections isim alanndadr. Koleksiyonlarla diziler arasnda u farklar vardr:

Diziler System.Array trnden birer nesnedir. Koleksiyonlar ise System.Collections isim alanndaki eitli snflar trnden birer nesnedir. Koleksiyonlar dizilere gre bize daha fazla zgrlk verir. nk koleksiyonlar iinde her trden nesne tutabiliriz. Ayrca koleksiyonlarn boyutu sabit deildir. Eleman eklendik e boyut dinamik olarak artar. Koleksiyonlar bize bunun gibi benzer avantajlar da verir. Konuyu iledike bu avantajlar greceksiniz.

Koleksiyon snflarnn tamam IEnumerable arayzn uygulamtr. Dolaysyla tm koleksiyon nesneleri foreach dngsyle kullanlabilir. Ayrca bunun haricinde her koleksiyon snf kendine zg birtakm arayzleri de uygulam olabilir. rnein birazdan greceimiz ArrayList snf IList ve ICollection arayzlerini de uygulamtr. Bu arayzlerin her birinin farkl anlamlar vardr. imdi bu arayzleri grelim: ICollection Bu arayz bir koleksiyonda bulunabilecek en temel ye elemanlar ierir. System.Collections isim alanndaki btn koleksiyon snflar bu arayz uygulamtr. ICollection arayz IEnumerable arayznden tremitir. Dolaysyla ICollection arayzn uygulayan bir snf IEnumerable arayzn de uygulam demektir. IComparer Bu arayz iki nesnenin karlatrlabilmesini salayan Compare() metodunu ierir. Bu metot iki nesnenin nasl karlatrlacan belirler. Compare() metodunun prototipi u ekildedir:

int Compare(object o1,object o2)


Compare metodu -1, 0 ya da 1 deeri dndrr. Karlatrma genellikle byklk -kklk ilikisine gre yaplr. IDictionary Bu arayz anahtar-kilit ilikisini uygulayan koleksiyon snflar uygular. Anahtar-kilit ilikisini daha sonra greceiz. IDictionary arayz ICollection arayznden tremitir. IDictionaryEnumerator IDictionary arayznn zellemi bir eklidir. leride greceiz.

IEnumerable lgili koleksiyon nesnesinin foreach dngsyle kullanlabilmesini salayan arayzdr. IEnumerator IEnumerable arayzyle son derece ilikilidir. IEnumerable arayz IEnumerator arayznn kullanlmasn zorlar. Aslnda foreach dngsnn kurulabilmesi iin gerekli ye elemanlar IEnumerator arayzndedir. IEnumerable arayz sadece IEnumerator arayzn zorlamak iin arac vazifesi grr. IList Koleksiyon nesnelerine bir indeks numarasyla eriilebilmesini salayan arayzdr. IList ICollection arayznden tremitir. IHashProvider leride greceimiz Hashtable koleksiyon snfyla ilgilidir. System.Collections isim alanndaki arayzlerden sonra artk ayn isim alanndaki koleksiyon snflarna geebiliriz. Bunlar ArrayList, Hashtable, SortedList, BitArray, Stack ve Queue snflardr. imdi bu snflar teker teker inceleyelim.
Konu balklar
[gizle]

1 ArrayList snf 2 Hashtable snf 3 SortedList snf 4 BitArray snf 5 Stack snf 6 Queue snf 7 ablon tipli koleksiyonlar

o o o o o

7.1 List<T> snf 7.2 Dictionary<T,V> snf 7.3 SortedDictionary<K,V> snf 7.4 IEnumerable<T> ve IEnumerator<T> arayzleri 7.5 Queue<T> ve Stack<T> snflar

8 Koleksiyonlara kendi nesnelerimizi yerletirmek

[dzenle]ArrayList

snf

Koleksiyon snflarnn en genel amal olandr. Dizilere olduka benzer. Dizilerden tek fark eleman saysnn sabit olmamas ve yalnzca object tipinden nesneleri saklamasdr. ArrayList snf ICollection, IEnumerable, IList ve ICloneable arayzlerini uygular. ArrayList snfnn ar yklenmi tane yapc metodu vardr. Bunlar:

ArrayList al=new ArrayList();


Bu ekilde kapasitesi olmayan bir ArrayList nesnesi oluturulur. Tabii ki koleksiyona yeni nesneler eklendike bu kapasite dinamik olarak artacaktr.

ArrayList al=new ArrayList(50);


Bu ekilde 50 kapasiteli bir ArrayList nesnesi oluturulur. Yine kapasite alrsa dinamik olarak artrlr.

ArrayList al=new ArrayList(ICollection ic);


Burada ICollection arayzn uygulam herhangi bir snf nesnesi parametre olarak verilir. Daha nceden dediim gibi ArrayList snf nesneleri object olarak tutar. Yani bu koleksiyondan nesneleri elde ettiimizde object hldedirler. Genellikle bu nesneleri kullanabilmek iin orijinal tre tr dnm operatryle dnm yapmak gerekir. Bir ArrayList nesnesine nesne eklemek iin Add() metodu kullanlr. Bu metot parametre olarak object nesnesi alr ve bu nesneyi koleksiyonun sonuna ekler. Ayn ekilde bir ArrayList koleksiyonundan eleman karmak iin Remove() metodu kullanlr. Parametre olarak verilen object nesnesi koleksiyondan karlr. Eer nesne bulunamazsa hata olumaz, program ileyiine devam eder. Ayrca herhangi bir ArrayList koleksiyonunun kapasitesini renmek iin ArrayList snfnn Capacity zellii kullanlr. imdi btn bu ye elemanlar bir rnek zerinde grelim:

using System; using System.Collections; class Koleksiyonlar { static void Main() { ArrayList al=new ArrayList(); Console.WriteLine("Kapasite: "+al.Capacity); al.Add(5); Console.WriteLine("Kapasite: "+al.Capacity); al.Add("Deneme"); Console.WriteLine("Kapasite: "+al.Capacity); al.Add('D'); Console.WriteLine("Kapasite: "+al.Capacity); al.Add(1.2f); Console.WriteLine("Kapasite: "+al.Capacity); al.Add(3.4); Console.WriteLine("Kapasite: "+al.Capacity); al.Add(1.2m); Console.WriteLine("Kapasite: "+al.Capacity); al.Add("Vikikitap"); Console.WriteLine("Kapasite: "+al.Capacity); al.Add('e'); Console.WriteLine("Kapasite: "+al.Capacity); al.Add(2); Console.WriteLine("Kapasite: "+al.Capacity); EkranaYaz(al); al.Remove("Deneme"); Console.WriteLine("Kapasite: "+al.Capacity); EkranaYaz(al); } static void EkranaYaz(ArrayList al) { foreach(object o in al)

Console.Write(o.ToString()+" "); Console.WriteLine(); } }


Bu programn ekran kts yle olmaldr:

Kapasite: 0 Kapasite: 4 Kapasite: 4 Kapasite: 4 Kapasite: 4 Kapasite: 8 Kapasite: 8 Kapasite: 8 Kapasite: 8 Kapasite: 16 5 Deneme D 1,2 3,4 1,2 Vikikitap e 2 Kapasite: 16 5 D 1,2 3,4 1,2 Vikikitap e 2
Bu ekran ktsndan unlar anlyoruz:

Kapasite bata 0, sonra 4, sonra da gerekli olduunda kapasite ikier kat artrlyor. Remove() metoduyla koleksiyonunun elemann silmek kapasiteyi deitirmiyor. Yani Remove() metoduyla yaplan ey koleksiyondan bir nesne silip onun yerine sona bir null eklemek.

NOT: C#'ta geersiz trler arasnda dnm yapmak yasaktr. rnein bir object nesnesinin gizli tr string deilse bunu

string s=(string)o;
eklinde stringe eviremeyiz. Bir ArrayList koleksiyonuna nesne yerletirmek (araya sktrmak) iin Insert metodu kullanlr. Prototipi u ekildedir:

void Insert(int indeks,object deger)


Bu metotla ilgili koleksiyonun indeks nolu elemanna deger koyulur. Bu indeksteki nceki eleman ve bu indeksten sonraki elemanlar ileriye bir birim telenir. Bildiimiz zere bu normal dizilerde mmkn dei ldi. Sabit kapasiteli ArrayList koleksiyonu oluturmak iinse ArrayList snfnn static FixedSize metodu kullanlr. rnek:

ArrayList al=ArrayList.FixedSize(ArrayList koleksiyon);


Yani burada nceden tanmlanm bir ArrayList nesnesi baka bir ArrayList nesnesine sabit kapasiteli olarak atanyor. Eer al koleksiyonunun kapasitesi alrsa tpk dizilerdeki gibi istisnai durum meydana gelir.

NOT: ArrayList koleksiyonunun elemanlarna tpk dizilerdeki gibi indeksleyici ile de eriilebilir. imdi istersek ArrayList snfnn dier nemli ye elemanlarna bir gz atalm. nce zellikler: Count lgili ArrayList nesnesindeki toplam eleman saysn verir. Capacity zellii ile kartrlmamaldr. Count zellii "doldurulmu" eleman saysn verir. Geri dn tipi inttir. IsFixedSize lgili ArrayList nesnesinin sabit kapasiteli olup olmadn verir. Eer sabit kapasiteli ise true, deilse false deer dndrr. IsReadOnly lgili ArrayList nesnesinin salt okunur olup olmadn verir. Eer salt-okunur ise true, deilse false deer dndrr. Salt-okunur ArrayList nesneleri elde etmek iin ArrayList snfnn static ReadOnly() metodu kullanlr. Kullanm FixedSize() metodu ile ayndr. Sra geldi metotlara: AddRange(ICollection ic) Bu metot ile parametredeki koleksiyonun tm elemanlar ilgili koleksiyonun sonuna eklenir. Parametrenin ICollection tipinden olmas demek bu snfn ICollection arayzn uygulamas gerekliliini belirtir. Bildiiniz gibi System.Generic isim alanndaki btn koleksiyonlar ICollection arayzn uygulamtr. Sort() Koleksiyonlar sralamak iin kullanlr. Eer koleksiyon salt-okunur ise istisnai durum oluur. farkl ar yklenmi hli vardr: void Sort() lgili koleksiyonu ilgili koleksiyonun Compare() metodu kullanarak sralar. Tabii ki ilgili koleksiyon IComparer arayzn uygulamaldr. void Sort(IComparer ic) IComparer arayzn uygulayan baka bir snfn Compare() metodu kullanlarak sralama yaplr. void Sort(int indeks,int adet,IComparer ic) sttekinden tek fark bunda sadece indeksten itibaren adet kadar elemann sralanmasdr. int BinarySearch(object o) Sralanm koleksiyonlarda arama yaplr. Eer o nesnesi bulunursa bulunulan indeksle geri dnlr, bulunamazsa negatif bir sayyla geri dnlr. Bu metodun aadaki gibi iki versiyonu daha vardr: int BinarySearch(object o,IComparer ic) Arama iin baka bir snfn Compare() metodu kullanlr. Bu metot daha ok kullancnn tanmlad trden nesneler ieren koleksiyonlarda arama yapmak iin kullanlr. int BinarySearch(int indeks,int adet,object o,IComparer ic) stekinden tek fark indeksten itibaren adet kadar eleman iinde arama yaplmasdr. void Reverse() lgili koleksiyon ters evrilir. Baka bir kullanm daha vardr. void Reverse(int indeks,int adet) Ters evirme ilemi yalnzca indeksten itibaren adet kadar elemana uygulanr. void Clear() lgili koleksiyonun tm elemanlar temizlenir. Dolaysyla Count zellii sfrlanrken Capacity zelliinin deeri deimez. void TrimToSize() Koleksiyonun kapasitesi eleman saysndan fazla olduu durumlarda gereksiz ksmlar silinir. Dolaysyla kapasiteyle eleman says eitlenir. bool Contains(object o) Parametre ile verilen nesnenin ilgili koleksiyonda bulunup bulunmad kontrol

edilir. Eer varsa true, yoksa false deer dndrr. void CopyTo() ArrayList nesnesindeki elemanlar normal tek boyutlu dizilere (System.Array) kopyalamak iin kullanlr. farkl kullanm vardr: void CopyTo(Array a) Metodu aran ArrayList nesnesindeki tm elemanlar a dizisine ilk indeksten itibaren kopyalanr. void CopyTo(Array a,int indeks) sttekiyle ayn greve sahiptir. Tek fark kopyalamann indeks. elemandan itibaren yaplmasdr. void CopyTo(int indeks,Array a,int dizi_indeks,int adet) Metodu aran ArrayList nesnesindeki indeksten itibaren adet kadar eleman a dizisinde dizi_indeks indeksli eleman ve sonrasna kopyalanr. ArrayList GetRange(int indeks,int adet) Metodu aran ArrayList nesnesinin indeks nolu elemanndan itibaren adet kadar eleman yeni bir ArrayList nesnesi olarak tutulur. int IndexOf(object o) Parametre olarak verilen o nesnesinin ilgili ArrayList nesnesinde ilk bulunduu indeksi dndrr. Object nesnesi bulunamazsa negatif deer dndrlr. object[] ToArray() lgili ArrayList nesnesindeki elemanlar bir object dizisi olarak tutar. Farkl bir versiyonu daha vardr: Array ToArray(Type t) lgili ArrayList nesnesindeki elemanlar t trnden bir dizi olarak tutar. Yani gerekli tr dnm ilemleri otomatik olarak yaplr. void RemoveAt(int indeks) lgili ArrayList nesnesindeki indeks nolu eleman siler. Belirtilen indeks 0'dan kk ya da koleksiyonun Count deerinden bykse istisnai durum oluur.

[dzenle]Hashtable

snf

Array ve ArrayList snflarnda dizideki elemanlara belirli bir indeks numaras ile eriiriz. Ancak bu bazen uygun yntem olmayabilir. nk hangi nesnenin hangi indekse karlk geldiini bilmemiz gerekir. Halbuki System.Collections isim alanndaki Hashtable snfnda koleksiyonumuzun her nesnesine istediimiz bir ismi verip koleksiyonumuzun elemanlarna bu isimlerle eriebiliriz. Bunun dier ad anahtar-deer ilikisidir. Yani bir anahtarla yalnzca bir nesneyi ifade ederiz. rnek:

Hashtable h=new Hashtable(); h.Add("Anahtar1","Deer1"); h.Add("Anahtar2","Deer2");


Grdnz gibi her Hashtable nesnesinin iki ksm var. Bunlardan birisi ilgili nesnenin ismi (anahtar) tekisi de nesnenin kendisi (deer). Bu ikisinin tipi string olmak zorunda deildir. istenilen tr olabilir. lgili Hashtable nesnesine eleman eklerken Add() metodunda ilk parametre anahtar, ikinci parametre deerdir. Hashtable nesnesine yukardakinin yan sra aadaki gibi de eleman ekleyebiliriz:

h["Anahtar1"]="Deer1"; h["Anahtar2"]="Deer2";

stersek daha sonra Hashtable nesnesindeki anahtarlarn deerlerini deitirebiliriz. rnek:

h["Anahtar1"]="Yeni Deer";
Burada Anahtar1'in deerini deitirdik. Add() metoduyla var olan bir anahtar eklemeye almak istisnai durum olumasna neden olur. Hashtable snfnn Count zellii ilgili Hashtable nesnesindeki anahtar-deer ifti saysn dndrr. Ayrca bir Hashtable nesnesindeki tm anahtarlar elde etmek iin Keys zellii kullanlr. Bu zellik ilgili Hashtable nesnesindeki tm anahtarlar bir ICollection nesnesi (bir koleksiyon) olarak dndrr. Values zellii ise ayn eyi deerler iin yapar. rnek program:

using System; using System.Collections; class hashtable { static void Main() { Hashtable Sozluk=new Hashtable(); Sozluk.Add("araba","car"); Sozluk["kitap"]="book"; ICollection anahtarlar=Sozluk.Keys; foreach(string s in anahtarlar) Console.WriteLine(s); ICollection degerler=Sozluk.Values; foreach(string s in degerler) Console.WriteLine(s); Console.WriteLine("Toplam kelime: "+Sozluk.Count); } }
Bu programn kts u ekildedir:

kitap araba book car Toplam kelime: 2


Bu program yle de yazabiliriz:

using System; using System.Collections; class hashtable { static void Main() { Hashtable Sozluk=new Hashtable();

Sozluk.Add("araba","car"); Sozluk["kitap"]="book"; IDictionaryEnumerator ide=Sozluk.GetEnumerator(); while(ide.MoveNext()) Console.WriteLine(ide.Key+" = "+ide.Value); Console.WriteLine("Toplam kelime: "+Sozluk.Count); } }
Yani Hashtable snfnn static olmayan GetEnumerator() metodu IDictionaryEnumerator arayz trnden bir nesne dndryor. Bu nesne zerinden MoveNext() metoduna eriiyoruz. MoveNext() metodu ilgili IDictionaryEnumerator nesnesinin temsil ettii anahtar-deer iftini bir teleyip true dndryor. Eer teleyemiyorsa false dndryor. Bir Hashtable nesnesinden bir anahtar-deer iftini silmek iin Hashtable snfnn Remove() metodu kullanlr. Parametre olarak anahtar alr. rnek:

Sozluk.Remove("araba");
Bu satr Sozluk koleksiyonundaki "araba" anahtarn ve buna karlk gelen deeri silecektir. Eer ilgili koleksiyon salt-okunur ise, sabit kapasiteli ise, belirtilen anahtar yok ya da deeri null ise istisnai durum oluur. IsReadOnly ve IsFixedSize zellikleri Hashtable snfnda da bulunmaktadr. Hashtable snfnn dier nemli metotlar: void Clear() lgili Hashtable nesnesindeki tm anahtar-deer iftlerini siler. Dolaysyla Hashtable nesnesinin Count zelliinin deeri 0 olur. bool ContainsKey(object anahtar) Parametre ile verilen anahtar ilgili Hashtable nesnesinde varsa true, yoksa false deer dndrr. Ayn snftaki Contains() metodu da ayn ileve sahiptir. bool ContainsValue(object deger) Parametre ile verilen deer ilgili Hashtable nesnesinde varsa true, yoksa false deer dndrr. void CopyTo(Array dizi,int indeks) lgili Hashtable nesnesindeki anahtar-deer iftlerini bir boyutlu Array dizisine indeks indeksinden itibaren kopyalar. Kopyalama ileminin yapld dizi DictionaryEntry yaps trndendir. Bu yapdaki Key ve Value zellikleri ilgili Hashtable nesnesindeki anahtar ve deerleri tutar. lgili Hashtable nesnesindeki sadece anahtarlar bir diziye kopyalamak iin;

hashtable.Keys.CopyTo(dizi,indeks);
Ayn ilemi sadece deerler iin yapmak iinse;

hashtable.Values.CopyTo(dizi,indeks);
[dzenle]SortedList

snf

SortedList koleksiyonunda elemanlara hem anahtar-deer iftli hem de ArrayList snfnda olduu gibi indeksli olarak eriebiliriz. Ancak SortedList snfnn nceki grdmz iki snftan en byk fark elemanlarn daima sral olmasdr. eitli ekillerde SortedList nesneleri oluturulabilir:

SortedList sl1=new SortedList(); SortedList sl2=new SortedList(50); SortedList sl3=new SortedList(IDictionary id);
Birincisinde henz kapasitesi olmayan bir SortedList nesnesi oluturulur. kincisinde balang kapasitesi 50 olan bir SortedList nesnesi oluturulur. ncsnde ise IDictionary arayzn uygulam olan bir snfn nesnesi parametre olarak alnr ve bu snfn (koleksiyonun) elemanlarndan SortedList nesnesi oluturulur. Daha nce grdmz Hashtable snf IDictionary arayzn uygulamtr. nde de kapasite alrsa otomatik olarak kapasite artrlr. SortedList snfnda Hashtable snfndaki Add(), Clear(), Contains(), ContainsKey(), ContainsValue(), GetEnumerator() ve Remove() metotlar bulunur. Kendine zg metotlar ise object GetByIndex(int indeks) lgili SortedList nesnesindeki indeks nolu anahtar-deer iftinin deer ksm dndrlr. object GetKey(int indeks) lgili SortedList nesnesindeki indeks nolu anahtar-deer iftinin anahtar ksm dndrlr. IList GetKeyList() lgili SortedList nesnesindeki anahtarlar IList arayz trnden dndrlr. IList GetValueList() lgili SortedList nesnesindeki deerler IList arayz trnden dndrlr. int IndexOfKey(object anahtar) lgili SortedList nesnesindeki parametrede verilen anahtarn hangi indekste olduu dndrlr. Anahtar bulunamazsa negatif deer dndrlr. int IndexOfValue(object deger) Yukardaki eyi deerler iin yapar. void SetByIndex(int indeks,object deger) lgili SortedList nesnesindeki indeks nolu elemann deeri deger olarak deitirilir. Anahtarda deime olmaz. void TrimToSize() lgili SortedList nesnesinin kapasitesi eleman saysna eitlenir. SortedList snfnn zellikleri ise Capacity, Count, IsFixed, IsReadOnly, Keys ve Values'dir. Keys ve Values zellikleri ile Hashtable snfnda olduu gibi ICollection nesnesi elde edilir. lgili SortedList nesnesindeki elemanlara erimek iin Keys ve Values zellikleri kullanlabilecei gibi DictionaryEntry yaps da kullanlabilir. Bu yap ilgili koleksiyondaki deer ve anahtarlar temsil eden zellikler ierir. rnee gemeden nce SortedList snfnn sralamay nasl yaptn sylemek istiyorum: Herhangi bir SortedList nesnesiyle her ilem yapldktan sonra ilgili koleksiyon sralanr. Sralama anahtarlara gredir. Dolaysyla biz anahtarlarn srasn deitiremeyiz. imdi SortedList snfyla ilgili bir rnek yapalm:

using System; using System.Collections; class sortedlist { static void Main() { string[] kelimeler={"araba","masa","defter","kitap","okul"}; SortedList sozluk=new SortedList();

sozluk.Add("araba","car"); sozluk.Add("masa","table"); sozluk.Add("kalem","pencil"); sozluk["kitap"]="book"; sozluk["bilgisayar"]="computer"; EkranaYaz(sozluk); for(int i=0;i<kelimeler.Length;i++) if(sozluk.ContainsKey(kelimeler[i])) Console.WriteLine(kelimeler[i]+"="+sozluk[kelimeler[i]]); else Console.WriteLine(kelimeler[i]+" szlkte bulunamad."); Console.WriteLine(); sozluk.Add("doru","line"); EkranaYaz(sozluk); Console.WriteLine(); Console.WriteLine("Sral listede toplam {0} eleman bulunmaktadr.",sozluk.Count); Console.WriteLine("Bu elemanlar: "); ICollection anahtarlar=sozluk.Keys; foreach(string s in anahtarlar) Console.Write(s+"-"); } static void EkranaYaz(SortedList sl) { foreach(DictionaryEntry de in sl) Console.WriteLine("{0,-12}:{1,-12}",de.Key,de.Value); Console.WriteLine(); } }
[dzenle]BitArray

snf

BitArray iinde yalnzca bool trnden nesneler saklayabilen bir koleksiyondur. Bir BitArray nesnesi u yollarla oluturulabilir.

BitArray BitArray BitArray BitArray BitArray BitArray

ba1=new ba3=new ba4=new ba5=new ba6=new ba7=new

BitArray(BitArray ba2); BitArray(bool[] b); BitArray(byte[] by); BitArray(int[] i); BitArray(int boyut); BitArray(int boyut,bool deger);

Birincisinde baka bir BitArray nesnesinden yeni bir BitArray nesnesi oluturulur. Yani tabiri caizse kopyalama ilemi yaplm olur. kincisinde bir bool dizisinden yeni bir BitArray nesnesi oluturulur.

ncsnde bir byte dizisinden yeni bir BitArray nesnesi oluturulur. Bir bayt 8 bittir. Yani bir baytn iinde 8 tane 1 veya 0 vardr. te bu 1 veya 0'lar BitArray koleksiyonuna true ve false ol arak geirilir. Yani son tahlilde BitArray dizisindeki eleman says 8*by.length olur. Drdncsnde bir int dizisinden yeni bir BitArray nesnesi oluturulur. Bir int nesnesinin iinde 32 tane 1 veya 0 vardr. nk int 32 bitlik bir veri tipidir. Bu 1 veya 0'lar BitArray koleksiyonuna true veya false olarak geirilir. Yani son tahlilde BitArray dizisindeki eleman says 32*i.Length olur. Beincisinde boyut tane false eleman ieren bir BitArray nesnesi oluturulur. Altncsnda boyut tane degerden oluan bir BitArray nesnesi oluturulur. BitArray snf ICollection ve IEnumerable arayzlerini uygulamtr. rnek bir program:

using System; using System.Collections; class bitarray { static void Main() { int[] i={1}; BitArray ba=new BitArray(i); EkranaYaz(ba); } static void EkranaYaz(BitArray ba) { IEnumerator ie=ba.GetEnumerator(); int i=0; while(ie.MoveNext()) { i++; Console.Write("{0,-6}",ie.Current); if(i%8==0) Console.WriteLine(); } Console.WriteLine(); } }
Bu programn ekran kts yle olmaldr:

True False False False

False False False False

False False False False

False False False False

False False False False

False False False False

False False False False

False False False False

Bu programda ba'y ekrana klasik foreach ile de yazdrabilirdik. Ancak byle bir yntemin de olduunu bilmenizde fayda var.

BitArray snfnn Count ve Length adl iki zellii vardr. kisi de ilgili BitArray nesnesinin eleman saysn verir. Ancak Count salt-okunur olmasna ramen Length deildir. Yani Length zellii ile ilgili BitArray nesnesinin eleman saysn deitirebiliriz. Eer var olan eleman saysn azaltrsak sonundan gerekli sayda eleman silinecektir. Eer eleman saysn artrsak sona gerekli sayda false eleman eklenir. BitArray snfnn nemli metotlar: bool Get(int indeks) lgili BitArray nesnesindeki parametre ile verilen indeksteki eleman geri dndrlr. void Set(int indeks,bool deger) lgili BitArray nesnesindeki parametre ile verilen indeksteki eleman deger olarak deitirilir. void SetAll(bool deger) lgili BitArray nesnesindeki tm elemanlar deger olarak deitirilir. BitArray And(BitArray ba) lgili BitArray nesnesindeki elemanlarla parametredeki BitArray nesnesindeki elemanlar karlkl olarak VE ilemine sokar. Sonucu yine bir BitArray nesnesi olarak tutar. Eer iki nesnenin eleman saylar eit deilse istisnai durum oluur. BitArray Or(BitArray ba) And() metoduyla ayn mantkta alr. Tek deien elemanlarn VE deil de VEYA ilemine sokulmasdr. BitArray Xor(BitArray ba) And() ve Or() metotlaryla ayn mantkta alr. Tek deien elemanlarn ZEL VEYA ilemine sokulmasdr. BitArray Not() lgili BitArray nesnesindeki elemanlarn deilini alr ve yeni bir BitArray nesnesi olarak dndrr.

[dzenle]Stack

snf

System.Collections isim alanndaki Stack snf bilgisayar bilimlerinde oka karmza kabilecek ynlarla almamz salar. Ynlar st ste koyulmu kitaplar gibi dnebiliriz. En stteki kitab rahatlkla alp okuyabiliriz. Ancak okuyacamz kitap ortalarda veya altlarda ise nce okuyacamz kitabn stndeki kitaplar teker teker yndan karp sonra okuyacamz kitab almalyz. br trl kitap destesi devrilebilir. te ynlarda da ayn mantk sz kon usudur. Ynlara koleksiyonlara bu mantn eklenmi hlidir diyebiliriz. Normal koleksiyonlarda istediimiz her an koleksiyonun istediimiz elemanna eriebiliyorduk. Ancak ynlarda bir anda ynn yalnzca bir elemanna eriebiliriz. Daha alttaki elemanlara eriebilmek iin stteki elemanlarn teker teker yndan karlmas gerekir. Ynlarn mantn u cmleyle zetleyebiliriz: "En nce giren en son kar, en son giren en nce kar." Yani yna eklenen her bir elemann birbirinin stne geldiini syleyebiliriz. Stack snfnda tpk dier koleksiyonlardaki gibi eleman eklendike otomatik olarak kapasite artar. Bir Stack nesnesi u yollardan biriyle olturulabilir.

Stack s1=new Stack(); Stack s2=new Stack(int kapasite); Stack s3=new Stack(ICollection ic);
Birincisinde klasik bir Stack nesnesi oluturulur. kincisinde kapasitesi kapasite olan bir Stack nesnesi oluturulur. Tabii ki kapasite alrsa otomatik olarak kapasite artrlr. ncsnde

ICollection arayzn kullanan baka bir koleksiyon nesnesinden yeni bir Stack nesnesi oluturulur. Stack snfnn nemli ye elemanlar: object Pop() lgili yndaki en stteki eleman dndrr ve yndan karr. object Peek() lgili yndaki en stteki eleman dndrr ama yndan karmaz. void Push(object o) lgili ynn en stne o elemann ekler. void Clear() lgili yndaki btn elemanlar siler. object[] ToArray() lgili yndaki elemanlar object dizisi olarak dndrlr. bool Contains(object o) Eer o nesnesi ilgili ynda varsa true, yoksa false dndrlr. int Count Bu zellik ilgili yndaki eleman saysn verir. Peek() ve Pop() metotlar ilgili yn boken kullanlrsa istisnai durum oluur. Bir yndaki elemanlarn tamamna bir koleksiyonmu gibi erimek iin Stack snfnn GetEnumerator() metodu kullanlr. Bu metot bir IEnumerator nesnesi dndrr. IEnumerator arayznn MoveNext() metoduyla bir while dngs kurarsak ilgili yndaki tm elemanlara eriebiliriz. rnek:

using System; using System.Collections; class stack { static void Main() { Stack s=new Stack(); s.Push(5); s.Push(10); EkranaYaz(s); } static void EkranaYaz(Stack s) { IEnumerator ie=s.GetEnumerator(); while(ie.MoveNext()) Console.WriteLine(ie.Current); } }
Bu programdaki EkranaYaz() metodunu yle de yazabilirdik:

static void EkranaYaz(Stack s) { Stack yeniyigin=(Stack)s.Clone(); while(yeniyigin.Count>0) Console.WriteLine(yeniyigin.Pop().ToString()); }


Buradaki Clone() metodu bir ynn kopyasn object olarak alr. Dolaysyla bu yeni yn bir Stack nesnesine atamak iin tekrar Stack trne dnm yapmak gerekir. Yine EkranaYaz() metodunu klasik foreach dngsyle de yazabilirdik:

static void EkranaYaz(Stack s) { foreach(object o in s) Console.WriteLine(o); }


[dzenle]Queue

snf

Queue snf Stack snfna olduka benzer. Ancak Stack snfnn tam tersi bir manta sahiptir. Queue snfnda "En nce giren en erken kar, en son giren en ge kar." mant geerlidir. Bunu yle kavrayabiliriz: Kendimizi bankada bir veznedar olarak dnelim. Kuyrukta bekleyen birok kii var. Tabii ki kuyruktaki en ndeki kiinin ii en erken bitecek ve kuyruktan en nce o ayrlacaktr. Kuyruun en arkasndaki kiinin ii ise en ge bitecektir. Bizim veznedar olarak en arkadaki kiinin iini halledebilmemiz iin o kiinin nndeki kiilerin de ilerini bitirmemiz gerekir. Queue snfnn nemli ye elemanlar: object Dequeue() lgili kuyruun en bandaki eleman dndrr ve kuyruktan karr. void Enqueue(object o) o nesnesi ilgili kuyruun en sonuna eklenir. object Peek() lgili kuyruun en bandaki eleman dndrr ama kuyruktan karmaz. int Count lgili kuyruktaki eleman saysn verir. object[] ToArray() lgili kuyruk bir object dizisi olarak tutulur. void TrimToSize() lgili kuyruun kapasitesiyle eleman says eitlenir. Yeni bir Queue nesnesi yle oluturulabilir.

Queue q1=new Queue(); Queue q2=new Queue(int kapasite); Queue q3=new Queue(ICollection ic);
Bir Queue nesnesinin iinde Stack nesnelerinin iinde dolatmz gibi dolaabiliriz. Buna rnek verilmeyecektir.

[dzenle]ablon

tipli koleksiyonlar

imdiye kadar BitArray hari btn koleksiyon snflarnda koleksiyona eklenen nesne objecte dntrlp saklanr. Sonra bu nesneyi elde etmek istediimizde ise tekrar orijinal tre dnm yapmak gerekir. Bunun sonucunda hem performans kayb (tr dnmlerinden dolay) hem de tr emniyetsizlii olumaktadr. Tr emniyetsizliinin nedeni ise ilgili koleksiyonda her trden veri saklayabilmemizdir. Szlk iin kullanacamz bir koleksiyonun yalnzca string nesneleri kabul etmesi gerekir. Ancak klasik koleksiyonlarda her trden nesne atayabilmemiz bu kontrol imkansz klmaktadr. ablon tipli koleksiyon snflar System.Collections.Generic isim alanndadr. imdiye kadar grdmz btn koleksiyonlarn ablon tipli versiyonlar bu isim alannda bulunmaktadr. ablon tipli koleksiyon snflarnn karl olduklar normal koleksiyon snflarndan ablon tipli olmalar dnda fazla fark yoktur. Burada bu ablon tipli koleksiyon snflar ksaca tantlacaktr.

[dzenle]List<T>

snf

ArrayList snfnn ablon tipli versiyonudur. rnek bir List<T> nesnesi yaratm:

List<int> l=new List<int>();


[dzenle]Dictionary<T,V>

snf

Hashtable snfnn ablon tipli versiyonudur. rnek bir Dictionary<T,V> nesnesi yaratm:

Dictionary<int,string> d=new Dictionary<int,string>();


[dzenle]SortedDictionary<K,V>

snf

SortedList snfnn ablon tipli versiyonudur. rnek bir SortedDictionary<K,V> nesnesi yaratm:

SortedDictionary<int,string> sd=new SortedDictionary<int,string>();


[dzenle]IEnumerable<T>

ve IEnumerator<T> arayzleri

Klasik versiyonlarndan tretilen bu arayzler ablon tipli koleksiyon snflarna arayzlk yapmaktadr. Kendimiz de ablon tipli koleksiyon snflar yazmak istiyorsak bu arayzleri kullanmalyz.

[dzenle]Queue<T>

ve Stack<T> snflar

Queue ve Stack snflarn ablon tipli versiyonlardr.

[dzenle]Koleksiyonlara

kendi nesnelerimizi yerletirmek

imdiye kadar koleksiyonlara string, int gibi .Net Framework ktphanesindeki hazr snflarn nesnelerini koyduk. Halbuki kendi oluturduumuz snflarn nesnelerini de koleksiyonlara koyabiliriz. Ancak bu durumda bir sorun ortaya kar. Derleyici koleksiyonu sralarken nasl sralayacak? Bu sorunu zmek iin snfmza IComparable arayzn uygulattrrz. Bu arayz nceden de bildiiniz gibi CompareTo() metodunu iermektedir. imdi programmz yazmaya balayalm:

using System; using System.Collections; class Sayi:IComparable { public int sayi; public Sayi(int sayi) { this.sayi=sayi; } public int CompareTo(object o) { Sayi s=(Sayi)o; return sayi.CompareTo(s.sayi); } }

class AnaProgram { static void Main() { ArrayList al=new ArrayList(); Sayi s1=new Sayi(10); Sayi s2=new Sayi(20); Sayi s3=new Sayi(-23); al.Add(s1); al.Add(s2); al.Add(s3); al.Sort(); foreach(Sayi s in al) Console.WriteLine(s.sayi); } }

C Sharp Programlama Dili/Koleksiyonlar


Vikikitap, zgr ktphane
< C Sharp Programlama Dili

Koleksiyonlar nesneleri gruplamaya yarayan snflardr. Yani bir koleksiyon nesnesi birden fazla nesneyi temsil eder. .Net Framework ktphanesindeki koleksiyon snflar System.Collections isim alanndadr. Koleksiyonlarla diziler arasnda u farklar vardr:

Diziler System.Array trnden birer nesnedir. Koleksiyonlar ise System.Collections isim alanndaki eitli snflar trnden birer nesnedir. Koleksiyonlar dizilere gre bize daha fazla zgrlk verir. nk koleksiyonlar iinde her trden nesne tutabiliriz. Ayrca koleksiyonlarn boyutu sabit deildir. Eleman eklendik e boyut dinamik olarak artar. Koleksiyonlar bize bunun gibi benzer avantajlar da verir. Konuyu iledike bu avantajlar greceksiniz.

Koleksiyon snflarnn tamam IEnumerable arayzn uygulamtr. Dolaysyla tm koleksiyon nesneleri foreach dngsyle kullanlabilir. Ayrca bunun haricinde her koleksiyon snf kendine zg birtakm arayzleri de uygulam olabilir. rnein birazdan greceimiz ArrayList snf IList ve ICollection arayzlerini de uygulamtr. Bu arayzlerin her birinin farkl anlamlar vardr. imdi bu arayzleri grelim: ICollection Bu arayz bir koleksiyonda bulunabilecek en temel ye elemanlar ierir. System.Collections isim alanndaki btn koleksiyon snflar bu arayz uygulamtr. ICollection arayz IEnumerable arayznden tremitir. Dolaysyla ICollection arayzn uygulayan bir snf IEnumerable arayzn de uygulam demektir. IComparer Bu arayz iki nesnenin karlatrlabilmesini salayan Compare() metodunu ierir. Bu metot iki nesnenin nasl karlatrlacan belirler. Compare() metodunun prototipi u ekildedir:

int Compare(object o1,object o2)

Compare metodu -1, 0 ya da 1 deeri dndrr. Karlatrma genellikle byklk -kklk ilikisine gre yaplr. IDictionary Bu arayz anahtar-kilit ilikisini uygulayan koleksiyon snflar uygular. Anahtar-kilit ilikisini daha sonra greceiz. IDictionary arayz ICollection arayznden tremitir. IDictionaryEnumerator IDictionary arayznn zellemi bir eklidir. leride greceiz. IEnumerable lgili koleksiyon nesnesinin foreach dngsyle kullanlabilmesini salayan arayzdr. IEnumerator IEnumerable arayzyle son derece ilikilidir. IEnumerable arayz IEnumerator arayznn kullanlmasn zorlar. Aslnda foreach dngsnn kurulabilmesi iin gerekli ye elemanlar IEnumerator arayzndedir. IEnumerable arayz sadece IEnumerator arayzn zorlamak iin arac vazifesi grr. IList Koleksiyon nesnelerine bir indeks numarasyla eriilebilmesini salayan arayzdr. IList ICollection arayznden tremitir. IHashProvider leride greceimiz Hashtable koleksiyon snfyla ilgilidir. System.Collections isim alanndaki arayzlerden sonra artk ayn isim alanndaki koleksiyon snflarna geebiliriz. Bunlar ArrayList, Hashtable, SortedList, BitArray, Stack ve Queue snflardr. imdi bu snflar teker teker inceleyelim.

Konu balklar [gizle]


1 ArrayList snf 2 Hashtable snf 3 SortedList snf 4 BitArray snf 5 Stack snf 6 Queue snf 7 ablon tipli koleksiyonlar
o o o o o

7.1 List<T> snf 7.2 Dictionary<T,V> snf 7.3 SortedDictionary<K,V> snf 7.4 IEnumerable<T> ve IEnumerator<T> arayzleri 7.5 Queue<T> ve Stack<T> snflar

8 Koleksiyonlara kendi nesnelerimizi yerletirmek


[dzenle]ArrayList

snf

Koleksiyon snflarnn en genel amal olandr. Dizilere olduka benzer. Dizilerden tek fark eleman saysnn sabit olmamas ve yalnzca object tipinden nesneleri saklamasdr. ArrayList snf ICollection, IEnumerable, IList ve ICloneable arayzlerini uygular. ArrayList snfnn ar yklenmi tane yapc metodu vardr. Bunlar:

ArrayList al=new ArrayList();

Bu ekilde kapasitesi olmayan bir ArrayList nesnesi oluturulur. Tabii ki koleksiyona yeni nesneler eklendike bu kapasite dinamik olarak artacaktr.

ArrayList al=new ArrayList(50);


Bu ekilde 50 kapasiteli bir ArrayList nesnesi oluturulur. Yine kapasite alrsa dinamik olarak artrlr.

ArrayList al=new ArrayList(ICollection ic);


Burada ICollection arayzn uygulam herhangi bir snf nesnesi parametre olarak verilir. Daha nceden dediim gibi ArrayList snf nesneleri object olarak tutar. Yani bu koleksiyondan nesneleri elde ettiimizde object hldedirler. Genellikle bu nesneleri kullanabilmek iin orijinal tre tr dnm operatryle dnm yapmak gerekir. Bir ArrayList nesnesine nesne eklemek iin Add() metodu kullanlr. Bu metot parametre olarak object nesnesi alr ve bu nesneyi koleksiyonun sonuna ekler. Ayn ekilde bir ArrayList koleksiyonundan eleman karmak iin Remove() metodu kullanlr. Parametre olarak verilen object nesnesi koleksiyondan karlr. Eer nesne bulunamazsa hata olumaz, program ileyiine devam eder. Ayrca herhangi bir ArrayList koleksiyonunun kapasitesini renmek iin ArrayList snfnn Capacity zellii kullanlr. imdi btn bu ye elemanlar bir rnek zerinde grelim:

using System; using System.Collections; class Koleksiyonlar { static void Main() { ArrayList al=new ArrayList(); Console.WriteLine("Kapasite: "+al.Capacity); al.Add(5); Console.WriteLine("Kapasite: "+al.Capacity); al.Add("Deneme"); Console.WriteLine("Kapasite: "+al.Capacity); al.Add('D'); Console.WriteLine("Kapasite: "+al.Capacity); al.Add(1.2f); Console.WriteLine("Kapasite: "+al.Capacity); al.Add(3.4); Console.WriteLine("Kapasite: "+al.Capacity); al.Add(1.2m); Console.WriteLine("Kapasite: "+al.Capacity); al.Add("Vikikitap"); Console.WriteLine("Kapasite: "+al.Capacity); al.Add('e'); Console.WriteLine("Kapasite: "+al.Capacity); al.Add(2); Console.WriteLine("Kapasite: "+al.Capacity); EkranaYaz(al); al.Remove("Deneme");

Console.WriteLine("Kapasite: "+al.Capacity); EkranaYaz(al); } static void EkranaYaz(ArrayList al) { foreach(object o in al) Console.Write(o.ToString()+" "); Console.WriteLine(); } }
Bu programn ekran kts yle olmaldr:

Kapasite: 0 Kapasite: 4 Kapasite: 4 Kapasite: 4 Kapasite: 4 Kapasite: 8 Kapasite: 8 Kapasite: 8 Kapasite: 8 Kapasite: 16 5 Deneme D 1,2 3,4 1,2 Vikikitap e 2 Kapasite: 16 5 D 1,2 3,4 1,2 Vikikitap e 2
Bu ekran ktsndan unlar anlyoruz:

Kapasite bata 0, sonra 4, sonra da gerekli olduunda kapasite ikier kat artrlyor. Remove() metoduyla koleksiyonunun elemann silmek kapasiteyi deitirmiyor. Yani Remove() metoduyla yaplan ey koleksiyondan bir nesne silip onun yerine sona bir null eklemek.

NOT: C#'ta geersiz trler arasnda dnm yapmak yasaktr. rnein bir object nesnesinin gizli tr string deilse bunu

string s=(string)o;
eklinde stringe eviremeyiz. Bir ArrayList koleksiyonuna nesne yerletirmek (araya sktrmak) iin Insert metodu kullanlr. Prototipi u ekildedir:

void Insert(int indeks,object deger)


Bu metotla ilgili koleksiyonun indeks nolu elemanna deger koyulur. Bu indeksteki nceki eleman ve bu indeksten sonraki elemanlar ileriye bir birim telenir. Bildiimiz zere bu normal dizilerde mmkn deildi.

Sabit kapasiteli ArrayList koleksiyonu oluturmak iinse ArrayList snfnn static FixedSize metodu kullanlr. rnek:

ArrayList al=ArrayList.FixedSize(ArrayList koleksiyon);


Yani burada nceden tanmlanm bir ArrayList nesnesi baka bir ArrayList nesnesine sabit kapasiteli olarak atanyor. Eer al koleksiyonunun kapasitesi alrsa tpk dizilerdeki gibi istisnai durum meydana gelir. NOT: ArrayList koleksiyonunun elemanlarna tpk dizilerdeki gibi indeksleyici ile de eriilebilir. imdi istersek ArrayList snfnn dier nemli ye elemanlarna bir gz atalm. nce zellikler: Count lgili ArrayList nesnesindeki toplam eleman saysn verir. Capacity zellii ile kartrlmamaldr. Count zellii "doldurulmu" eleman saysn verir. Geri dn tipi inttir. IsFixedSize lgili ArrayList nesnesinin sabit kapasiteli olup olmadn verir. Eer sabit kapasiteli ise true, deilse false deer dndrr. IsReadOnly lgili ArrayList nesnesinin salt okunur olup olmadn verir. Eer salt-okunur ise true, deilse false deer dndrr. Salt-okunur ArrayList nesneleri elde etmek iin ArrayList snfnn static ReadOnly() metodu kullanlr. Kullanm FixedSize() metodu ile ayndr. Sra geldi metotlara: AddRange(ICollection ic) Bu metot ile parametredeki koleksiyonun tm elemanlar ilgili koleksiyonun sonuna eklenir. Parametrenin ICollection tipinden olmas demek bu snfn ICollection arayzn uygulamas gerekliliini belirtir. Bildiiniz gibi System.Generic isim alanndaki btn koleksiyonlar ICollection arayzn uygulamtr. Sort() Koleksiyonlar sralamak iin kullanlr. Eer koleksiyon salt-okunur ise istisnai durum oluur. farkl ar yklenmi hli vardr: void Sort() lgili koleksiyonu ilgili koleksiyonun Compare() metodu kullanarak sralar. Tabii ki ilgili koleksiyon IComparer arayzn uygulamaldr. void Sort(IComparer ic) IComparer arayzn uygulayan baka bir snfn Compare() metodu kullanlarak sralama yaplr. void Sort(int indeks,int adet,IComparer ic) sttekinden tek fark bunda sadece indeksten itibaren adet kadar elemann sralanmasdr. int BinarySearch(object o) Sralanm koleksiyonlarda arama yaplr. Eer o nesnesi bulunursa bulunulan indeksle geri dnlr, bulunamazsa negatif bir sayyla geri dnlr. Bu metodun aadaki gibi iki versiyonu daha vardr: int BinarySearch(object o,IComparer ic) Arama iin baka bir snfn Compare() metodu kullanlr. Bu metot daha ok kullancnn tanmlad trden nesneler ieren koleksiyonlarda arama yapmak iin kullanlr. int BinarySearch(int indeks,int adet,object o,IComparer ic) stekinden tek fark indeksten itibaren adet kadar eleman iinde arama yaplmasdr. void Reverse() lgili koleksiyon ters evrilir. Baka bir kullanm daha vardr. void Reverse(int indeks,int adet) Ters evirme ilemi yalnzca indeksten itibaren adet kadar elemana uygulanr.

void Clear() lgili koleksiyonun tm elemanlar temizlenir. Dolaysyla Count zellii sfrlanrken Capacity zelliinin deeri deimez. void TrimToSize() Koleksiyonun kapasitesi eleman saysndan fazla olduu durumlarda gereksiz ksmlar silinir. Dolaysyla kapasiteyle eleman says eitlenir. bool Contains(object o) Parametre ile verilen nesnenin ilgili koleksiyonda bulunup bulunmad kontrol edilir. Eer varsa true, yoksa false deer dndrr. void CopyTo() ArrayList nesnesindeki elemanlar normal tek boyutlu dizilere (System.Array) kopyalamak iin kullanlr. farkl kullanm vardr: void CopyTo(Array a) Metodu aran ArrayList nesnesindeki tm elemanlar a dizisine ilk indeksten itibaren kopyalanr. void CopyTo(Array a,int indeks) sttekiyle ayn greve sahiptir. Tek fark kopyalamann indeks. elemandan itibaren yaplmasdr. void CopyTo(int indeks,Array a,int dizi_indeks,int adet) Metodu aran ArrayList nesnesindeki indeksten itibaren adet kadar eleman a dizisinde dizi_indeks indeksli eleman ve sonrasna kopyalanr. ArrayList GetRange(int indeks,int adet) Metodu aran ArrayList nesnesinin indeks nolu elemanndan itibaren adet kadar eleman yeni bir ArrayList nesnesi olarak tutulur. int IndexOf(object o) Parametre olarak verilen o nesnesinin ilgili ArrayList nesnesinde ilk bulunduu indeksi dndrr. Object nesnesi bulunamazsa negatif deer dndrlr. object[] ToArray() lgili ArrayList nesnesindeki elemanlar bir object dizisi olarak tutar. Farkl bir versiyonu daha vardr: Array ToArray(Type t) lgili ArrayList nesnesindeki elemanlar t trnden bir dizi olarak tutar. Yani gerekli tr dnm ilemleri otomatik olarak yaplr. void RemoveAt(int indeks) lgili ArrayList nesnesindeki indeks nolu eleman siler. Belirtilen indeks 0'dan kk ya da koleksiyonun Count deerinden bykse istisnai durum oluur.

[dzenle]Hashtable

snf

Array ve ArrayList snflarnda dizideki elemanlara belirli bir indeks numaras ile eriiriz. Ancak bu bazen uygun yntem olmayabilir. nk hangi nesnenin hangi indekse karlk geldiini bilmemiz gerekir. Halbuki System.Collections isim alanndaki Hashtable snfnda koleksiyonumuzun her nesnesine istediimiz bir ismi verip koleksiyonumuzun elemanlarna bu isimlerle eriebiliriz. Bunun dier ad anahtar-deer ilikisidir. Yani bir anahtarla yalnzca bir nesneyi ifade ederiz. rnek:

Hashtable h=new Hashtable(); h.Add("Anahtar1","Deer1"); h.Add("Anahtar2","Deer2");


Grdnz gibi her Hashtable nesnesinin iki ksm var. Bunlardan birisi ilgili nesnenin ismi (anahtar) tekisi de nesnenin kendisi (deer). Bu ikisinin tipi string olmak zorunda deildir. istenilen tr olabilir. lgili

Hashtable nesnesine eleman eklerken Add() metodunda ilk parametre anahtar, ikinci parametre deerdir. Hashtable nesnesine yukardakinin yan sra aadaki gibi de eleman ekleyebiliriz:

h["Anahtar1"]="Deer1"; h["Anahtar2"]="Deer2";
stersek daha sonra Hashtable nesnesindeki anahtarlarn deerlerini deitirebiliriz. rnek:

h["Anahtar1"]="Yeni Deer";
Burada Anahtar1'in deerini deitirdik. Add() metoduyla var olan bir anahtar eklemeye almak istisnai durum olumasna neden olur. Hashtable snfnn Count zellii ilgili Hashtable nesnesindeki anahtar deer ifti saysn dndrr. Ayrca bir Hashtable nesnesindeki tm anahtarlar elde etmek iin Keys zellii kullanlr. Bu zellik ilgili Hashtable nesnesindeki tm anahtarlar bir ICollection nesnesi (bir koleksiyon) olarak dndrr. Values zellii ise ayn eyi deerler iin yapar. rnek program:

using System; using System.Collections; class hashtable { static void Main() { Hashtable Sozluk=new Hashtable(); Sozluk.Add("araba","car"); Sozluk["kitap"]="book"; ICollection anahtarlar=Sozluk.Keys; foreach(string s in anahtarlar) Console.WriteLine(s); ICollection degerler=Sozluk.Values; foreach(string s in degerler) Console.WriteLine(s); Console.WriteLine("Toplam kelime: "+Sozluk.Count); } }
Bu programn kts u ekildedir:

kitap araba book car Toplam kelime: 2


Bu program yle de yazabiliriz:

using System; using System.Collections; class hashtable

{ static void Main() { Hashtable Sozluk=new Hashtable(); Sozluk.Add("araba","car"); Sozluk["kitap"]="book"; IDictionaryEnumerator ide=Sozluk.GetEnumerator(); while(ide.MoveNext()) Console.WriteLine(ide.Key+" = "+ide.Value); Console.WriteLine("Toplam kelime: "+Sozluk.Count); } }
Yani Hashtable snfnn static olmayan GetEnumerator() metodu IDictionaryEnumerator arayz trnden bir nesne dndryor. Bu nesne zerinden MoveNext() metoduna eriiyoruz. MoveNext() metodu ilgili IDictionaryEnumerator nesnesinin temsil ettii anahtar-deer iftini bir teleyip true dndryor. Eer teleyemiyorsa false dndryor. Bir Hashtable nesnesinden bir anahtar-deer iftini silmek iin Hashtable snfnn Remove() metodu kullanlr. Parametre olarak anahtar alr. rnek:

Sozluk.Remove("araba");
Bu satr Sozluk koleksiyonundaki "araba" anahtarn ve buna karlk gelen deeri silecektir. Eer ilgili koleksiyon salt-okunur ise, sabit kapasiteli ise, belirtilen anahtar yok ya da deeri null ise istisnai durum oluur. IsReadOnly ve IsFixedSize zellikleri Hashtable snfnda da bulunmaktadr. Hashtable snfnn dier nemli metotlar: void Clear() lgili Hashtable nesnesindeki tm anahtar-deer iftlerini siler. Dolaysyla Hashtable nesnesinin Count zelliinin deeri 0 olur. bool ContainsKey(object anahtar) Parametre ile verilen anahtar ilgili Hashtable nesnesinde varsa true, yoksa false deer dndrr. Ayn snftaki Contains() metodu da ayn ileve sahiptir. bool ContainsValue(object deger) Parametre ile verilen deer ilgili Hashtable nesnesinde varsa true, yoksa false deer dndrr. void CopyTo(Array dizi,int indeks) lgili Hashtable nesnesindeki anahtar-deer iftlerini bir boyutlu Array dizisine indeks indeksinden itibaren kopyalar. Kopyalama ileminin yapld dizi DictionaryEntry yaps trndendir. Bu yapdaki Key ve Value zellikleri ilgili Hashtable nesnesindeki anahtar ve deerleri tutar. lgili Hashtable nesnesindeki sadece anahtarlar bir diziye kopyalamak iin;

hashtable.Keys.CopyTo(dizi,indeks);
Ayn ilemi sadece deerler iin yapmak iinse;

hashtable.Values.CopyTo(dizi,indeks);
[dzenle]SortedList

snf

SortedList koleksiyonunda elemanlara hem anahtar-deer iftli hem de ArrayList snfnda olduu gibi indeksli olarak eriebiliriz. Ancak SortedList snfnn nceki grdmz iki snftan en byk fark elemanlarn daima sral olmasdr. eitli ekillerde SortedList nesneleri oluturulabilir:

SortedList sl1=new SortedList(); SortedList sl2=new SortedList(50); SortedList sl3=new SortedList(IDictionary id);
Birincisinde henz kapasitesi olmayan bir SortedList nesnesi oluturulur. kincisinde balang kapasitesi 50 olan bir SortedList nesnesi oluturulur. ncsnde ise IDictionary arayzn uygulam olan bir snfn nesnesi parametre olarak alnr ve bu snfn (koleksiyonun) elemanlarndan SortedList nesnesi oluturulur. Daha nce grdmz Hashtable snf IDictionary arayzn uygulamtr. nde de kapasite alrsa otomatik olarak kapasite artrlr. SortedList snfnda Hashtable snfndaki Add(), Clear(), Contains(), ContainsKey(), ContainsValue(), GetEnumerator() ve Remove() metotlar bulunur. Kendine zg metotlar ise object GetByIndex(int indeks) lgili SortedList nesnesindeki indeks nolu anahtar-deer iftinin deer ksm dndrlr. object GetKey(int indeks) lgili SortedList nesnesindeki indeks nolu anahtar-deer iftinin anahtar ksm dndrlr. IList GetKeyList() lgili SortedList nesnesindeki anahtarlar IList arayz trnden dndrlr. IList GetValueList() lgili SortedList nesnesindeki deerler IList arayz trnden dndrlr. int IndexOfKey(object anahtar) lgili SortedList nesnesindeki parametrede verilen anahtarn hangi indekste olduu dndrlr. Anahtar bulunamazsa negatif deer dndrlr. int IndexOfValue(object deger) Yukardaki eyi deerler iin yapar. void SetByIndex(int indeks,object deger) lgili SortedList nesnesindeki indeks nolu elemann deeri deger olarak deitirilir. Anahtarda deime olmaz. void TrimToSize() lgili SortedList nesnesinin kapasitesi eleman saysna eitlenir. SortedList snfnn zellikleri ise Capacity, Count, IsFixed, IsReadOnly, Keys ve Values'dir. Keys ve Values zellikleri ile Hashtable snfnda olduu gibi ICollection nesnesi elde edilir. lgili SortedList nesnesindeki elemanlara erimek iin Keys ve Values zellikleri kullanlabilecei gibi DictionaryEntry yaps da kullanlabilir. Bu yap ilgili koleksiyondaki deer ve anahtarlar temsil eden zellikler ierir. rnee gemeden nce SortedList snfnn sralamay nasl yaptn sylemek istiyorum: Herhangi bir SortedList nesnesiyle her ilem yapldktan sonra ilgili koleksiyon sralanr. Sralama anahtarlara gredir. Dolaysyla biz anahtarlarn srasn deitiremeyiz. imdi SortedList snfyla ilgili bir rnek yapalm:

using System; using System.Collections; class sortedlist { static void Main() {

string[] kelimeler={"araba","masa","defter","kitap","okul"}; SortedList sozluk=new SortedList(); sozluk.Add("araba","car"); sozluk.Add("masa","table"); sozluk.Add("kalem","pencil"); sozluk["kitap"]="book"; sozluk["bilgisayar"]="computer"; EkranaYaz(sozluk); for(int i=0;i<kelimeler.Length;i++) if(sozluk.ContainsKey(kelimeler[i])) Console.WriteLine(kelimeler[i]+"="+sozluk[kelimeler[i]]); else Console.WriteLine(kelimeler[i]+" szlkte bulunamad."); Console.WriteLine(); sozluk.Add("doru","line"); EkranaYaz(sozluk); Console.WriteLine(); Console.WriteLine("Sral listede toplam {0} eleman bulunmaktadr.",sozluk.Count); Console.WriteLine("Bu elemanlar: "); ICollection anahtarlar=sozluk.Keys; foreach(string s in anahtarlar) Console.Write(s+"-"); } static void EkranaYaz(SortedList sl) { foreach(DictionaryEntry de in sl) Console.WriteLine("{0,-12}:{1,-12}",de.Key,de.Value); Console.WriteLine(); } }
[dzenle]BitArray

snf

BitArray iinde yalnzca bool trnden nesneler saklayabilen bir koleksiyondur. Bir BitArray nesnesi u yollarla oluturulabilir.

BitArray BitArray BitArray BitArray BitArray BitArray

ba1=new ba3=new ba4=new ba5=new ba6=new ba7=new

BitArray(BitArray ba2); BitArray(bool[] b); BitArray(byte[] by); BitArray(int[] i); BitArray(int boyut); BitArray(int boyut,bool deger);

Birincisinde baka bir BitArray nesnesinden yeni bir BitArray nesnesi oluturulur. Yani tabiri caizse kopyalama ilemi yaplm olur. kincisinde bir bool dizisinden yeni bir BitArray nesnesi oluturulur.

ncsnde bir byte dizisinden yeni bir BitArray nesnesi oluturulur. Bir bayt 8 bittir. Yani bir baytn iinde 8 tane 1 veya 0 vardr. te bu 1 veya 0'lar BitArray koleksiyonuna true ve false olarak geirilir. Yani son tahlilde BitArray dizisindeki eleman says 8*by.length olur. Drdncsnde bir int dizisinden yeni bir BitArray nesnesi oluturulur. Bir int nesnesinin iinde 32 tane 1 veya 0 vardr. nk int 32 bitlik bir veri tipidir. Bu 1 veya 0'lar BitArray koleksiyonuna true veya false olarak geirilir. Yani son tahlilde BitArray dizisindeki eleman says 32*i.Length olur. Beincisinde boyut tane false eleman ieren bir BitArray nesnesi oluturulur. Altncsnda boyut tane degerden oluan bir BitArray nesnesi oluturulur. BitArray snf ICollection ve IEnumerable arayzlerini uygulamtr. rnek bir program:

using System; using System.Collections; class bitarray { static void Main() { int[] i={1}; BitArray ba=new BitArray(i); EkranaYaz(ba); } static void EkranaYaz(BitArray ba) { IEnumerator ie=ba.GetEnumerator(); int i=0; while(ie.MoveNext()) { i++; Console.Write("{0,-6}",ie.Current); if(i%8==0) Console.WriteLine(); } Console.WriteLine(); } }
Bu programn ekran kts yle olmaldr:

True False False False

False False False False

False False False False

False False False False

False False False False

False False False False

False False False False

False False False False

Bu programda ba'y ekrana klasik foreach ile de yazdrabilirdik. Ancak byle bir yntemin de olduunu bilmenizde fayda var.

BitArray snfnn Count ve Length adl iki zellii vardr. kisi de ilgili BitArray nesnesinin eleman saysn verir. Ancak Count salt-okunur olmasna ramen Length deildir. Yani Length zellii ile ilgili BitArray nesnesinin eleman saysn deitirebiliriz. Eer var olan eleman saysn azaltrsak sonundan ger ekli sayda eleman silinecektir. Eer eleman saysn artrsak sona gerekli sayda false eleman eklenir. BitArray snfnn nemli metotlar: bool Get(int indeks) lgili BitArray nesnesindeki parametre ile verilen indeksteki eleman geri dndrlr. void Set(int indeks,bool deger) lgili BitArray nesnesindeki parametre ile verilen indeksteki eleman deger olarak deitirilir. void SetAll(bool deger) lgili BitArray nesnesindeki tm elemanlar deger olarak deitirilir. BitArray And(BitArray ba) lgili BitArray nesnesindeki elemanlarla parametredeki BitArray nesnesindeki elemanlar karlkl olarak VE ilemine sokar. Sonucu yine bir BitArray nesnesi olarak tutar. Eer iki nesnenin eleman saylar eit deilse istisnai durum oluur. BitArray Or(BitArray ba) And() metoduyla ayn mantkta alr. Tek deien elemanlarn VE deil de VEYA ilemine sokulmasdr. BitArray Xor(BitArray ba) And() ve Or() metotlaryla ayn mantkta alr. Tek deien elemanlarn ZEL VEYA ilemine sokulmasdr. BitArray Not() lgili BitArray nesnesindeki elemanlarn deilini alr ve yeni bir BitArray nesnesi olarak dndrr.

[dzenle]Stack

snf

System.Collections isim alanndaki Stack snf bilgisayar bilimlerinde oka karmza kabilecek ynlarla almamz salar. Ynlar st ste koyulmu kitaplar gibi dnebiliriz. En stteki kitab rahatlkla alp okuyabiliriz. Ancak okuyacamz kitap ortalarda veya altlarda ise nce okuyacamz kitabn stndeki kitaplar teker teker yndan karp sonra okuyacamz kitab almalyz. br trl kitap destesi devrilebilir. te ynlarda da ayn mantk sz konusudur. Ynlara koleksiyonlara bu mantn eklenmi hlidir diyebiliriz. Normal koleksiyonlarda istediimiz her an koleksiyonun istediimiz elemanna eriebiliyorduk. Ancak ynlarda bir anda ynn yalnzca bir elemanna eriebiliriz. Daha alttaki ele manlara eriebilmek iin stteki elemanlarn teker teker yndan karlmas gerekir. Ynlarn mantn u cmleyle zetleyebiliriz: "En nce giren en son kar, en son giren en nce kar." Yani yna eklenen her bir elemann birbirinin stne geldiini syleyebiliriz. Stack snfnda tpk dier koleksiyonlardaki gibi eleman eklendike otomatik olarak kapasite artar. Bir Stack nesnesi u yollardan biriyle olturulabilir.

Stack s1=new Stack(); Stack s2=new Stack(int kapasite); Stack s3=new Stack(ICollection ic);
Birincisinde klasik bir Stack nesnesi oluturulur. kincisinde kapasitesi kapasite olan bir Stack nesnesi oluturulur. Tabii ki kapasite alrsa otomatik olarak kapasite artrlr. ncsnde ICollection arayzn kullanan baka bir koleksiyon nesnesinden yeni bir Stack nesnesi oluturulur. Stack snfnn nemli ye elemanlar:

object Pop() lgili yndaki en stteki eleman dndrr ve yndan karr. object Peek() lgili yndaki en stteki eleman dndrr ama yndan karmaz. void Push(object o) lgili ynn en stne o elemann ekler. void Clear() lgili yndaki btn elemanlar siler. object[] ToArray() lgili yndaki elemanlar object dizisi olarak dndrlr. bool Contains(object o) Eer o nesnesi ilgili ynda varsa true, yoksa false dndrlr. int Count Bu zellik ilgili yndaki eleman saysn verir. Peek() ve Pop() metotlar ilgili yn boken kullanlrsa istisnai durum oluur. Bir yndaki elemanlarn tamamna bir koleksiyonmu gibi erimek iin Stack snfnn GetEnumerator() metodu kullanlr. Bu metot bir IEnumerator nesnesi dndrr. IEnumerator arayznn MoveNext() metoduyla bir while dngs kurarsak ilgili yndaki tm elemanlara eriebiliriz. rnek:

using System; using System.Collections; class stack { static void Main() { Stack s=new Stack(); s.Push(5); s.Push(10); EkranaYaz(s); } static void EkranaYaz(Stack s) { IEnumerator ie=s.GetEnumerator(); while(ie.MoveNext()) Console.WriteLine(ie.Current); } }
Bu programdaki EkranaYaz() metodunu yle de yazabilirdik:

static void EkranaYaz(Stack s) { Stack yeniyigin=(Stack)s.Clone(); while(yeniyigin.Count>0) Console.WriteLine(yeniyigin.Pop().ToString()); }


Buradaki Clone() metodu bir ynn kopyasn object olarak alr. Dolaysyla bu yeni yn bir Stack nesnesine atamak iin tekrar Stack trne dnm yapmak gerekir. Yine EkranaYaz() metodunu klasik foreach dngsyle de yazabilirdik:

static void EkranaYaz(Stack s) { foreach(object o in s)

Console.WriteLine(o); }
[dzenle]Queue

snf

Queue snf Stack snfna olduka benzer. Ancak Stack snfnn tam tersi bir manta sahiptir. Queue snfnda "En nce giren en erken kar, en son giren en ge kar." mant geerlidir. Bunu yle kavrayabiliriz: Kendimizi bankada bir veznedar olarak dnelim. Kuyrukta bekleyen birok kii var. Tabii ki kuyruktaki en ndeki kiinin ii en erken bitecek ve kuyruktan en nce o ayrlacaktr. Kuyruun en arkasndaki kiinin ii ise en ge bitecektir. Bizim veznedar olarak en arkadaki kiinin iini halledebilmemiz iin o kiinin nndeki kiilerin de ilerini bitirmemiz gerekir. Queue snfnn nemli ye elemanlar: object Dequeue() lgili kuyruun en bandaki eleman dndrr ve kuyruktan karr. void Enqueue(object o) o nesnesi ilgili kuyruun en sonuna eklenir. object Peek() lgili kuyruun en bandaki eleman dndrr ama kuyruktan karmaz. int Count lgili kuyruktaki eleman saysn verir. object[] ToArray() lgili kuyruk bir object dizisi olarak tutulur. void TrimToSize() lgili kuyruun kapasitesiyle eleman says eitlenir. Yeni bir Queue nesnesi yle oluturulabilir.

Queue q1=new Queue(); Queue q2=new Queue(int kapasite); Queue q3=new Queue(ICollection ic);
Bir Queue nesnesinin iinde Stack nesnelerinin iinde dolatmz gibi dolaabiliriz. Buna rnek verilmeyecektir.

[dzenle]ablon

tipli koleksiyonlar

imdiye kadar BitArray hari btn koleksiyon snflarnda koleksiyona eklenen nesne objecte dntrlp saklanr. Sonra bu nesneyi elde etmek istediimizde ise tekrar orijinal tre dnm yapmak gerekir. Bunun sonucunda hem performans kayb (tr dnmlerinden dolay) hem de tr emniyetsizlii olumaktadr. Tr emniyetsizliinin nedeni ise ilgili koleksiyonda her trden veri saklayabilmemizdir. Szlk iin kullanacamz bir koleksiyonun yalnzca string nesneleri kabul etmesi gerekir. Ancak klasik koleksiyonlarda her trden nesne atayabilmemiz bu kontrol imkansz klmaktadr. ablon tipli koleksiyon snflar System.Collections.Generic isim alanndadr. imdiye kadar grdmz btn koleksiyonlarn ablon tipli versiyonlar bu isim alannda bulunmaktadr. ablon tipli koleksiyon snflarnn karl olduklar normal koleksiyon snflarndan ablon tipli olmalar dnda fazla fark yoktur. Burada bu ablon tipli koleksiyon snflar ksaca tantlacaktr.

[dzenle]List<T>

snf

ArrayList snfnn ablon tipli versiyonudur. rnek bir List<T> nesnesi yaratm:

List<int> l=new List<int>();

[dzenle]Dictionary<T,V>

snf

Hashtable snfnn ablon tipli versiyonudur. rnek bir Dictionary<T,V> nesnesi yaratm:

Dictionary<int,string> d=new Dictionary<int,string>();


[dzenle]SortedDictionary<K,V>

snf

SortedList snfnn ablon tipli versiyonudur. rnek bir SortedDictionary<K,V> nesnesi yaratm:

SortedDictionary<int,string> sd=new SortedDictionary<int,string>();


[dzenle]IEnumerable<T>

ve IEnumerator<T> arayzleri

Klasik versiyonlarndan tretilen bu arayzler ablon tipli koleksiyon snflarna arayzlk yapmaktadr. Kendimiz de ablon tipli koleksiyon snflar yazmak istiyorsak bu arayzleri kullanmalyz.

[dzenle]Queue<T>

ve Stack<T> snflar

Queue ve Stack snflarn ablon tipli versiyonlardr.

[dzenle]Koleksiyonlara

kendi nesnelerimizi yerletirmek

imdiye kadar koleksiyonlara string, int gibi .Net Framework ktphanesindeki hazr snflarn nesnelerini koyduk. Halbuki kendi oluturduumuz snflarn nesnelerini de koleksiyonlara koyabiliriz. Ancak bu durumda bir sorun ortaya kar. Derleyici koleksiyonu sralarken nasl sralayacak? Bu sorunu zmek iin snfmza IComparable arayzn uygulattrrz. Bu arayz nceden de bildiiniz gibi CompareTo() metodunu iermektedir. imdi programmz yazmaya balayalm:

using System; using System.Collections; class Sayi:IComparable { public int sayi; public Sayi(int sayi) { this.sayi=sayi; } public int CompareTo(object o) { Sayi s=(Sayi)o; return sayi.CompareTo(s.sayi); } } class AnaProgram { static void Main() { ArrayList al=new ArrayList(); Sayi s1=new Sayi(10); Sayi s2=new Sayi(20);

Sayi s3=new Sayi(-23); al.Add(s1); al.Add(s2); al.Add(s3); al.Sort(); foreach(Sayi s in al) Console.WriteLine(s.sayi); } }

C Sharp Programlama Dili/Veri taban ilemleri


Vikikitap, zgr ktphane
< C Sharp Programlama Dili

C#'ta veri taban ilemleri System.Data isim alanndaki ve bu isim alannn altndaki alt isim alanlarndaki trlerle yaplr. System.Data isim alanna programclar ADO.NET ismini vermilerdir. Yani bir yerde ADO.NET duyarsanz aslnda System.Data isim alanndan bahsetmektedir. System.Data isim alanyla veri tabanlarna iki ekilde eriilebilir. 1. MSSQL veri tabanlarna direkt eriim. 2. OLEDB protokoln destekleyen veri tabanlarna OLEDB protokol ile eriim. Tabii ki balanacanz veri taban MSSQL ise daha hzl olmas asndan birinci yntemi semeniz tavsiye edilir. Ancak daha genel bir yol olduundan bu blmde ikinci yntem zerinde daha ok duracaz. Popler tm veri tabanlar OLEDB protokoln desteklemektedir. OLEDB protokolyle MSSQL veri tabanlarna da eriebilirsiniz. Ayrca OLEDB protokolyle Access dosyalarna da bir veri tabanym gibi balanabilirsiniz. imdi isterseniz System.Data isim alan ve bu isim alanndaki alt isim alanlar hakknda ksa bilgiler verelim: System.Data Veri tabanlarndaki verilerle almak iin gerekli temel trler bu isim alanndadr. Veri tabanlarna balanmak iin gerekli trler bu isim alannda deildir. System.Data.Common leride greceiz. System.Data.OleDb OLEDB protokoln destekleyen veri tabanlarna balanmak iin gerekli trler barndrr. System.Data.SqlClient OLEDB kullanmadan direkt MSSQL veri tabanlarna balanmak iin gerekli trler barndrr. System.Data.SqlTypes MSSQL veri tabanlarndaki veri trlerini ierir. Tabii ki veri tabanndan veri ekerken veya veri tabanna veri kaydederken C#'a zg veri trlerini (s tring, int, ...) kullanabiliriz. Ancak MSSQL'e zg veri trlerini kullanmamz bize art performans salar.

Konu balklar
[gizle]

1 Veri tabanna balanma 2 OleDbCommand snf 3 OleDbDataReader snf 4 OleDbDataAdapter, DataSet, DataTable, DataRow ve DataColumn snflar

o o o

4.1 Veri tabanndan veri ekmek 4.2 Bir stunun zelliklerini deitirmek ve edinmek 4.3 Veri tabann gncellemek

5 Veri salayc bamsz eriim

[dzenle]Veri tabanna balanma


Burada eitli veri tabanlarna balanma hakknda rnek verilecektir:

//veri kaynana erimek iin eitli bilgiler hazrlanr. string kaynak="Provider=SqlOleDb;server=SunucuAd;uid=KullancAd;pwd=ifre;d atabase=VeriTabanAd"; //kaynak stringi kullanlarak balant nesnesi oluturulur. OleDbConnection baglanti=new OleDbConnection(kaynak); //OleDbConnection snfnn static olmayan Open() metoduyla balant aktif hle getirilir. baglanti.Open();
Bu rneimizde OLEDB protokoln destekleyen bir veri tabanna balandk. OleDbConnection snf System.Data.OleDb isim alanndadr.

string kaynak="Provider=Microsoft.Jet.OLEDB.4.0;Data Source=dosya.mdb"; OleDbConnection baglanti=new OleDbConnection(kaynak); baglanti.Open();


Burada ise OLEDB protokoln kullanarak bir Access dosyasna bir veri tabanym gibi balandk. Grdnz gibi ncekinden tek fark kaynak stringi.

string kaynak="server=SunucuAd;uid=KullancAd;pwd=ifre;database=VeriTaban Ad"; SqlConnection baglanti=new SqlConnection(kaynak); baglanti.Open();


Burada ise OLEDB protokoln kullanmadan direkt olarak bir MSSQL veri tabanna balandk. SqlConnection snf System.Data.SqlClient isim alanndadr. Biz ders boyunca ikinci yntemi kullanacaz. Yani Access dosyalarna erieceiz. OLEDB protokoln kullanarak normal bir veri tabanna balanp ilem yapma ile ayn eyi Access dosyalarna yapma arasndaki tek fark balanma eklidir. Yani veri tabanna

veya Access dosyasna OLEDB protokol ile bir kere balandktan sonra veri tabanndan veri ekme/veri tabanna veri kaydetme vb. ilemler tamamen ayndr. OLEDB protokoln kullanmadan balanlan MSSQL veri tabanlaryla ilemler yapmak ksmen farkl olsa da ilemler byk lde ayn mantkla yaplr. imdi isterseniz bir veri tabanna balanma rnei yapalm:

using System; using System.Data.OleDb; class vt { static void Main() { string kaynak="Provider=Microsoft.Jet.OLEDB.4.0;Data Source=dosya.mdb"; OleDbConnection baglanti=new OleDbConnection(kaynak); baglanti.Open(); Console.WriteLine("Balant saland..."); baglanti.Close(); } }
Bu rnein hata vermeden alabilmesi iin programmzla ayn klasrde dosya.mdb dosyasnn olmas gerekir. Access'te bu dosyay oluturun. Dosyamz eitli alanlar olan bir tablo iersin, bu alanlara da veri trleriyle uyumlu olmak artyla istediiniz verileri koyun. OleDbConnection snfnn static olmayan Close() metodu ilgili balanty kesip balantnn kulland sistem kaynaklarnn serbest braklmasn salar. Eer balant salanmsa programn ekrana Balant

saland... ktsn vermesi gerekir. Eer

balant salanamamsa istisnai durum olumas gerekir. NEML NOT: Bu ders boyunca sizin SQL dilini ve Access programn balang seviyesinde bildiiniz varsaylmtr. rneklerde olabildiince basit SQL cmleleri kullanlmtr. NOT: System.Data isim alan imdiye kadar grdmz isim alanlarnn aksine mscorlib.dll assemblysinde deil, System.Data.dll assemblysindedir. Baz .Net Framework srmlerinde derleyici bu dosyay otomatik olarak her dosyaya refere etmesine ramen baz .Net Framework srmlerinde refere etmemektedir. Eer program derleme hatas verirse bir de bu dosyay refere etmeyi deneyin.

[dzenle]OleDbCommand snf
OleDbCommand snf bir veri tabanna komut gndermek iin kullanlr. OleDbCommand snf System.Data isim alanndadr. Bir veri tabanna gnderilmesi iin ekilde komut oluturabiliriz.

string kaynak="Provider=Microsoft.Jet.OLEDB.4.0;Data Source=dosya.mdb"; OleDbConnection baglanti=new OleDbConnection(kaynak); baglanti.Open(); string sorgu="select * from tablo"; OleDbCommand komut=new OleDbCommand(sorgu,baglanti);

Bu rneimizde OleDbCommand snfnn yapc metodu bir OleDbConnection ve bir de string nesnesi ald. String nesnesi SQL cmlesini ieriyor. imdi ikinci ynteme geelim.

string kaynak="Provider=Microsoft.Jet.OLEDB.4.0;Data Source=dosya.mdb"; OleDbConnection baglanti=new OleDbConnection(kaynak); baglanti.Open(); OleDbCommand komut=new OleDbCommand("Tablo",baglanti); komut.CommandType=CommandType.TableDirect;
CommandType System.Data isim alannda bulunan bir enumdur. OleDbCommand snfnn static olmayan CommandType zelliinin tipi CommandType enumudur. Bu rneimizde veri tabanna bir SQL cmlesi gndermektense bir tabloyu tamamen programa ekmek istedik.

string kaynak="Provider=Microsoft.Jet.OLEDB.4.0;Data Source=dosya.mdb"; OleDbConnection baglanti=new OleDbConnection(kaynak); baglanti.Open(); OleDbCommand komut=new OleDbCommand("StorProsedur",baglanti); komut.CommandType=CommandType.StoredProcedure; komut.Parameters.Add("@Yas","30");
Bu rnekte ise bir stor prosedr altrdk. Parametreyi de Parameters alt snfndaki Add() metoduyla verdik. NOT: Bu rneimizde OleDbConnection nesnesini ve komutu yapc metotta verdik. stersek yle de verebilirdik:

string kaynak="Provider=Microsoft.Jet.OLEDB.4.0;Data Source=dosya.mdb"; OleDbConnection baglanti=new OleDbConnection(kaynak); baglanti.Open(); string sorgu="select * from tablo"; OleDbCommand komut=new OleDbCommand(); komut.Connection=baglanti; komut.CommandText=sorgu;
NOT: OleDbCommand snfnn CommandType zelliine CommandType.Text ilk deeri verilmitir. Bu da komutun bir SQL cmlesi olduunu belirtir. imdiye kadar gzel. Ancak halen baz eyler eksik. Artk komut elimizde var. Ancak halen komutu altrmadk. Belli bir komutu (OleDbCommand nesnesini) altrmak iin OleDbCommand snfnn 4 farkl static olmayan metodu vardr. int ExecuteNonQuery() Bu metot veri tabanndaki kaytlarda deiiklik (ekleme-silme-deitirme) yapan komutlar altrmak iin kullanlr. Metot tabloda etkilenen (silinen -eklenen-deitirilen) kayt saysn dndrr. rnek:

string kaynak="Provider=Microsoft.Jet.OLEDB.4.0;Data Source=dosya.mdb"; OleDbConnection baglanti=new OleDbConnection(kaynak);

baglanti.Open(); string sorgu="INSERT INTO Tablo (Ad,Soyad) VALUES ('Mehmet','Kaplan')"; OleDbCommand komut=new OleDbCommand(sorgu,baglanti); Console.WriteLine(komut.ExecuteNonQuery()+" tane ekleme yapld."); baglanti.Close();
object ExecuteScalar() Bu metot veri tabanndan tek bir veri elde eden komutlar altrmak iin kullanlr. rnein SQL dilinin COUNT deyimi tablodaki kayt saysn verir. rneinSELECT

COUNT(*) FROM

Tablo SQL cmlesini altrmak iin bu metot kullanlabilir. rnek:


string kaynak="Provider=Microsoft.Jet.OLEDB.4.0;Data Source=dosya.mdb"; OleDbConnection baglanti=new OleDbConnection(kaynak); baglanti.Open(); string sorgu="SELECT COUNT(*) FROM Tablo"; OleDbCommand komut=new OleDbCommand(sorgu,baglanti); Console.WriteLine((int)komut.ExecuteScalar()+" tane kayt var."); baglanti.Close();
OleDbDataReader ExecuteReader() Bu metot veri tabanndan bir tablo eken komutlar altrmak iin kullanlr. Genellikle SELECT deyimleri bu metotla altrlr. Bir OleDbDataReader nesnesi dndrr.

[dzenle]OleDbDataReader snf
OleDbCommand snfnn static olmayan ExecuteReader() metodu ile oluan tablolar tutmaya yarayan bir snftr. OleDbDataReader nesneleri new operatryle oluturulamaz. OleDbDataReader nesneleri oluturmak iin OleDbCommand snfnn static olmayan ExecuteReader() metodunu kullanabiliriz. OleDbDataReader snf System.Data.OleDb isim alanndadr. imdi isterseniz Access'te yle bir tablo oluturalm:

id 1 ali

ad

soyad ylmaz

not 70 90 100 45 34

2 mehmet szen 3 zafer kaplan

4 mehmet oflaz 5 aye 6 hatice 7 emine ylmaz

zdoan 100 anl 20

Bu tabloya ogrenci ismini verelim. Dosyay kaynak kodumuzla ayn klasrde oluturup adn dosya.mdb koyalm. imdi aadaki program yazalm.

using System; using System.Data; using System.Data.OleDb; class vt { static void Main() { string kaynak="Provider=Microsoft.Jet.OLEDB.4.0;Data Source=dosya.mdb"; OleDbConnection baglanti=new OleDbConnection(kaynak); baglanti.Open(); string sorgu="SELECT * FROM ogrenci"; OleDbCommand komut=new OleDbCommand(sorgu,baglanti); OleDbDataReader cikti=komut.ExecuteReader(); string format="{0,-10}{1,-10}{2,-10}"; Console.WriteLine(format,"Ad","Soyad","Notu"); Console.WriteLine("".PadRight(30,'-')); while(cikti.Read()) { Console.WriteLine(format,cikti[1],cikti[2],cikti[3]); } cikti.Close(); baglanti.Close(); } }
Bu program ogrenci tablosundaki id hari tm verileri bir tablo eklinde konsol ekranna yazar. Bu programda Temel string ilemleri konusunda grdmz yaz formatlamay kullandk. Ayn konuda grdmz String snfna ait PadRight() metodunu ise ekrana bir karakteri belirli sayda yazdrmak amacyla kullandk. Asl konumuza dnecek olursak OleDbDataReader snfnn static olmayan Read() metodu ilgili tablodaki aktif kayt bir birim teler ve true dndrr. Eer aktif kayt telenemiyorsa false dndrr. OleDbDataReader snfnda tanml indeksleyici sayesinde aktif kayttaki farkl alanlar tutulabilir. Bu indesleyici object trnde nesneler dndrr. Son olarak OleDbConnection ve OleDbDataReader nesneleriyle iimiz bittiinde ilgili nesnenin Close() metoduyla sistemin ilgili tablo/balant iin ayrd sistem kaynaklarn ilemciye iade etmemiz gerekiyor. stersek OleDbDataReader snfna ait indeksleyiciyi yle de kullanabilirdik:

Console.WriteLine(format,cikti["ad"],cikti["soyad"],cikti["not"]);
Grdnz gibi indeksleyiciye bir indeks numaras vermektense direkt olarak stunun adn da verebiliyoruz. Ayn programdaki while dngsn yle de kurabilirdik.

while(cikti.Read()) {

Console.WriteLine(format,cikti.GetString(1),cikti.GetString(2),cikti.Ge tInt32(3)); }
Burada klasik indeksleme ynteminin aksine trler belirtilmitir. ndeksleyici geriye object nesnesi dndryordu. Eer veri tabanndaki stunlarn tipini biliyorsak bu ekilde bir kullanm tr dnm olmadndan dolay ilemler daha hzl gerekleecei iin tavsiye edilir. Microsoft Office Access 2003 srmndeki veri tipleri, C# karlklar ve bunlar programa geirmek iin gerekli OleDbDataRead er metotlar yledir:

Access Tamsay

C# short

lgili metot GetInt16() GetInt32() GetByte() GetDouble() GetFloat() GetDecimal() GetString() GetBoolean()

Uzun Tamsay int Bayt ift Tek Ondalk Metin Evet/Hayr Tarih/Saat byte double float decimal string bool

DateTime GetDateTime()

[dzenle]OleDbDataAdapter, DataSet, DataTable, DataRow ve


DataColumn snflar
Artk imdiye kadar rendiimiz snflarla bir veri tabanndan veri ekip veri tabanna veri kaydedebiliyoruz. Zaten bir veri tabanyla yapabileceimiz ilemler bu kadar. Ancak birazdan greceimiz OleDb DataAdapter, DataSet, DataTable, DataRow ve DataColumn snflar bu ilemleri yaparken bize daha fazla seenek sunuyor. Ayrca bu snflar bize offline almann kaplarn ayor. Yani ncelikle veri tabanndan bir veri ekiyoruz, bu veriyi kendi makinamza aktaryoruz, bu ilemden sonra veri tabanyla balantmzn kesilmesi programmzn ileyiine engel deil. Sonra ektiimiz veri zerinde istediimiz oynamalar yapyoruz. Sonra deitirilmi verileri tekrar veri tabanna yazyoruz. Bu ekilde veri tabanyla ilemlerimiz, veri tabannn bulunduu bilgisayarla programn bulunduu bilgisayar arasnda fazla git-gel olmad iin daha hzl gerekleiyor. imdi offline almayla ilgili snflar nce ksaca inceleyelim: OleDbDataAdapter OLEDB protokoln destekleyen veri tabanlarndan veri ekmek ve deitirilmi verileri ayn veri tabanna tekrar yazmak iin kullanlr. Offline almayla ilgili snflar iinde veri tabanyla fiziksel olarak iletiimde olan tek snftr. OleDbDataAdapter snfnn ektii veri tek bir veri olabilecei gibi bir ya da

daha fazla tablo da olabilir. Hatta istersek OleDbDataAdapter snfyla bir veri tabannn tamamn da programmza aktarabiliriz. OleDbDataAdapter snf System.Data.OleDb isim alanndadr. System.Data.SqlClient isim alanndaki SqlDataAdapter snf ise OLEDB'siz balanlan MSSQL veri tabanlar iin ayn eyi yapar. OleDbDataAdapter ile SqlDataAdapter snflarnn arayzleri ayndr. Dolaysyla birazdan OleDbDataAdapter snfn incelerken ayn zamanda SqlDataAdapter snfn da incelemi olacaz. DataSet OleDbDataAdapter snfnn veri tabanndan ektii verileri programda offline olarak tutmaya yarar. System.Data isim alanndadr. DataTable Bir DataSet'teki bir tabloyu temsil eder. System.Data isim alanndadr. DataRow Bir tablodaki tek bir satr (kayd) temsil eder. System.Data isim alanndadr. DataColumn Bir tablodaki tek bir stunu temsil eder. System.Data isim alanndadr.

[dzenle]Veri tabanndan veri ekmek


ncelikle bir OleDbDataAdapter nesnesi oluturmalyz:

string kaynak="Provider=Microsoft.Jet.OLEDB.4.0;Data Source=dosya.mdb"; OleDbConnection baglanti=new OleDbConnection(kaynak); baglanti.Open(); string sorgu="SELECT * FROM TabloAd"; OleDbDataAdapter odda=new OleDbDataAdapter(sorgu,baglanti);
Sonra OleDbDataAdapter snfnn Fill() metoduyla ilgili OleDbDataAdapter nesnesinin tuttuu verileri bir DataSet nesnesine aktarmalyz.

DataSet ds=new DataSet(); odda.Fill(ds); //Bu satrla odda nesnesindeki veriler ds nesnesine atand.
stersek OleDbDataAdapter nesnesinden DataSet nesnesine bir tablo aktarrken tablonun adn belirleyebiliriz.

DataSet ds=new DataSet(); odda.Fill(ds,"TabloAd");


DataSet snfnn Tables zellii ilgili DataSet nesnesindeki tablolar bir DataTable koleksiyonu olarak dndrr.

DataSet ds=new DataSet(); odda.Fill(ds,"TabloAd"); DataTable dt=ds.Tables["TabloAd"]; //veya DataTable dt2=ds.Tables[0]; //veya DataTableCollection dtc=ds.Tables; //DataTableCollection bir koleksiyon snfdr ve System.Data isim alanndadr.

DataTable snfnn Columns zellii ilgili DataTable nesnesindeki stunlar bir DataColumn koleksiyonu olarak dndrr.

DataTable dt=ds.Tables["TabloAd"]; DataColumn dc=dt.Columns["StunAd"]; //veya DataColumn dc2=dt.Columns[2]; //veya DataColumnCollection dcc=dt.Columns; //DataColumnCollection koleksiyon snf System.Data isim alanndadr.
DataTable snfnn Rows zellii ilgili DataTable nesnesindeki satrlar bir DataRow koleksiyonu olarak dndrr.

DataTable dt=ds.Tables["TabloAd"]; DataRow dr=dt.Rows[1]; //veya DataRowCollection drc=dt.Rows; //DataRowCollection koleksiyon snf System.Data isim alanndadr.
DataRow snfnn ItemArray zellii ilgili satrdaki verileri bir object dizisi olarak tutar. Yani

object[] o=dr.ItemArray;
Ayrca bir DataRow nesnesindeki farkl stunlara indeksleyici ile de eriilebilir. rnek

object o1=dr[0]; //veya object o2=dr["StunAd"];


Yine bu indeksleyiciler de object nesneleri dndrr. NOT: DataTableCollection, DataRowCollection ve DataColumnCollection snflarnn Count zellikleri bir datasetteki tablo saysnn ve bir tablodaki satr ve stun saysnn bulunmas amacyla kullanlabilir.

[dzenle]Bir stunun zelliklerini deitirmek ve edinmek


DataColumn snfnn eitli static olmayan zellikleri vardr: bool AllowDBNull Stunun bo deer kabul edip etmeyecei belirtilir. bool AutoIncrement Eklenen yeni kaytlarda ilgili stundaki verinin otomatik artp artmayaca belirtilir. long AutoIncrementSeed Otomatik artacak deerin balang deeri long AutoIncrementStep Otomatik artmn kaar kaar olaca belirtilir. string Caption Stunun ismi. Type DataType Stunun veri tipi. object DefaultValue Stundaki her hcrenin varsaylan deeri. (bo brakldnda) int MaxLength Stundaki her hcredeki verinin maksimum karakter says. int Ordinal Stunun tabloda kanc srada olduunu verir. (salt okunur) bool Unique Stunda bir verinin tekrarlanp tekrarlanamayaca. Tekrarlanabiliyorsa false, tekrarlanamyorsa true. DataTable Table Stunun hangi tabloya ait olduu (salt okunur)

[dzenle]Veri tabann gncellemek


Bunu bir rnek zerinde anlatmay uygun buluyorum. ncelikle kaynak kodumuzla ayn klasrde dosya.mdb isimli bir Access dosyas oluturun. Bu dosyada tablo isimli bir tablo oluturun. Tablo yle olsun:

id

ad

soyad oflaz

1 bekir

2 mehmet kaplan

id alan Say (Uzun Tamsay) dier alanlar ise Metin tipinde olsun. Tabloda birincil anahtar olmasn. imdi programmz yazmaya balayabiliriz.

using System.Data.OleDb; using System.Data; class vt { static void Main() { string kaynak="Provider=Microsoft.Jet.OLEDB.4.0;Data Source=dosya.mdb"; OleDbConnection baglanti=new OleDbConnection(kaynak); string sorgu="SELECT * FROM tablo"; OleDbDataAdapter odda=new OleDbDataAdapter(sorgu,baglanti); DataSet ds=new DataSet(); odda.Fill(ds,"tablo"); DataRow r=ds.Tables["tablo"].NewRow(); r["id"]=21; r["ad"]="hatice"; r["soyad"]="zdoan"; odda.InsertCommand=new OleDbCommand("INSERT INTO tablo (id,ad,soyad) values (?,?,?)",baglanti); odda.UpdateCommand=new OleDbCommand("UPDATE tablo SET id=?, ad=?, soyad=? WHERE id=?",baglanti); odda.DeleteCommand=new OleDbCommand("DELETE FROM tablo WHERE id=?",baglanti); odda.InsertCommand.Parameters.Add("@id",OleDbType.Integer,2,"id"); odda.InsertCommand.Parameters.Add("@ad",OleDbType.VarChar,10,"ad"); odda.InsertCommand.Parameters.Add("@soyad",OleDbType.VarChar,10,"soyad" ); odda.UpdateCommand.Parameters.Add("@id",OleDbType.Integer,2,"id");

odda.UpdateCommand.Parameters.Add("@ad",OleDbType.VarChar,10,"ad"); odda.UpdateCommand.Parameters.Add("@soyad",OleDbType.VarChar,10,"soyad" ); odda.UpdateCommand.Parameters.Add("@oldid",OleDbType.Integer,2,"id").So urceVersion=DataRowVersion.Original; odda.DeleteCommand.Parameters.Add("@id",OleDbType.Integer,2,"id").Sourc eVersion=DataRowVersion.Original; ds.Tables["tablo"].Rows.Add(r); ds.Tables["tablo"].Rows[0]["id"]=98; ds.Tables["tablo"].Rows[1].Delete(); odda.Update(ds,"tablo"); } }
Bu program veri tabannda ekleme, deitirme ve silme yapt. Access dosyasndaki tablomuzun yeni hlinin yle olmas gerekiyor:

id

ad

soyad

98 bekir oflaz 21 hatice zdoan

Programdaki nemli satrlar teker teker inceleyecek olursak;

DataRow r=ds.Tables["Uyeler"].NewRow();
Burada ds DataSet nesnesindeki tablo tablosundaki dzene uygun bir DataRow nesnesi oluturduk.

odda.InsertCommand=new OleDbCommand("INSERT INTO tablo (id,ad,soyad) values (?,?,?)",baglanti); odda.UpdateCommand=new OleDbCommand("UPDATE tablo SET id=?, ad=?, soyad=? WHERE id=?",baglanti); odda.DeleteCommand=new OleDbCommand("DELETE FROM tablo WHERE id=?",baglanti);
Bu satrda ise OleDbDataAdapter snfnn ilk deer atanmam ve tipi OleDbCommand olan zelliine deer atadk. SQL cmlelerindeki ? iareti oraya bir parametre geleceini belirtiyor. Burada OleDbDataAdapter snfnn Update() metodu kullanldnda aslnda hangi komutlarn altrlacan belirledik. Bu satrlardan bazlarn yazmayabilirdik. Bu durumda yalnzca deer atanan zelliklerin komutlar alrd.

odda.InsertCommand.Parameters.Add("@id",OleDbType.Integer,2,"id"); odda.InsertCommand.Parameters.Add("@ad",OleDbType.VarChar,10,"ad");

odda.InsertCommand.Parameters.Add("@soyad",OleDbType.VarChar,10,"soyad" ); odda.UpdateCommand.Parameters.Add("@id",OleDbType.Integer,2,"id"); odda.UpdateCommand.Parameters.Add("@ad",OleDbType.VarChar,10,"ad"); odda.UpdateCommand.Parameters.Add("@soyad",OleDbType.VarChar,10,"soyad" ); odda.UpdateCommand.Parameters.Add("@oldid",OleDbType.Integer,2,"id").So urceVersion=DataRowVersion.Original; odda.DeleteCommand.Parameters.Add("@id",OleDbType.Integer,2,"id").Sourc eVersion=DataRowVersion.Original;


Burada ? iaretleri yerine ne geleceini belirledik. Bunlarn eklenme sras nemlidir. lk ? yerine ilk eklenen gelir. Veri tiplerini System.Data.OleDb isim alanndaki OleDbType enumuyla belirledik. DataRowVersion enumu ise System.Data isim alanndadr.

ds.Tables["tablo"].Rows.Add(r); ds.Tables["tablo"].Rows[0]["id"]=98; ds.Tables["tablo"].Rows[1].Delete();


Bu satrda ise srasyla nceki oluturduumuz r satrn ds datasetindeki tablo tablosuna ekledik. Sonra 0. kaydn id stunundaki deeri 98 yaptk. Sonra 1. kayd sildik.

odda.Update(ds,"tablo");
Son olarak yaptmz offline deiikliklerin veri tabannda da yaplmasn saladk. Offline almada balantnn Open() ve Close() metotlaryla alp kapanmasna gerek yoktur.

[dzenle]Veri salayc bamsz eriim


Veri tabanlarna eriim veri salayclarla olur. rnein OLEDB bir veri salaycdr. OLEDB ile hemen hemen btn veri tabanlarna balanabiliriz. Ancak MSSQL Server veya Oracle Server'n kendine has veri salayclar da vardr. Bunlar veri tabanna gre optimize edildii iin veri tabanna eriimde ciddi bir hz kazanc salarlar. .Net Framework ktphanesinde OLEDB protokol iin snflar yer alma kla birlikte bu veri tabanlarna eriim iin zellemi snflar da mevcuttur. imdi karmza iki seenek kyor. Ya OLEDB ile hzdan dn verip veri taban bamsz eriim salayacaz ya da her veri taban iin zellemi snflar kullanacaz. Verilerimizin tutulduu veri taban deitiinde bizim de programmzn kaynak kodunu tekrar deitirip tekrar derleyip tekrar datmamz gerekecek. Peki hem hzdan dn vermeden hem de veri salayc bamsz eriim mmkn olabilir mi? Evet, mmkn olabilir. Bunu C# gelitiricileri fabrika snf modeliyle baarmlardr. .Net ktphanesindeki fabrika snflar hakknda bilgiyi aadaki program yazarak bulabilirsiniz:

using System; using System.Data; using System.Data.Common;

class c { static void Main() { DataTable saglayicilar=DbProviderFactories.GetFactoryClasses(); foreach(DataRow satir in saglayicilar.Rows) { for(int i=0;i<saglayicilar.Columns.Count-1;i++) Console.WriteLine(satir[i].ToString()); Console.WriteLine("".PadRight(15,'-')); } } }
DbProviderFactories snf System.Data.Common isim alanndadr. DbProviderFactories snfnn static GetFactoryClasses() metodu, iinde .Net Framework ktphanesindeki fabrika snflar hakknda bilgi olan bir tablo dndrr. Tablodaki her satr farkl bir fabrika snf iindir. Tablodaki her stun ise ilgili fabrika snf hakknda farkl kategorideki bilgiler iindir. Tablodaki son stun bizim iin biraz fazla karmak bilgiler ierdii iin bu stunu ekrana yazma gereksinimi grmedim. Bu programn bendeki kts yle oldu:

Odbc Data Provider .Net Framework Data Provider System.Data.Odbc --------------OleDb Data Provider .Net Framework Data Provider System.Data.OleDb --------------OracleClient Data Provider .Net Framework Data Provider System.Data.OracleClient --------------SqlClient Data Provider .Net Framework Data Provider System.Data.SqlClient ---------------

for Odbc

for OleDb

for Oracle

for SqlServer

Bu ekran sizde farkl olabilir. Herhangi bir fabrika nesnesi oluturmak iin:

DbProviderFactory fabrika=DbProviderFactories.GetFactory("System.Data.SqlClient");
Yani bir fabrika oluturmak iin az nceki tabloda karmza kan nc stundaki yazy kullanyoruz. DbProviderFactory snf System.Data.Common isim alanndadr. Konunun geri kalan ksmn bir rnek zerinde anlatmay uygun buluyorum:

using System.Data.Common;

using System; class Fabrikalar { static void Main() { DbProviderFactory fabrika=DbProviderFactories.GetFactory("System.Data.SqlClient"); DbConnection baglanti=fabrika.CreateConnection(); baglanti.ConnectionString="server=Sunucu;uid=Kullanici;pwd=sifre;databa se=VeriTabani"; baglanti.Open(); DbCommand komut=fabrika.CreateCommand(); komut.Connection=baglanti; komut.CommandText="SELECT * FROM TABLO"; DbDataReader okuyucu=komut.ExecuteReader(); while(okuyucu.Read()) Console.WriteLine(okuyucu[1].ToString()+" "+okuyucu[2].ToString()); } }
Buradaki DbConnection, DbCommand ve DbDataReader snflar yine System.Data.Common isim alanndadr. imdiye kadar grdmz veri tabanyla ilgili snflarn ounun System.Data.Common isim alannda eriim salayc bamsz versiyonlar vardr. Yine bu snflarn arayzleri ayndr. Burada yaptmz aslnda veri tabanna zg snflar kullanmak yerine hangi veri tabanna balanlacan bir stringle belirlemekti. Bylelikle ncelikle kodlarla veri tabanndan veri tabannn hangi veri taban olduu bilgisi alnr. Sonra GetFactory() metodunun parametresine uygun string alnr. te bu sayede de veri salaycdan bamsz ilemler yaplm olur. nk hangi veri tabanna balanlaca derleme zamannda deil, programn karlaa durumlara gre alma zamannda belirlenir.

C Sharp Programlama Dili/XML ilemleri


Vikikitap, zgr ktphane
< C Sharp Programlama Dili

imdi isterseniz konu anlatmna balamadan nce bu derste rnek olarak kullanacamz XML dosyasn oluturalm. Dosyaya dosya.xml ismini verelim ve kaynak kod dosyamzla ayn klasre koyalm:

<?xml version="1.0" encoding="ISO-8859-9" ?> <nler> <n ad="Sabah"> <yiyecek>Peynir</yiyecek> <iecek>ay</iecek> </n>

<n ad="Akam"> <yiyecek>Pilav</yiyecek> <iecek>Ayran</iecek> </n> </nler>


C#'ta XML ilemleri System.XML isim alanndaki snflarla yaplr. Konuya balamadan nce Temel I/O ilemleri konusunu incelemenizde fayda var. nk bu konuda akmlarla ili dl olacaz. Akmlar unutmu olabilirsiniz. Bir dosyadaki bilgiler programmza akmlar araclyla getirilir. Yani dosyadaki tm veriler bir akm nesnesine atanr. Sonra bu akm zerinde oynamalar yaparz. Sonra akm tekrar dosyaya yazp tamponu boaltrz. Akmlar geen derste grdmz offline almaya benzetebiliriz.
Konu balklar
[gizle]

1 XmlTextReader snf 2 XmlTextWriter snf 3 XmlDocument, XmlAttribute, XmlElement ve XmlNode snflar

o o o

3.1 XmlDocument snf 3.2 XmlNode snf 3.3 XmlElement snf

[dzenle]XmlTextReader

snf

Bir XML dosyasndan okuma yapmamz salar. Bir XmlTextReader nesnesi u yollarla oluturulabilir:

XmlTextReader xtr1=new XmlTextReader("dosya.xml"); XmlTextReader xtr2=new XmlTextReader(Stream akim); XmlTextReader xtr3=new XmlTextReader(xtr2);
Stream snf System.IO isim alanndadr ve FileStream, NetworkStream vb. snflarn tredii snftr. Yani bir Stream nesnesine Temel I/O ilemleri dersinde grdmz FileStream nesnelerini atayabiliriz. imdi XmlTextReader snfnn ye elemanlarn bir rnek zerinde grelim:

using System; using System.Xml; class xml { static void Main() { XmlTextReader xtr=new XmlTextReader("dosya.xml"); while(xtr.Read()) if(xtr.NodeType==XmlNodeType.Element) { Console.Write("{0,-10}",xtr.Name); if(xtr.HasAttributes) {

Console.Write("{0} nitelii var. ",xtr.AttributeCount); while(xtr.MoveToNextAttribute()) Console.Write("{0}={1}",xtr.Name,xtr.Value); Console.WriteLine(); } else Console.WriteLine("Nitelik yok."); } } }
Bu programn kts yledir:

nler n yiyecek iecek n yiyecek iecek

Nitelik yok. 1 nitelii var. ad=Sabah Nitelik yok. Nitelik yok. 1 nitelii var. ad=Akam Nitelik yok. Nitelik yok.

XmlTextReader snfna ait olan Read() metodu aktif dm bir birim teler ve true dndrr. Dm telenemiyorsa false dndrr. Dm, bir XML dosyasndaki en kk birimdir. NodeType zellii aktif dmn cinsini XmlNodeType enumu tipinden verir. XmlNodeType enumu System.Xml isim alanndadr. Dmn tipini Element yaparak yalnzca < ve > karakterleri arasndaki dmlerin hesaba katlmasn saladk. Eer bunu yapmasaydk XML dosyasndaki sonlandrclar (</xxx> gibi), yorum satrlar (<?xxx?> gibi), salt metinler (< ve > ile evrelenmeyenler) ve hatta boluklar da hesaba katlacakt. Name zellii aktif dmn ismini string olarak verir. HasAttributes zellii eer ilgili dmn nitelik (seenek) ksm da varsa true, yoksa false dndrr. AttributeCount zellii ilgili dmn nitelik saysn int tipinden dndrr. MoveToNextAttribute() aktif dmdeki seenekler arasnda teleme yapar. Balangta herhangi bir seenek zerinde olunmaz, dm zerinde olunur. Yani bir seenek elde edebilmek iin en az bir teleme yaplmaldr. teleyemiyorsa false dndrr. Name ve Value zellikleri aktif seenein ismini ve deerini string olarak dndrr. NOT: Balangta herhangi bir dm zerinde olunmaz. Bir dm elde edebilmek iin en az bir teleme yaplmaldr. NOT: Her XML dosyas bir son dm ierir. XmlNodeType enumunun szcklerinin tamam: Attribute, Document, Element, Entity, Notation, Text, CDATA, DocumentFragment, EndElement, EntityReference, ProcessingIntsruction, Whitespace, Comment, DocumentType, EndEntity, None, SignificantWhitespace, XmlDecleration. Bunlardan bizim iin nemli olanlar unlar:

Attribute seenek

Element eleman Text salt metin (boluklar hari) EndElement her dosyada bulunan son dm Whitespace boluklar Comment yorumlar None Hibirisi

NOT: Btn XML dosyalarnn kk dm olmaldr. NOT: System.Xml isim alan System.Xml.dll assemblysindedir. XmlTextReader snfnn MoveToElement() metodu seenekler arasnda dolarken seenein dmne gemek iin kullanlr. rnein <n ad="Sabah"> dmnde "ad" seeneindeysek bu metodu kullanrsak n dmne geeriz. Eer bu metodu bir seenek zerindeyken kullanmsak true dndrr, dm zerindeyken kullanmsak false dndrr. Doal olarak bir dm zerinde kullanmsak herhangi bir ey yaplmaz. Bu metotla Element, DocumentType ve XmlDeclaration dm tiplerine geri dnebiliriz. Yine ayn snfn MoveToAttribute() metodu ise aktif dmn seenekleri arasnda dolamaya yarar. MoveToNextAttribute() metodunun aksine sadece ileri doru deil, aktif dmn istenilen seeneine atlama imkan verir. ki farkl kullanm vardr:

MoveToAttribute(int i) MoveToAttribute(string s)
Birincisinde aktif seenek i. indeksli seenek yaplrken ikincisinde aktif seenek ise s isimli (Name) seenek yaplr. imdi bu iki metodu bir rnek zerinde grelim: (dosya.xml dosyasnda <n

ad="Sabah"> dmn <n ad="Sabah" saat="8"> olarak deitirin.)


using System; using System.Xml; class xml { static void Main() { XmlTextReader xtr=new XmlTextReader("dosya.xml"); while(xtr.Read()) if (xtr.AttributeCount>1&&xtr.NodeType==XmlNodeType.Element) { Console.Write(xtr.Name+" dmnn seenekleri: "); for (int i = 0; i < xtr.AttributeCount; i++) { xtr.MoveToAttribute(i); Console.Write("{0}={1} ", xtr.Name, xtr.Value); } xtr.MoveToElement(); //son tahlilde dm aktif hle getirildi. } }

}
[dzenle]XmlTextWriter

snf

XmlTextWriter snf programlama yoluyla XML dosyalar oluturmak amacyla kullanlabilir. rnek program:

using System.Xml; class Xtw { static void Main() { XmlTextWriter xtw=new XmlTextWriter("yeni.xml",System.Text.Encoding.GetEncoding("windows1254")); xtw.Formatting=Formatting.Indented; xtw.WriteStartDocument(); //XML belgesine versiyon bilgisi yazlyor. xtw.WriteComment("Bu bir denemedir"); xtw.WriteStartElement("st_dm"); xtw.WriteStartElement("alt_dm"); xtw.WriteAttributeString("seenek","deer"); xtw.WriteString("Salt yaz"); xtw.WriteEndElement(); xtw.WriteEndElement(); xtw.WriteEndDocument(); xtw.Close(); } }
Bu programn rettii XML dosyas yle olacaktr.

<?xml version="1.0" encoding="windows-1254"?> <!--Bu bir denemedir--> <st_dm> <alt_dm seenek="deer">Salt yaz</alt_dm> </st_dm>
Metotlar aklama gereksinimi grmyorum. Hepsi yeterince ak. XmlTextWriter nesneleri farkl yollarla oluturulabilir:

XmlTextWriter xtw1=XmlTextWriter(string dosya,System.Text.Encoding kodlama); //rneimizdeki gibi XmlTextWriter xtw2=XmlTextWriter(Stream akim,System.Text.Encoding kodlama); XmlTextWriter xtw3=XmlTextWriter(TextWriter xw); //TextWriter snf System.IO isim alanndadr.
[dzenle]XmlDocument,

XmlAttribute, XmlElement ve XmlNode snflar

Bu snflar zetle XmlTextReader ve XmlTextWriter snflarnn yapt ileri yaparlar ancak daha gelimi zellikler sunar. XmlDocument bir XML dosyasn, XmlAttribute bir dmn seeneklerini, XmlElement bir dosyadaki element dmleri ve XmlNode dmleri temsil eder.

[dzenle]XmlDocument

snf

Bir XmlDocument nesnesi yle oluturulabilir:

XmlTextReader xtr=new XmlTextReader("dosya.xml"); XmlDocument xd=new XmlDocument(); xd.Load(xtr);


[dzenle]XmlNode

snf

Bir XmlNode nesnesi yle oluturulabilir:

XmlTextReader xtr=new XmlTextReader("dosya.xml"); XmlDocument xd=new XmlDocument(); xd.Load(xtr); XmlNodeList xnl=xd.ChildNodes; XmlNode xn=xnl[0];
XmlNode snfnn nemli zellikleri unlardr: (tamam static deildir) XmlAttributeCollection Attributes lgili dmn seeneklerini bir XmlAttributeCollection nesnesi olarak dndrr. Bu koleksiyon XmlAttribute nesnelerinden oluur. (salt okunur) XmlNode ParentNode st dm XmlNode tipinden dndrr. (salt okunur) bool HasChildNodes lgili dm alt dm(ler) ieriyorsa true, iermiyorsa false dndrr. (salt okunur) XmlNode FirstChild lgili dmn ilk alt dmn dndrr. (salt okunur) XmlNode LastChild lgili dmn son alt dmn dndrr. (salt okunur) XmlNodeList ChildNodes lgili dmn alt dmlerini XmlNodeList tipinden dndrr. (salt okunur) XmlNode NextSibling Aktif dmden hemen sonraki dm dndrr. (salt okunur) XmlNode PreviousSibling Aktif dmden bir nceki dm dndrr. (salt okunur) string InnerText Aktif dmn yazsn -varsa- alt dmlerin yazlaryla birlikte yan yana ekleyerek dndrr. <dm>Yaz</dm> ifadesinde dm dmnn yazs "Yaz"dr. string InnerXml Aktif dmn iindeki her eyi, XML etiketleri de dhil olmak zere dndrr. string OuterXml Az ncekinden tek fark dmn kendi XML etiketlerini de dndrmesidir. (salt okunur) string Name Dmn ismi. (salt okunur) string Value lgili dme ilikin deer. Tuttuu deer dm tipine gre deiir. rnein dm tipi yorumsa yorumun iindeki yaz dndrlr, dm tipi elementse null dndrr. XmlNodeType NodeType Dmn tipini XmlNodeType enumu cinsinden verir. (salt okunur)

[dzenle]XmlElement

snf

XmlNode snfndan tremitir. Dolaysyla bu snftaki tm ye elemanlar ierir. Bir XmlElement nesnesi yle oluturulabilir:

XmlTextReader xtr=new XmlTextReader("dosya.xml"); XmlDocument xd=new XmlDocument(); xd.Load(xr); XmlElement xe=xd.DocumentElement; //xe -> ilk element

Son olarak XmlDocument snfnn Save() metodu ilgili XmlDocument nesnesinde yaplan deiikliklerin dosyaya geri yazlmasn salar:

using System; using System.Xml; class xml { static void Main() { XmlTextReader xtr=new XmlTextReader("dosya.xml"); XmlDocument xd=new XmlDocument(); xd.Load(xtr); XmlNodeList xnl=xd.ChildNodes; xnl[1].ChildNodes[0].ChildNodes[0].InnerText="Domates"; xd.Save("dosya2.xml"); } }
Eer bu programda Save() metodunun parametresine dosya.xml yazsaydk sistem hata verecekti. nk dosyay ayn anda hem XmlTextReader snf hem de XmlDocument snf kullanyordu. Bu sorunu amak iin program yle yazabiliriz:

using System; using System.Xml; class xml { static void Main() { XmlTextReader xtr=new XmlTextReader("dosya.xml"); XmlDocument xd=new XmlDocument(); xd.Load(xtr); XmlNodeList xnl=xd.ChildNodes; xnl[1].ChildNodes[0].ChildNodes[0].InnerText="Domates"; xtr.Close(); xd.Save("dosya.xml"); } }
Burada ncelikle xtr nesnesinin tuttuu dosyay brakmasn saladk. Sonra serbest kalan dosyaya yazma iini baaryla gerekletirdik.

C Sharp Programlama Dili/Form tabanl uygulamalar


Vikikitap, zgr ktphane
< C Sharp Programlama Dili

C#'ta grsel formlarla ilgili ilemler System.Windows.Forms isim alanndaki snflarla yaplr. Bu isim alan System.Windows.Forms.dll assemblysindedir.

[dzenle]Form

snf

Form snf programmza bir form getirmeye yarar. rnek program:

using System.Windows.Forms; class FormOrnek { static void Main() { Form f=new Form(); f.Show(); } }
Bu programda nce bir komut satr alr, sonra bir form alr, sonra form kapanr. Eer sisteminiz ok hzlysa formu grmemeniz bile mmkndr. Ancak program alacaktr. imdi bir de bu program

csc /t:winexe form.cs


komutuyla derleyin. Bu durumda ilgili exe dosyasn ift tklayp atmzda artk komut satr penceresi gzkmeyecektir. Yani /t:winexe argmannn tek fonksiyonu budur. imdi program kodumuzu yle deitirelim:

using System.Windows.Forms; class FormOrnek { static void Main() { Form f=new Form(); Application.Run(f); } }
Bu sefer Form snfnn Show() metodunu deil, Application snfnn static Run() metodunu kullandk ve metodun parametresine Form nesnemizi verdik. Bu sefer form biz sa st kedeki kapatma dmesine basana kadar ekranda kalacaktr. imdi programz yle deitirelim:

using System.Windows.Forms; class FormOrnek:Form { static void Main() { Application.Run(new FormOrnek()); } }

Bu programda ncekilerin aksine Form snfna balanmadk. Kendi snfmz Form snfndan trettik. Bu sayede Form snfnn birok static ye elemanna yalnzca ye elemann adn yazarak eriebiliriz. Ancak burada snfmz Form snfndan tretmedeki asl ama programmzn aslnda bir form olmasdr. Yani mantksal btnl korumak iin snfmz Form snfndan trettik. NOT: Sinif

a=new Sinif() satrnda nesneyi oluturan asl ksm new Sinif() ksmdr.

Dier ksm yalnzca oluturulan bu nesnenin a referansna atanmasn salar.

[dzenle]Button

snf

Daha nce formun mantksal olarak programmzn kendisini temsil ettiini sylemitik. Butonlar ve dier kontroller ise yalnzca programmzdaki bileenleri temsil ederler. imdi Button snfyla ilgili bir rnek yapalm:

using System.Windows.Forms; using System.Drawing; class Form1:Form { private Button buton; public Form1() { buton=new Button(); buton.Text="Butonun zerindeki yaz"; buton.Location=new Point(50,50); buton.Cursor=Cursors.No; buton.Size=new Size(150,50); this.Text="Formun bal"; this.Controls.Add(buton); } static void Main() { Application.Run(new Form1()); } }
Size ve Point System.Drawing isim alannda bulunan iki snftr ve bir kontroln konum ve boyut bilgisini tutarlar. Button snfnn Location zellii Point tipinden, Size zellii ise Size tipindendir. Button snfnn Text zellii butonun zerindeki yazy, Cursor zellii fare ilgili butonun zerine geldiinde alaca ekli belirtmemizi salar. Cursors enumu System.Windows.Forms isim alanndadr. Daha nceden de grdmz gibi this anahtar szc bir yere hangi nesne zerinden eriilmise o nesneyi tutar. Form1 snfnn yapc metoduna new

Form1() yazarak eritiimize gre bu yere yeni bir Form1 nesnesi

zerinden eriilmitir. Form snfnn Text zellii formun balk ubuundaki baln belirtir. Form snfndaki Controls zelliinin tipi yalnzca kontrolleri tutabilen bir koleksiyondur. Bu koleksiyona nesne eklersek ayn zamanda forma da kontrol eklemi oluruz. NOT: Nesne ynelimli programlamann en temel yaklam bir problemi olabildiince ok paraya blp her bir parann yalnzca kendisiyle ilgili kodlar iermesidir. Bu sayede kaynak kodun karmakl azalacak ve

kodun ynetimi kolaylaacaktr. Biz bu rneimizde btn kodlar Main metodunun iine koyabilirdik. Ancak nesne ynelim tekniinin temel yaklamna aykr olurdu. stelik bu sayede kodumuzda mantksal bir btnlk de yakaladk. rnein buton, formumuzda bulunan bir bileendir. Bunu Main ya da yapc met oda koymak yerine Form1 snfnn bir zellii olarak yerletirdik. Benzer ekilde yapc metoda yalnzca formla ilgili kodlar yerletirdik. Programmzn temel ksm olan Main() metodumuz ise yalnzca ilgili metotlar armaktan baka ie yaramad. Gelimi uygulamalarda Main() metodu olabildiince az kod ierir. Main() metodu yalnzca dier metotlarn koordinasyonuyla ilgilenir.

[dzenle]Olaylar

ve formlar

Hatrlarsanz Temsilciler ve Olaylar konusunda olaylarn Windows formlaryla ili dl olduunu sylemitik. Olaylarn en yaygn kullanm yeri Windows formlardr. Windows formlaryla ilgili snflarn ounun onlarca olay vardr. Bu olaylarn tipi EventHandler temsilcisidir. Bu temsilci u ekildedir.

void EvenHandler(object kaynak, EventArgs e)


Yani bu temsilci geriye bir deer dndrmeyen, iki parametre alan ve parametreleri de srasyla object ve EventArgs trnden olan metotlar temsil eder. Dolaysyla da Windows formlaryla ilgili snflarn olaylarna da yalnzca bu prototipte metotlar balanabilir. Hatrlarsanz olaylar konusunda hem temsilciyi (olay tneticisi), hem olay, hem olaya balanan metodu biz yazm, hatta olay da biz gerekletirmitik. Halbuki Windows formlarnda biz yalnzca olaya balanan metotla ilgileniriz. Windows formlarnda olay yneticisi yukarda prototipi yazlan EventHandler temsilcisidir. Yine btn formlarla ilgili olaylar ilgili snfta bildirilmitir. Olayn gerekletirilmesini ise kullanc yapar. letim sistemi herhangi bir olay gerekletiinde (rnein butonun tklanmas) olayn gerekletii bilgisini ve bu olayla ilgili ek bilgileri programmza verir. Eer programmzda bu olay ileyecek herhangi bir metot yoksa hibir ey yaplmaz. Varsa o metottaki komutlar altrlr. imdi olaylar hatrlama asndan bir rnek yapalm:

using System; delegate void OlayYoneticisi(); //Olay yneticisi bildirimi class AnaProgram { static void Main() { AnaProgram nesne=new AnaProgram(); nesne.Olay+=new OlayYoneticisi(Metot); //Olay sonras iletilecek metotlarn eklenmesi nesne.Olay(); //Olayn gerekletirilmesi } //Olay sonras iletilecek metot static void Metot() { Console.WriteLine("Butona tkland."); } event OlayYoneticisi Olay; //Olay bildirimi }

Bu en basit olay mantyd. imdi bunu Windows formlarna uyarlayalm:

delegate void EventHandler(object o,EventArgs e); class Button { event EventHandler Click; } class KendiSinifimiz { static void Main() { Button buton1=new Button(); buton1.Click+=new EventHandler(Metot); } void Metot(object o,EventArgs e) { //Tklandnda alacak } } class IsletimSistemi { static void KullaniciTikladiginda() { buton1.Click; } }
Kukusuz bu program almayacaktr. Yalnzca Windows formlarndaki olaylarn nasl ilediini anlamanz iin bu rnei verdim. IsletimSistemi snfnn arka planda srekli altn dnebilirsiniz. imdi artk olaylarla ilgili gerek rneimize balayabiliriz:

using System; using System.Windows.Forms; class Form1:Form { private Button buton; public Form1() { buton=new Button(); buton.Text="Tkla"; this.Controls.Add(buton); buton.Click+=new EventHandler(Tiklandiginda); } static void Main() { Application.Run(new Form1()); } void Tiklandiginda(object o,EventArgs e)

{ MessageBox.Show("Butona tkladnz"); } }
EventArgs System alannda ve MessageBox System.Windows.Forms isim alannda birer snflardr. MessageBox snfnn static Show() metodu ekrana bir ileti kutusunun gelmesini salar. EventArgs ise olayla ilgili ek bilgileri tutan snftr. Dier form kontrollerini bir sonraki konumuz olan Visual Studio.NET dersinde greceiz. Yani dier kontrolleri formumuza kodlarla deil, Visual Studio.NET ile getireceiz.

C Sharp Programlama Dili/Visual Studio.NET


Vikikitap, zgr ktphane
< C Sharp Programlama Dili

imdiye kadar programlarmz Not Defteri'nde yazdk ve csc.exe derleyicisi ile derledik. Byle yapmamzn sebebi C# dilini tam anlamyla renmemizdi. Artk C# dilini baya rendik. Artk gelimi zelliklerle donatlm, tmleik bir derleyiciye sahip olan Visual C# Express Edition yazlmna geebiliriz. Bu yazlm buradan cretsiz olarak indirip bilgisayarnza kurabilirsiniz.
Konu balklar
[gizle]

1 Yeni bir proje balatma 2 Solution Explorer pencerecii 3 Class View pencerecii 4 Kodlama 5 Visual Studio.NET ve dosyalar 6 Solution kavram 7 Derleme 8 Hata ayklama 9 Visual Studio.NET ile form tabanl alma

o o

9.1 Birden fazla formla almak 9.2 nemli dier kontroller

9.2.1 MessageBox 9.2.2 Menler

9.2.2.1 MainMenu 9.2.2.2 ContextMenu

9.2.3 ListBox 9.2.4 Diyalog pencereleri 9.2.5 Label 9.2.6 Timer

[dzenle]Yeni bir proje balatma

Visual C# 2008 Express Edition yazlmnn orta ksm yandaki gibidir. "Recent Projects" ksmndan "Create" satrndaki "Project" linkini tklayarak yeni bir proje oluturabileceiniz aadaki ekran getirin.

Bu penceredeki iimize yarayacak olan proje eitleri: Windows Forms Application Yeni bir Windows uygulamas. Otomatik bir form alr. Class Library Yeni bir DLL dosyas. Console Application Yeni bir konsol (komut istemi) uygulamas. Empty Project Bo bir sayfa Dierleri bizi ilgilendirmiyor. stediimiz proje eidini tklayp OK butonuna bastktan sonra o tr bir proje iin gerekli minimum kodlardan ibaret bir dosya oluturulacaktr.

[dzenle]Solution Explorer pencerecii


Yeni bir Console Application projesi oluturun. Sayfann asl ksmna kodlarmz otomatik olarak gelecektir. Sayfann sa ksmnda ise Solution Explorer penceresi bulunur. Solution Explorer pencerecii yandaki gibidir. Bu pencerede kodumuzla ilgili dosyalar ve kodumuza refere ettiimiz DLL dosyalar bulunur. Referans DLL'leri "References" klasrnn iindedir. Daha nce oluturduumuz bir DLL dosyasn programmza refere etmek iin "References" klasrn sa tklayp "Add Reference"i tklarz. Alan

pencereden ".NET" sekmesinden .NET Framework'un kendi DLL'lerini, "COM" sekmesinden Windows'un COM bileenlerini, "Browse" sekmesinden kendi DLL'lerimizi, "Projects" sekmesinden baka projelerin DLL'lerini ve son olarak "Recent" sekmesinden son kullandmz DLL'leri programmza refere edebiliriz. Ayn anda birden fazla DLL seebiliriz.

[dzenle]Class View pencerecii

Men ubuundaki "View" mensnden Class View pencereciini grnr hle getirin. Class View pencerecii yandaki gibidir. Class View pencereciinde o anki projemizdeki ve projemizin referanslarndaki tm isim alanlar, trler ve ye elemanlar hiyerarik bir yapda listelenir. Bir trdeki ye elemanlar grmek iin tr tklamamz yeterlidir. Trlerde treme sz konusuysa treyen ye elemanlar da grebiliriz. Projemizde ilgili isim alan, tr ya da ye elemana gitmek iin sadece onun Class View penceresindeki karlna ift tklamak yeterlidir. Trler ve ye elemanlar arasnda dolamann dier bir yoluysa kaynak kodun hemen stndeki drop down menleri kullanmaktr.

[dzenle]Kodlama
Kaynak kodda herhangi bir yerde CTRL+boluk tu bileimini kullanrsak orada kullanabileceimiz her trl kod (anahtar szck, tr, ye eleman, nesne vb.) bir mende listelenir. Benzer ekilde kodun herhangi bir yerinde bir nesneyi kullanp . tuuna basarsanz o nesneyle eriilebilecek ye elemanlar listelenir. Visual Studio.NET'in bunun gibi birok zellii vardr. Bunlar kendiniz program yazdka kefedebilirsiniz.

[dzenle]Visual Studio.NET ve dosyalar


Visual Studio projelerimizi varsaylan olarak "C:\Documents and Settings\Kullanc\Belgelerim\Visual Studio 2008\Projects" klasrne kaydeder. (Derleme ve kaydetmenin nasl yapldn ileride ayrntlaryla anlatacam. imdilik programn kapatma dmesine basp gelen uyar penceresine "Yes" deyin.) Bu klasrde solution ismimiz, bu klasrn iinde proje klasrmz/klasrlerimiz, proje klasrmzn iinde ismi snf ismimizle ayn olan kaynak kod dosyamz, bu klasrdeki bin klasrnn iindeki Debug klasrnde de exe dosyamz bulunur. Yani son tahlilde exe dosyamzn yolu

C:\Documents and

Settings\Kullanc\Belgelerim\Visual Studio 2008\Projects\ConsoleApplication1\ConsoleApplication1\bin\Debug ek

lindedir. Projemize kaynak kod dosyas eklemek iin Solution Explorer pencereciinde projeyi sa tklayp Add -> New Item yolunu izleyin. Alan pencereden yeni oluturulacak dosyadaki bildirimleri otomatik yapabilirsiniz. rnein bu alan pencereden Code File' seerseniz bo bir cs dosyas projemize eklenir, eer Class' seerseniz iinde bir snf bildirimi olan bir cs dosyas projemize eklenir. Yine Solution Explorer penceresindeki kaynak kodlar sa tklayp silebilir, projeden karabilir, projeyi sa tklayp Add -> Existing Item yolunu izleyerek var olan bir kaynak kodu projemize ekleyebiliriz. Ayrca projeye sa tklayp Add -> New Folder yolundan kaynak kodlarmz koordine etmek iin projemize bir klasr de ekleyebiliriz.

[dzenle]Solution kavram
Solution, projeleri koordine etmeye yarayan bir yapdr. Bir projede yalnzca bir tane altrlabilir (exe) dosya bulunur. Bir solution'da ise birden fazla altrlabilir dosya bulunabilir. Bir solution'a proje eklemek iin Solution Explorer pencereciinde solution sa tklanp Add -> New Project yolu kullanlr. Aktif solution'a proje eklemenin baka bir yolu ise File mensnden "New Project"i semektir. Bir projeyi balang projesi yapmak iin ilgili proje sa tklanp "Set as StartUp Project" seilir. Balang projesinin ne demek olduunu ileride greceiz.

[dzenle]Derleme
Visual Studio.Net balang projesindeki btn kaynak kod dosyalarnn birletirilip derlenmesi iin iki yol sunar. Bunlar Debug ve Release seenekleridir. Debug seenei programmzn almasn test etmek ve hata ayklamak iin kullanlr. Release seenei ise programmzn testi bittiinde son kullancnn istifadesine sunmak iin kullanlr. Release seeneinde kodumuzdan btn gereksiz ksmlar atlr ve program daha hzl alr. Debug seeneinde ise hata ayklama iin gerekli kodlar kaynak kodumuza gizlice eklenir. Balang projesini debugl altrmak iin debug mensnden "Start Debugging" seilir. Projeyi debugsz altrmak iinse yine ayn menden "Start Without Debugging" seilir. Bunlarn ksayollar srasyla F5 ve Ctrl+F5'tir. NOT: lk aamada solution, ara ubuundaki disket simgesine ya da File mensndeki Save komutuna tklanmadan sabit diske kaydedilmez.

[dzenle]Hata ayklama
Hata ayklama kaynak kodumuzun eitli yerlerine yerletirdiimiz breakpointlerle yaplr. Debugl altrlan bir kod breakpoint olan satrlardan birine geldiinde programn almas duraklatlr (pause). Kaynak koddaki bir satra breakpoint koymak iin ilgili satr sa tklanp Breakpoint -> Insert Breakpoint yolu izlenir. Bir satra breakpoint koymann baka bir yolu ise imle ilgili satrdayken F9 tuuna basmaktr. Kod debugl alrken breakpointli bir satra gelindiinde Debug mensnn ierii deiir. Bu mendeki nemli seenekleri inceleyecek olursak; "Step Over" programn ileyiini bir sonraki satra gtrr. "Continue" ile bir sonraki breakpointe kadar programn ileyii devam ettirilir. "Stop Debugging" ile de hata ayklama modundan klr. Windows -> Watch yolundan deiken deerlerini adm adm izleyebileceimiz Wa tch

pencerecii grnr hle getirilir. Watch pencereciine bir deiken izlemesi eklemek iin pencere sa tklanr ve "Add Watch" seilir. Bu admdan sonra bo satrn "Name" stunu ift tklanr ve buraya deiken ya da deikenlerden oluan bir ifade yazlr. Artk ilgili satrn "Value" stununda ilgili satrdaki deiken ya da ifadenin deeri adm adm gsterilecektir. Yine Debug mensndeki "Exceptions" seenei ile bir istisnai durum frlatldnda ya da frlatlp yakalanamadnda debugn devam etmesini ya da durmasn salayabilirsiniz. NOT: Bir solutionn tamamn derleyip release olarak kaydetmek iin "Build" mensnden "Build Solution" seilir.

[dzenle]Visual Studio.NET ile form tabanl alma

Geen blmde kodlarla bir form oluturmu, formun zerine bir buton getirmi ve butona tklandnda bir ileti kutusunun almasn salamtk. Bu blmde dier kontrolleri Visual Studio.Net ile formumuza getirip ayarlamalarn Visual Studio.Net ile yapacaz. ncelikle Visual Studio.Net'te bir Windows Forms Application projesi oluturun. Ekrannza yandaki gibi bo bir form gelecektir. Formun yanndaki toolbox'tan forma bir buton ve bir de textbox srkleyin. Alternatif olarak bunlar forma getirmek iin ift tklamanz da yeterlidir. Kontrollerin yandaki tutamalaryla oynayarak boyutlarna deitirebilir veya s rkleyerek formdaki istediiniz bir noktaya tayabilirsiniz. Tabii bunlar yaparken kaynak kodumuz otomatik olarak deiecektir.

Seili kontroln zelliklerini grebileceiniz "Properties" penceresini grnr hle getirmek iin View mensnden "Properties Window"u sein. Properties penceresinden (yandaki resimde) seili kontroln zelliklerini deitirebileceiniz gibi aktif kontrol deitirmek iin Properties penceresinin st ksmndaki dropdown meny de kullanabilirsiniz. Bir kontroln olaylarn listelemek iin Properties pencereciinin st ksmndaki sar yldrm simgesini tklayabilirsiniz. Listelenen olaylarn sadaki bo ksmna bir metot ad yazarak bu olay gerekletiinde bu metodun almasn salayabiriz. Siz buton seiliyken Click olayn sein ve metot ismi blmne Tiklandi yazn. Sonra bu metot ismine ift tklayn. Metodun ieriinin yazlaca bir ekran alacaktr. Metodun ieriine u satr yazn:

MessageBox.Show("Merhaba");
imdi Solution Explorer penceresine bakacak olursak Form1.cs ve Program.cs olmak zere iki ge vardr. Program.cs, iinde Main() metodunun ve Program snfnn olduu asl dosyamzdr. Form1.cs'nin yanndaki + iaretine tklayacak olursak Form1.Designer.cs ve Form1.resx olmak zere iki dosya vardr. Form1.r esx bizi ilgilendirmiyor. Form1.Designer.cs formdaki kontrolerin grsellikleriyle ilgilenen dosyadr ve biz formdaki kontrollerde deiiklik yaptka bu dosyann ierii deiir. ncelikle Form1.Designer.cs'nin ieriine bakalm:

namespace DenemeForm { partial class Form1 { /// <summary> /// Required designer variable. /// </summary> private System.ComponentModel.IContainer components = null; /// <summary> /// Clean up any resources being used. /// </summary>

/// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param> protected override void Dispose(bool disposing) { if (disposing && (components != null)) { components.Dispose(); } base.Dispose(disposing); } #region Windows Form Designer generated code /// <summary> /// Required method for Designer support - do not modify /// the contents of this method with the code editor. /// </summary> private void InitializeComponent() { this.button1 = new System.Windows.Forms.Button(); this.textBox1 = new System.Windows.Forms.TextBox(); this.SuspendLayout(); // // button1 // this.button1.Location = new System.Drawing.Point(105, 53); this.button1.Name = "button1"; this.button1.Size = new System.Drawing.Size(75, 23); this.button1.TabIndex = 0; this.button1.Text = "button1"; this.button1.UseVisualStyleBackColor = true; this.button1.Click += new System.EventHandler(this.Tiklandi); // // textBox1 // this.textBox1.Location = new System.Drawing.Point(79, 94); this.textBox1.Name = "textBox1"; this.textBox1.Size = new System.Drawing.Size(129, 20); this.textBox1.TabIndex = 1; // // Form1 // this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; this.ClientSize = new System.Drawing.Size(292, 266);

this.Controls.Add(this.textBox1); this.Controls.Add(this.button1); this.Name = "Form1"; this.Text = "Form1"; this.ResumeLayout(false); this.PerformLayout(); } #endregion private System.Windows.Forms.Button button1; private System.Windows.Forms.TextBox textBox1; } }
Eer sizde bu kod ok daha ksaysa region'dan dolaydr. Kodun sol kenar ksmnda bir region olduunu belirten herhangi bir + iareti olmadna emin olun. Kodumuzu inceleyecek olursak:

Form snfnn en altnda iki zellii var. Bunlar forma eklediimiz kontrolleri temsil eden Button tipinden olan button1 ve TextBox tipinden olan textBox1. Bu kaynak koddaki nemli metotlar inceleyecek olursak;

SuspendLayout() Form snfna aittir. lgili form nesnesine ait btn zellikler deitirildiinde form otomatik olarak izilir. ResumeLayout() Form snfna aittir. SuspendLayout() metodundan sonra kullanlr. Bu metot kullanldnda son SuspendLayout() metodundan sonraki ilgili form nesnesine yaplan deiiklikler grsel forma yanstlr. ClientSize() Formun boyutu. System.Drawing.Size tipinde. Kaynak kodumuzda Dispose() metodu override edilmi. Yani bu snf trnden bir nesnenin Dispose() metodunu kullanrsak sistemin bu nesne iin ayrd kaynaklar iade edilecek. imdi Program.cs dosyasnn ieriine bakalm:

using using using using

System; System.Collections.Generic; System.Linq; System.Windows.Forms;

namespace DenemeForm { static class Program { /// <summary> /// The main entry point for the application. /// </summary> [STAThread] static void Main()

{ Application.EnableVisualStyles(); Application.SetCompatibleTextRenderingDefault(false); Application.Run(new Form1()); } } }


Bizi burada tek ilgilendiren ksm Application.Run(new

Form1()); satr. Bunu daha nce

grmtk zaten. imdi kaynak kod dosyalarnn stndeki banttan Form1.cs dosyasna bakalm. Programcnn en ok har neir olduu dosya budur. imdi de bunun ieriine bakalm:

using using using using using using using using

System; System.Collections.Generic; System.ComponentModel; System.Data; System.Drawing; System.Linq; System.Text; System.Windows.Forms;

namespace DenemeForm { public partial class Form1 : Form { public Form1() { InitializeComponent(); } private void Tiklandi(object sender, EventArgs e) { MessageBox.Show("Merhaba"); } } }
Buras bizim butonun Click olayna ekledimiz metodun bulunduu dosya. Ayrca Form1.Designer.cs ile bu dosyann snf isimleri ayn ve partial. Tabii ki bu durumda anlyoruz ki iki dosyadaki ye elemanlar da aslnda ayn snfta. Burada Form1 snfnn yapc metodu bulunuyor. Bu yapc metotta Form1.Designer.cs'deki InitializeComponent() metodu arlm.

[dzenle]Birden fazla formla almak


Visual Studio.NET ile birden fazla formla almak son derece basittir. Bunun iin Solution Explorer penceresinde ilgili proje sa tklanp Add -> Windows Form yolu izlenir. Her form iin farkl snflar ve cs dosyalar oluturulur. Buradaki kritik nokta bir formdan baka bir formun kontrollerine eriebilmek iin ilgili kontrol temsil eden zelliin public olarak bildirilmesi gerekliliidir. Bir projede birden fazla form olabilir. Bir

formu gstermek iin Show() metodu kullanlabilir. Program.cs dosyasnda Main() metodunda hangi Form nesnesi arlyorsa o form program altnda nce gsterilecektir.

[dzenle]nemli dier kontroller [dzenle]MessageBox


En nemli metodu Show()'dur ve ileti gsterir. Show() metodunun prototipi u ekildedir;

DialogResult Show(string ileti,string balk,MessageBoxButtons a,MessageBoxIcon i)


MessageBoxButtons enumu ileti kutusundaki butonlarn durumlarn belirtmemizi salayan bir enumdur. Bu enumun ierdii szckler unlardr:

AbortRetryIgnore leti kutusunda "Durdur", "Yeniden Dene" ve "Yoksay" butonlar olur. OK leti kutusunda yalnzca "Tamam" butonu olur. OKCancel leti kutusunda "Tamam" ve "ptal" butonlar olur. RetryCancel leti kutusunda "Yeniden Dene" ve "ptal" butonlar olur. YesNo leti kutusunda "Evet" ve "Hayr" butonlar olur. YesNoCancel leti kutusunda "Evet", "Hayr" ve "ptal" butonlar olur.

MessageBoxIcon enumundaki szcklerse unlardr: Asterisk, Error, Exclamation , Hand, Information, None, Question, Stop, Warning. Bunlar ileti kutusunda grnen simgeyi belirtmemizi salar. Show() metodunun geri dn tipi DialogResult enumudur. Bu enumun ierdii szcklerse unlardr: Abort, Cancel, Ignore, No, Yes, None ve Retry. sterseniz bununla ilgili birka satrlk bir rnek yapalm:

DialogResult dr=MessageBox.Show("Merhaba","Balk",MessageBoxButtons.YesNo,MessageBo xIcon.Question); if(dr==DialogResult.Yes) MessageBox.Show("Evete bastnz."); else MessageBox.Show("Hayra bastnz.");

[dzenle]Menler [dzenle]MainMenu
Bir formun stne ana men getirmek iin toolbox'tan bir MainMenu kontrol getirili r. Eer toolboxnzda MainMenu kontrol yoksa ilgili kontrol getirmek iin toolbox'ta herhangi bir kontrol sa tklayp "Choose Items" sein. Ana men demek programlarn balk ubuunun hemen altndaki "Dosya", "Dzen", "Grnm", ... diye giden ubuktur. Her bir men elemannn ayr ayr Click olay vardr. Men elemanlarna ksayol tuu vermek iin istediimiz karakterden nce & karakterini kullanrz. Bu durumda alt tuu ile birlikte o karakterin tuuna basarsak ilgili men alacaktr. Menye ge, s eenek ve seeneklere ek seenek ekleme iin "Type Here" yazan yere yazlar yazlr. Mende herhangi bir yere ayrc koymak iin ilgili yer sa tklanp "Add Separator" seilir.

[dzenle]ContextMenu
ContextMenu formdaki herhangi bir elemana ya da formun kendisine sa tklandnda kan mendr. Kullanm byk lde MainMenu ile ayndr. Ancak ContextMenu'nn bir kontrole ilikilendirilmesi gerekir. Bu ContextMenu'y herhangi bir kontrolle ilikilendirmek iin nce ContextMenu oluturulur, sonra ilikilendirilmesi istenen kontrol tklanp "Properties" penceresindeki zelliklerinden ContextMenu zelliini bu tasarlam olduumuz ContextMenu olarak ayarlamamz gerekir.

[dzenle]ListBox
ListBox kantrol bir dizi yazy tutmak iin kullanlabilir. ListBox snfnn Items zelliinin tipi bir koleksiyondur. Bu koleksiyona eleman ekledike listboxtaki elemanlar artacak, eleman kardka listboxtaki elemanlar eksilecektir. imdi forma bir ListBox kontrol getirip u rnek kodlar yazn:

listBox1.Items.Add(1.2f); listBox1.Items.Clear(); listBox1.Items.Add(5); listBox1.Items.Add("deneme"); listBox1.Items.Remove(5); MessageBox.Show(listBox1.Items.Count.ToString()); MessageBox.Show(listBox1.Items.IndexOf("deneme").ToString());


Grdnz gibi Add() metodu object tipinden parametre alr.

[dzenle]Diyalog pencereleri
.NET Framework'taki hazr diyalog pencereleri normalde ok karmak olan birok kontrol hazr olarak bize sunar. imdi toolboxtaki hazr diyalog penceresi kontrollerini inceleyelim:

OpenFileDialog Dosya ama ekrann temsil eder. Dosya bilgisini getirir. SaveFileDialog Dosya kaydetme ekrann temsil eder. Yol bilgisi elde etme amal kullanlr. FontDialog Font (yaz tipi) seme penceresini temsil eder. ColorDialog Renk seme penceresini temsil eder. PrintDialog Yazdrma ekrann temsil eder. PrintPreviewDialog Bask nizleme penceresini temsil eder. PageSetupDialog Sayfa Yaps penceresini temsil eder. imdi OpenFileDialog ile ilgili kk bir rnek yapalm:

OpenFileDialog ofd = new OpenFileDialog(); DialogResult dr = ofd.ShowDialog(); string dosya = ofd.FileName; if(dr!=DialogResult.Cancel) MessageBox.Show(dosya + " dosyasn setiniz.");

[dzenle]Label
Label kontrol formun zerine bir yaz getirmek iin kullanlr. En nemli zellii Text'tir ve bu yazy temsil eder.

[dzenle]Timer
Timer kontrol ile bir ya da daha fazla metodun defalarca altrlmasn salarz. Timer kontrolnn Interval zellii ka milisaniyede bir ilikili metotlarn altrlacan belirtmemizi salar. 1 saniye 1000 milisaniyedir. Timer kontrol varsaylan olarak aktif deildir. Timern aktif-pasifliini deitirmek iin bool tipinden olan Enabled zellii kullanlr. Timer snfnn en nemli olay Tick'tir. Tick olay her Interval ile belirtilen zamanda bir gerekleir. imdi ok kk bir rnek yapalm:

//button1'in Click olayna timer1.Enabled = true; timer1.Interval = 1000; //timer1'in Tick olayna label1.Text = DateTime.Now.ToLongTimeString();
Burada her 1000 milisaniye (1 saniye) geite label1'in Text'i u anki saat olarak deitirilecektir. NOT: Her kontrole ift tkladmzda alan metot, ilgili kontroln en ok kullanlan olayna balanan metottur.

C Sharp Programlama Dili/ok kanall uygulamalar


Vikikitap, zgr ktphane
< C Sharp Programlama Dili

Farkndaysanz imdiye kadar yazdmz kodlar satr satr altrlyordu ve bir satrn ilemi bitmeden teki satra geilmiyordu. rnein;

Metot1(); Metot2();
Burada birinci metottaki btn kodlar altrlmadan ikinci metot almaya balamaz. Ancak bu derste greceemiz ok kanall uygulama (multi-threading) gelitirme teknolojisiyle bu iki metodun ayn zamanda almaya balamasn salayabileceiz. Yani bilgisayarmzn ilemcisi ayn anda iki ilem yapacak. ok kanall uygulama gelitirme teknolojisini genellikle arka planda srekli almasn istediimiz bir program parac varsa kullanrz. rnein bir anti virs yazlmnn gerek zamanl koruma yapabilmesi iin thread teknolojisini kullanmas gerekir. C#'ta ok kanall uygulamalar ile ilgilenen snflar System.Threading isim alanndadr. imdi bir rnek yapaym ve konuyu bu rnek zerinde anlataym:

nce bir Windows projesi an. Forma iki ListBox, bir Label, bir de Button getirin. Birinci ListBox'a her saniye de bir ge eklenecek, bu geler de 1, 2, 3, ... diye gidecek. kinci ListBox'a her iki saniye de bir ge eklenecek, bu geler de 10, 20, 30, ... diye gidecek . Label'da u anki saat saat:dakika:saniye formatnda olacak ve srekli gncel olacak. Son olarak butona basldnda btn bu srekli deien eyler durdurulacak. Yani Label'n saati butona basldktan sonra hep ayn kalacak. ListBox'lara da butona basldktan sonra ge ekleme durdurulacak.

Artk kodlar yazmaya balayabiliriz. Kodlarmz grsellikle deil, kodlarla ilgilenen dosya olan Form1.cs dosyasndaki Form1 snfna yazacaz. Bu dosyay ve snf forma sa tklayp "View Code"u tklayarak aabilirsiniz.

Thread islem1; //Daha nce using bildirimlerine "using System.Threading;" satrn ekleyin. Thread islem2; Thread islem3; private void Form1_Load(object sender, EventArgs e) //Bu metodu yazarak deil, forma ift tklayarak oluturun. { //Bylelikle metot otomatik olarak formun Load olayna balanr. Form1.CheckForIllegalCrossThreadCalls = false; //Tabii ki metodun ieriini kendiniz yazacaksnz. islem1=new Thread(new ThreadStart(metot1)); islem2=new Thread(new ThreadStart(metot2)); islem3=new Thread(new ThreadStart(metot3)); islem1.Start(); islem2.Start(); islem3.Start(); } int i=0; int j=0; void metot1() //Bu, listBox1'e her saniyede 1, 2, 3, ... eklinde ge ekleyecek metot. { while(true) { listBox1.Items.Add(++i); Thread.Sleep(1000); } } void metot2() //Bu, listBox2'ye her iki saniyede 10, 20, 30, ... eklinde ge ekleyecek metot. { while(true) { listBox2.Items.Add(10*j++); Thread.Sleep(2000); } } void metot3() //Bu, label1'e o anki saati saat:dakika:saniye formatnda gncel olarak yazan metot. { while(true) label1.Text=DateTime.Now.ToLongTimeString(); }

private void button1_Click(object sender, EventArgs e)//Bu metodu yazarak deil, butona ift tklayarak oluturun. { //Bylelikle metot otomatik olarak butonun Click olayna balanr. islem1.Abort(); //Tabii ki metodun ieriini kendiniz yazacaksnz. islem2.Abort(); islem3.Abort(); }
Bu programdaki Form1.CheckForIllegalCrossThreadCalls

= false; satryla

derleyicinin bu ekilde thread kullanlmasna izin vermi olduk. Metotlarn iindeki komutlar sonsuz bir dng iinde yazarak ilgili komutlarn bir kere alp sonlanmak yerine sonsuza kadar almasn saladk. Thread snfnn static Sleep() metoduyla programn istenilen sre zarfnda hibir ey yapmadan beklemesini saladk. Buradaki en nemli nokta olarak da yeni Thread nesneleri oluturduk, bu nesneleri metotlarmzla ilikilendirdik. Thread snfnn static olmayan Start() ve Abort() metotlatyla da Thread nesnelerinin temsil ettikleri metotlarn almasn balatp durdurduk.

[dzenle]Son

not

Artk kitap bitti. Artk C# dilini tam anlamyla bildiinizi dnyorum. Ancak C# ile .NET Framework ktphanesi farkl kavramlardr. Bu kitap boyunca asl anlatlmak istenen C# dilidir. .NET ktphanesini kullanabileceiniz tek dil C# deildir. C# dnda Visual Basic.NET, C++.NET, J# vb. birok dille .NET Framework ktphanesinden faydalanabilirsiniz. Ancak C#, .NET Framework ktphanesi iin Microsoft tarafndan zel olarak sfrdan gelitirilmi bir dildir. C# ile .NET Framework ktphanesini dier dillere oranla ok daha efektif ekilde kullanrsnz. .NET Framework ktphanesi hakknda daha fazla bilgi istiyorsanz Microsoft'un MSDN ktphanesini kullanabilirsiniz. Sitede sol taraftaki aa grnml menden .NET Development -> .NET Framework 4 -> .NET Framework Class Library yolunu izleyerek bu kitap boyunca zet olarak verilen snf bilgilerine ayrntl olarak eriebilirsiniz.

C Sharp Programlama Dili/Linux'ta C Sharp kullanm


Vikikitap, zgr ktphane
< C Sharp Programlama Dili

Bu sayfa Pardus datmna gre anlatlmtr. Baka bir datm kullanyorsanz paket isimleri ve/veya kurulum aamas d

Linux'ta iki ekilde C# uygulamalar gelitirebilirsiniz: 1. Kodlarnz metin editrnde yazarsnz. mono-runtime paketini kurarsnz. Kaynak kod dosyanz mono-runtime paketiyle gelen mcs programyla derlersiniz. Derlenmi program mono -

runtime paketiyle gelen mono programyla altrrsnz. mcs program Windows'taki csc.exe'ye benzer. mono-runtime paketi Windows'taki .NET Framework'a benzer. mono-runtime paketi hem mcs ile program derlemeniz iin ve hem de mcs ile derlenmi programlar altrmanz i in gereklidir. Mono'nun Windows ve MacOS srmleri de vardr. Bu sayede Linux'ta yazm olduunuz bir C# programnn Windows ve MacOS'ta almas salanr. Eer C# programnz yazarken Mono'ya zg ktphaneleri kullanmamsanz yazdnz programn Wind ows'ta alabilmesi iin ilgili Windows makinede sadece .NET Framework'un kurulu olmas yeterli olacaktr. 2.

mono-develop paketini kurarsnz. Kodlarnz MonoDevelop yazlmnda yazar ve derlersiniz.


MonoDevelop ok gelimi zellikler sunar. MonoDevelop W indows'taki Visual Studio'ya benzer.

imdi bu iki yntemi srayla grelim.


Konu balklar
[gizle]

1 Komut satrnda derleme

o o o o

1.1 mono-runtime paketinin kurulumu 1.2 C# kodlarn yazma 1.3 Kaynak kod dosyanz derleme 1.4 Derlenmi program altrma

2 MonoDevelop

o o o o o o

2.1 Kurulum 2.2 Temel kavramlar 2.3 Yeni zm balatma 2.4 Var olan bir zme proje ekleme 2.5 zmdeki ktphane projemizi altrlabilir dosyamzla ilikilendirme 2.6 MonoDevelop ile grsel arayz olan programlar gelitirme

2.6.1 MonoDevelop'taki btn kontroller

2.6.1.1 Alignment kapsaycs 2.6.1.2 Expander kapsaycs 2.6.1.3 Fixed kapsaycs 2.6.1.4 Frame kapsaycs 2.6.1.5 HBox kapsaycs 2.6.1.6 HButtonBox kapsaycs

[dzenle]Komut

satrnda derleme

[dzenle]mono-runtime

paketinin kurulumu

Paket yneticisinde mono-runtime paketini aratn ve -varsa- bamllklaryla birlikte kurun.

[dzenle]C#

kodlarn yazma
deneme.cs verin.

Bir metin dzenleyicide aadaki dosyay oluturun ve ismini

using System; class deneme { static void Main() { Console.WriteLine("Deneme"); } }


[dzenle]Kaynak

kod dosyanz derleme

Komut satrnda bu dosyay kaydettiiniz dizine gein ve aadaki komutu verin.

mcs deneme.cs
Bu komut sonucunda aktif klasrde deneme.exe isimli bir dosya oluacaktr.

[dzenle]Derlenmi

program altrma

deneme.exe dosyasnn olduu klasre komut isteminde geip u komutu verin:

mono deneme.exe
Program ekrana Deneme ktsn verecektir. Bu exe dosyasn Windows bir sisteme tamanz durumunda ift tklar tklamaz alacaktr (tabii ki sistemde .NET Framework kurulu ise). nk programda Mono'ya zg herhangi bir ktphane kullanmadk. Programda sadece Console snfn kullandk -ki bu snf da .NET Framework ktphanesinde de var. Eer programmzda Mono'ya zg bir ktphane kullansaydk bu programn Windows bir sistemde almas iin ilgili sistemde Mono'nun kurulu olmas gerekecekti.

[dzenle]MonoDevelop
MonoDevelop Windows'taki Visual Studio'ya benzer. Bir tmleik gelitirme ortamdr (IDE).

[dzenle]Kurulum
Paket yneticisinde mono-develop paketini aratn ve -varsa- bamllklaryla birlikte kurun.

[dzenle]Temel

kavramlar

Proje: Bir proje derlendiinde tek bir assembly (altrlabilir dosya veya ktphane) oluur. Bir proje bir veya birden fazla kaynak kod dosyasndan, ktphane referanslarndan ve kaynak dosyalardan (rnein resim dosyalar) oluabilir. Bir projenin btn bilgileri XML biimli ve .csproj uzantl bir dosyada saklanr. Bu

csproj dosyasnda projenin hangi dosyalardan olutuu ve genel yaplandrmalar saklanr ve Visual Studio ile uyumludur. Projeler kaydedilip yeniden arlabilir, bu sayede projeye daha sonra kaldmz yerden devam edebiliriz. zm: Bir veya birden fazla projeden oluur. zm bilgileri XML biimli ve .sln uzantl bir dosyada saklanr. zmler kaydedilip yeniden arlabilir. Bir zm alt zmler ierebilir. Mono ile oluturduunuz zm dosyalar Visual Studio ile uyumludur. Varsaylan durumda projeleriniz u hiyeraride saklanr: Ev klasrnz > Projects > zm ismi > Proje ismi

[dzenle]Yeni

zm balatma

MonoDevelop'u an. Dosya > Yeni > zm yolunu izleyin. Alan pencerede zme koyulacak ilk projenin dilini, tipini (konsol projesi, ktphane, vs.) sein. Projenize ve zmnze isim verin. Burada ayrca zmn kaydedilecei klasr deitirebilirsiniz. Ancak tutarllk asndan deitirmenizi tavsiye etmiyorum. "Create directory for solution" onay kutusunu iaretlemezseniz zm aktif zme bir alt zm olarak oluturulur. Tamamen yeni bir zm oluturduumuz iin bu onay kutusunun iaretli olmas gerekiyor. Dili C# sein ve bu seferlik rnek iin proje tipini konsol projesi sein. zmn ismini "Cozum" ve projenin ismini "Program" yapn. "leri"yi tklayn. Gelen ekranda hibir eyi semeyip "Tamam" tklayn. Ekrannza main.cs dosyasnn ierii gelecektir. Bu dosyann ierii yle olacaktr:

using System; namespace Program { class MainClass { public static void Main (string[] args) { Console.WriteLine ("Hello World!"); } } }
altr > altr yolunu izleyerek program MonoDevelop'un dahili konsol ekrannda altrabilirsiniz.

[dzenle]Var

olan bir zme proje ekleme

Kod yazdnz alann solunda bir zm kutusu olacaktr. Bu kutuda aktif zmnz, zmn iindeki projeler, projelerin iindeki dosyalar hiyerarik olarak gsterilecektir. Bir zme yeni proje eklemek iin ilgili zm sa tklayn Add > Add New Project... yolunu izleyin. Alan pencerede projenin dilini ve tipini sein ve ismini girin. Dili C# ve tipi ktphane seelim. Yeni projenize Kutuphane ismini verin ve "leri" dmesine tklayn. Alan "Proje zellikleri" penceresinde hibir eyi semeden "Tamam" dmesine tklayn. imdi zmmzde iki proje var: bir konsol projesi ve bir ktphane. Kutuphane projemizdeki asl dosya MyClass.cs'dir ve ktphanemizdeki kodlar ierir. Bu dosyay zm kutusundan an. eriinin yle olmas gerekiyor:

using System; namespace Kutuphane { public class MyClass { public MyClass () { } } }


Bir zm birden fazla altrlabilir dosya ierebilir. altr > altr yolunu izlediimizde balang projesi altrlr. Balang projesini, zm kutusundaki ilgili projeyi sa tklayp "Set As Startup Project"i seerek belirtebilirsiniz. Bu ekilde tek bir projeyi balang projesi olarak belirtebiliriz. Birden fazla projeyi balang projesi olarak belirtmek iin ilgili zme sa tklayn ve "Seenekler"i tklayn. Alan pencereden altr > Startup Project yolunu izleyin. Pencerenin sa ksmnda bir veya birden fazla balang projesi belirtebilirsiniz. Ana pencerede altr > altr yolunu izlediimizde projeler burada belirttiimiz srada derlenip altrlacaktr. NOT: Grdnz gibi her bir projenin asl dosyas varsaylan durumda projenin ismiyle ayn olan bir isim alan ieriyor ve snflar bu isim alannn iine yazlyor.

[dzenle]zmdeki

ktphane projemizi altrlabilir dosyamzla

ilikilendirme
Ktphane, altrlabilir dosyamzla ayn zmde olsa bile ktphanedeki snflar altrlabilir dosyamzda kullanmak iin ktphaneyi altrlabilir dosyamzla ilikilendirmeliyiz. Bunun iin zm kutusundaki ilgili projeyi (konsol projemizi) yanndaki oku kullanarak geniletin. Ortaya kan "Kaynaklar" gesini sa tklayn ve "Edit References..." tklayn. Alan pencerede "Projeler" sekmesine gelin. Oluturduumuz ktphanenin burada gzkmesi gerekiyor. Ktphaneyi seip "Tamam" dmesine tklayn. imdi ktphanemizi altrlabilir dosyamzla ilikilendirdik. Ancak yine de emin olmak iin altrlabilir dosyamzn kaynak kodunun (Main.cs) using bildiriml erine using ekleyin ve Main() metodunun iini aadaki satrlarla deitirin:

Kutuphane; satrn

MyClass mc=new MyClass(); Console.WriteLine(mc);


imdi "na Et" mensnden "Build Cozum"u tklayn. Bu sayede Cozum zmndeki btn projeleri derledik. imdi altr mensnden altr' tklayn. Balang projemiz altrlacaktr ve ekrana Kutuphane.MyClass yazlacaktr. NOT: Eer istersek bir zm komut isteminden de ina (build) edebiliriz. Bunun iin sln dosyasnn olduu klasre komut isteminde gein ve u komutu verin:

mdtool build --f --buildfile:Cozum.sln

Bu yntemi baz kk iler iin MonoDevelop ile uramak istemediimizde kullanabiliriz. Bir projenin altrlabilir dosyas ilgili proje klasrnn bin klasrndeki Debug klasrnde proje ismiyle ve exe veya dll uzantsyla oluacaktr. stediimiz exe dosyasn mono komutuyla altrabiliriz.

[dzenle]MonoDevelop

ile grsel arayz olan programlar gelitirme

MonoDevelop, Visual Studio'nun destekledii srkle-brak ile grsel arayz oluturmay destekler. imdi MonoDevelop ile grsel arayz olan bir program oluturacaz. Programda iki TextBox, bir buton ve bir label olacak. Butona basldnda TextBox'lara girilen saylarn toplam label'a yazlacak. Programn basit olduunu dnebilirsiniz. Ancak zaten bizim burada amacmz sadece Mono'da grsel arayz olan programlarn nasl gelitirileceini anlatmak. O yzden program sade tutuyoruz. imdi balayalm.

MonoDevelop'u an. Dosya > Yeni > zm yolunu izleyerek yeni bir zm oluturun. zmn ve projenin her ikisinin de ismi Gorsel olsun. Zaten zmmzde sadece bir proje olacak. Dili C# ve proje tipini "Gtk# 2.0 Projesi" sein (sizde srm farkl olabilir). "ileri" dmesine tklayn. "Proje zellikleri" penceresinde hibir eyi semeyerek "Tamam" dmesine basn.

zm kutusundaki projenin altndaki "Kaynaklar" dmn geniletin. Buradaki ktphanelerden bazlar krmz renkte ise MonoDevelop bu ktphaneleri dzgn ilikilendirememi demektir. Bu durumda paket yneticisinden gtk-sharp-devel paketini kurup MonoDevelop'u yeniden balatn. i garantiye almak istiyorsanz yeni zm oluturabilirsiniz.

imdi MonoDevelop gerekli dosyalar oluturdu. u an programmz ii bo olan tek bir formdan olumakta. Bu formu grmek iin altr mensnden altr' sein. Ekrana bo bir form gelecektir. Formun sa st kesindeki arp iaretini tklayarak koda geri dnn.

imdi bo forma birtakm kontroller ekleyeceiz. nce zm kutusundan MainWindow.cs'ye ift tklayarak bu dosyann ieriinin yeni sekme olarak kod paneline (ortadaki panel) gelmesini salayn. Bu dosya kod paneline geldiinde kod panelinin en altnda "Kaynak kodu" ve "Tasarmc" olmak zere iki sekme gelecektir. Ayrca sa paneldeki "Ara ubuu" sekmesinin zerine farenizin iaretisini getirerek forma ekleyebileceiniz kontrolleri grebilirsiniz. Arayz grsel olarak tasarlamak iin kod panelinin en altndaki "Tasarmc" sekmesine tklayn.

Formun bal varsaylan durumda MainWindow'dur. Bunu deitirmek iin ncelikle formu semeliyiz. Formu semek iin ya forma tklayn ya formun hemen stndeki alr kutudan "MainWindow"u sein ya da sa paneldeki "Document Outline" sekmesindeki "MainWindow"a tklayn. "Document Outline" sekmesi formumuzu ve forma getirdiimiz btn kontrolleri hiyerarik olarak gsterecektir. Formumuzun ismi "MainWindow"dur. Formu aktif hle getirdikten sonra imdi fare iaretiniz ile sa paneldeki "znitelikler" sekmesine gelin. Buradaki "Window Properties" dmndeki "Title" girdisinin sanda "MainWindow" deeri olacaktr. Bu deere tklayn. "MainWindow" yazs deitirilebilir hle gelecektir. "MainWindow" yazsn istediiniz bir yazyla deitirin. rnein bu rnek iin "Toplama ilemi" yapalm. Ancak unu unutmayn ki burada yalnzca formumuzun balk ubuundaki yazy deitirdik. Formumuzun ismi halen MainWindow.

Formun sol st kesindeki simgesini de deitirebiliriz. Bunun iin yine "znitelikler" panelindeki "Window Properties" dmndeki "Icon" girdisinin sandaki bo kutuya tklayn. Bu kutunun hemen sana zerinde ... yazan bir buton gelecektir. Butona tklayn, ekrana eitli simgelerin listelendii bir pencere gelecektir. Bu pencereden istediiniz bir simgeyi seip "Tamam" dmesine tklayn. imdi formumuzun sol st kesinde gzkecek simgeyi belirledik.

Formumuzun genel zelliklerini belirledikten sonra imdi forma kontrolleri getirmeye balayalm. Genel kaide gerei her kontrol bir kapsayc iinde olmaldr. Kapsayclar kontrollerin formda nereye koyulacan belirlemek iin kullanlr. Bir kapsayc iine sadece bir tane kontrol koyulabilir. Formun kendisi de aslnda bir kapsaycdr. Ancak bir butonu direkt forma srklersek form sadece bir butondan ibaret olur. Forma tam drt tane kontrol getirmemiz gerekiyor. O halde kapsayc kullanmak zorundayz. eitli kapsayc trleri vardr, hepsinin deiik kullanm alanlar vardr. Hangi kapsaycy getireceimize forma kontrolleri nasl yerletireceimizi belirledikten sonra karar veririz. Yani bu durumda ncelikle formun iindeki kontrollerin formda nasl bir yerleime sahip olacan belirleyelim. Bu rnek iin ben yle bir yerleime karar verdim: form yatay hcreden olusun. En st hcre kendi iinde iki alt hcreye ayrlsn. En stteki hcrelerin her birine TextBox'lar, ortadaki hcreye buton, en alttaki hcreye ise label gelsin. Yani son tahlilde yerleim yle olacak:

st sol hcre (1. TextBox) st sa hcre (2. TextBox) Orta hcre (buton) Alt hcre (label)

Bu yerleimi elde etmek iin "Ara ubuu" sekmesinden VBox kapsaycsn forma srkleyip brakn. VBox genel amal bir kapsaycdr ve formu yatayda alt kapsaycya ayrr. Bu kapsayclarn her birinin iine normal kontroller getirilebilir. Eer alt kapsayc says istediimizden fazla ise herhangi bir alt kapsaycy sa tklayp "Sil" diyerek formdaki alt kapsayc saysn bir azaltabilirsiniz. Eer kapsayc says istediinizden az ise herhangi bir alt kapsaycnn iine yeni bir kapsayc srkleyebilirsiniz. imdilik kapsayc says bizim iin uygun ve herhangi bir ekstra ilem yapmyoruz.

imdi en st kapsaycnn iine HBox kapsaycsn srkleyip brakn. VBox genel amal bir kapsaycdr ve formu (veya iine koyulduu kapsaycy) dikeyde alt kapsaycya ayrr. En st hcrede deil, iki alt hcre istiyoruz, o hlde en st hcreye getirdiiniz kapsayclardan birini silin.

imdi kapsayclarn iine asl kontrolleri getireceiz. "Ara ubuu" sekmesinin "Bileenler" alt dmnden "Entry" kontroln st sol kapsaycnn iine, yeni bir Entry kontroln st sa kapsaycnn iine, "Button" kontroln orta kapsaycnn iine, "Label" kontroln alt kapsaycnn iine srkleyip brakn. Daha sonra Entry'lerin ve Label'n ismini kod yazarken kullanacaz. Herhangi bir kontroln ismini grmek iin kontrol aktif hle getirin ve "znitelikler" sekmesindeki "Name" girdisinin deerine bakn. Ayrca buradan kontroln ismini de deitirebiliriz.

NEML NOT: Birok form kontrolnn varsaylan ebatlar vardr. Bu tr bir durumda kapsaycnn ebatlar, iindeki kontrole gre deiir. Yani kontrol kapsaycya gre deil, kapsayc kontrole gre boyutlandrlr. Bu tr bir durumda kapsaycnn boyutlarnn deimemesini istiyorsak ilgili kapsaycy aktif hle getirip "znitelikler" sekmesinden "Box Properties" alt dmnden "Homogeneous" onay kutusunu iaretli hle getiririz. "Homogeneous" zellii ilgili kapsaycnn iindeki btn alt kapsayclarn eit ebatlarda olmasn salar.

Kontrolleri forma getirdik. imdi bu kontrollere kod balama zaman. Bir kontrole kod balamak iin ilgili kontrol aktif hle getirin, "znitelikler" sekmesinin "Sinyaller" alt sekmesini an. Oradaki herhangi bir sinyalin sandaki bo alana tklayp bir ey yazp enter'a basn. Bu rneimizde sadece butona kod balayacaz. O hlde butonu aktif hle getirin, "zniteliker" sekmesinin "Sinyaller" alt sekmesini an. Butonun tklanma sinyaline kod balayacamz iin buradaki "Button Signals" alt dmndeki "Clicked" girdisinin sandaki bo alana tklayn. Bu alan deitirilebilir hle gelecektir. Buraya "OnClick" yazn. Ancak "OnClick" yazmanz art deildir, siz baka bir ey de yazabilirsiniz. Enter'a basn. Enter'a basar basmaz MainWindow.cs dosyasnn iine bu yazdnz isimli bir metot eklenecek ve imle MainWindow.cs dosyasndaki bu metodun iine konumlanacaktr. u an bu metodun ii bo. Buton tklandnda alacak olan kodlar bu metodun iine yazacaz. Bu metodun iine u kodlar yazn:

//Kontrollerin varsaylan isimlerini deitirmediinizi varsayyorum. int a=Convert.ToInt32(entry1.Text); int b=Convert.ToInt32(entry2.Text); label1.Text=(a+b).ToString();
Bu kodda entry'lerin Text'lerini int'e evirdik. nk Entry snfnn statik olmayan Text zelliinin geri dn tipi string'tir. Benzer ekilde Label snfnn statik olmayan Text zelliinin geri dn tipi de string'tir. Bu yzden son satrda toplama ilemini yaptktan sonra sonucu ToString() metoduyla string'e evirip atama yaptk. Gerek Entry snfnn gerekse Label snfnn Text zellikleri yazlr -okunur durumdadr. Yani programda herhangi bir anda bu kontrollerin zerindeki yazy okuyabileceiniz gibi bu kontrollerin zerindeki yazy deitirilebilirsiniz de. Sonucu grmek iin "altr" mensnden "altr" tklayn. Bu rnekte MonoDevelop'taki birka kontrol ksaca tanttk. imdi MonoDevelop'taki btn kontrolleri srayla ve ayrntl bir ekilde tantma zaman.

[dzenle]MonoDevelop'taki btn kontroller

Alignment kapsaycs
ocuunun (alignment kapsaycsnn iindeki kontrol) ebatlarn ve yaslanmn ana kapsaycya (alignment kapsaycsnn iinde bulunduu kapsayc) gre belirtmek iin kullanlr. Yani alignment kapsaycs daima baka bir kapsaycnn iinde bulunmaldr. Alignment kapsaycsnn zellikleri unlardr ("znitelikler" sekmesinin "Alignment Properties" dmnden eriilir):

Xscale: Kontroln genilii belirtilir. [0,1] aralnda bir say olmaldr. 0 kontroln orijinal geniliini belirtir. 1 ise kapsaycnn geniliini belirtir. Yani Xscale seenei 1 yaplrsa kontrol, kapsaycya yatayda yaylm olur.

Yscale: Kontroln yksekliini belirtir. [0,1] aralnda bir say olmaldr. 0 kontroln orijinal yksekliini belirtir. 1 ise kapsaycnn yksekliini belirtir. Yani Yscale seenei 1 yaplrsa kontrol, kapsaycya dikeyde yaylm olur.

Xalign: Kontroln kapsayc iinde yatay yaslanmn belirtir. [0,1] aralnda bir say olmaldr. 0 kontroln kapsayc iinde sola yaslanacan, 1 ise saa yaslanacan belirtir.

Yalign: Kontroln kapsayc iinde dikey yaslanmn belirtir. [0,1] aralnda bir say olmaldr. 0 kontroln kapsayc iinde ste yaslanacan, 1 ise alta yaslanacan belirtir.

NOT: Xalign zellii, Xscale zellii 1 yaplmsa etkisizdir. Benzer ekilde Yalign zellii de Yscale zellii 1 yaplmsa etkisidir. nk bu tr durumlarda kontrol kapsaycya genileyecei iin bir yaslanmdan sz edilemez.

LeftPadding: Kontroln kapsaycya gre sol snrdan ne kadar ieride balayacan belirtir (piksel). Eer kontrol kapsayc iinde sola yaslanmsa anlamldr.

TopPadding: Kontroln kapsaycya gre st snrdan ne kadar ieride balayacan belirtir (piksel). Eer kontrol kapsayc iinde ste yaslanmsa anlamldr.

RightPadding: Kontroln kapsaycya gre sa snrdan ne kadar ieride balayacan belirtir (piksel). Eer kontrol kapsayc iinde saa yaslanmsa anlamldr.

BottomPadding: Kontroln kapsaycya gre alt snrdan ne kadar ieride balayacan belirtir (piksel). Eer kontrol kapsayc iinde alta yaslanmsa anlamldr.

BorderWidth: Kapsaycnn erevesinin kalnln belirtir (piksel). ereve saydamdr. rnein erevenin deerini 5 yaparsak yukardaki btn padding deerlerini 5 ayarlam gibi oluru z.

Expander kapsaycs
ocuklarnn kullanc davranna gre gizlenip gzkebilmesini salar. Kullanlmas durumunda forma bir ok iareti ve bir label ekler. Bu ok iareti tklandnda ocuklar gzkr hle gelir. Ok tekrar tklandnda ocuklar tekrar gizlenir. zellikleri unlardr ("znitelikler" sekmesinin "Expander Properties" dmnden eriilir):

Expanded: lgili Expander'n ak m (ocuklar gzkyor mu) kapal m (ocuklar gizli mi) olduunu belirtir. Yazlr-okunurdur, yani programda istediimiz zaman bir expander'n alp kapanmasn salayabiliriz. Geri dn tipi bool'dur.

Spacing: ocuklar arasndaki mesafeyi belirtir (piksel). BorderWidth: erevesinin kalnln belirtir (piksel).

Fixed kapsaycs
ocuunun belirli bir ebatta ve belirli bir koordinatta olmasn salar. Otomatik ebatlandrma/konumlandrma yaplmaz. Ancak bunlar olumlu zellikler gibi grnmesine ramen aslnda olumsuz zellikledir. nk programn arayznde bizim kontrolmzde olmayan birok ey vardr. rnein kontroln zerindeki metin bizim beklediimizden daha byk fontta ise bu metin tam gzkmeyecektir. Ayrca eer programmzn arayznn baka bir dile evrilebilmesini istiyorsak bu kapsaycy kullanmamalyz. nk farkl dillerdeki ibareler farkl uzunlukta olabilir, bu durumda ilgili ibare kontroln dna kmak isteyecektir, bu durumda kontrol bytlemeyecei iin ibare kesilir. Fixed kapsaycsnn iki nemli metodu vardr:

void Move(Widget kontrol,int x,int y): Kapsaycnn iindeki bir kontrol baka bir koordinata tar.

void Put(Widget kontrol,int x,int y): Kapsaycnn belirli bir koordinata bir kontrol koyar.

Ayrca bir kontroln Fixed kapsaycs iindeki koordinat ilgili kontroln (kapsayc deil) "znitelikler" sekmesinin "Fixed Child Layout" dmndeki X ve Y zellikleriyle, ilgili kontroln ebatlar ise yine ilgili kontroln "znitelikler" sekmesinin "Common Widget Properties" dmndeki WidthRequest ve HeightRequest zellikleriyle belirlenir. Fixed kapsaycs iine birden fazla kont rol koyulabilir.

Frame kapsaycs
ocuklarnn etrafna bir kutu izer. Kontrolleri form iinde gruplandrmak iin kullanlr. Forma otomatik olarak bir label kontrol ve bir Alignment kapsaycs getirir. Frame kapsaycs iine koyulan kontrol otomatik olarak Alignment kapsaycsnn iine konulur. Frame kapsaycsnn balnn yaslanm kapsaycnn LabelXalign ve LabelYalign zellikleriyle belirlenir. ShadowType seenei ile kutunun etrafn izen erevenin tipi belirlenir, varsaylan durumda ereve saydamdr.

HBox kapsaycs
Formu dikeyde alt kapsaycya bler.

HButtonBox kapsaycs
Forma dikeyde sral butonlar getirmek iin kullanlr. HButtonBox kapsaycsnn zelliklerini deitirmek iin HButtonBox snfnn annesi olan ButtonBox snfnn metotlar kullanlr. ButtonBox snfnn nemli metotlar unlardr:

You might also like