You are on page 1of 80

DAHA FAZLA KAYNAK N

www.eemdersnotlari.com

alar GL
1

YeniC#ProjesiAma ________________________________________________________ 4
C#ConsolleAppilicationProjesiAma___________________________________________4
Console.WriteKomutuveKullanm_________________________________________________ 4
Console.WriteLineKomutuveKullanm _____________________________________________ 5
Console.ReadLineKomutuveKullanm______________________________________________ 7

TEMELVERTPLER _________________________________________________________8
DeerTipleri(Valuetype)_________________________________________________________ 9
ReferansTipleri(ReferenceType)___________________________________________________ 9

TRDNMLER________________________________________________________10
BilinsizTrDnm__________________________________________________________ 10
BilinliTrDnm___________________________________________________________ 11

OPERATRLER_____________________________________________________________13
MatematikselOperatrler________________________________________________________ 14
+veOperatrleri ____________________________________________________________________14
*ve/Operatrleri______________________________________________________________________15
%Operatr _________________________________________________________________________15
++(Arttrma)ve(Eksiltme)Operatrleri___________________________________________________15

KarlatrmaOperatrleri________________________________________________________ 16
asOperatr_________________________________________________________________________17
isOperatr__________________________________________________________________________17
MantksalOperatrler___________________________________________________________ 18
BitselOperatrler_______________________________________________________________ 18
BitselKaydrmaOperatrleri_____________________________________________________________19
AtamavelemliAtamaOperatrleri_______________________________________________ 19

AKIKONTROLMEKANZMALARI _____________________________________________22
Koulfadeleri__________________________________________________________________ 22
ifelse_______________________________________________________________________________22
switch_______________________________________________________________________________24
DngYaplar _________________________________________________________________ 27
forDngs__________________________________________________________________________27
whileDngs________________________________________________________________________32
dowhileDngs _____________________________________________________________________33
foreachDngs______________________________________________________________________33
AtlamaDeyimleri_______________________________________________________________ 34
breakAnahtarSzc_________________________________________________________________34
continueanahtarSzc_______________________________________________________________34
gotoAnahtarSzc__________________________________________________________________34

DZLER __________________________________________________________________36
ArraysTekBoyutluDiziler ______________________________________________________ 36
ArrayskiBoyutluMatrisDiziler__________________________________________________ 39

METOTLARVEFONKSYONLAR _______________________________________________44

MetotOluturmaveKullanm ____________________________________________________ 45
Metotlarlalgilinemlizellikler__________________________________________________ 47
MetotParametresiOlarakDiziler__________________________________________________ 49
DiziveDeikenParametrelerArasndakiFark_______________________________________ 50
MetotlarnArYklenmesi ______________________________________________________ 52
DeikenSaydaparametreAlanMetotlar __________________________________________ 54
KendiniaranMetotlar ________________________________________________________ 57
MainMetodu__________________________________________________________________ 58
MainMetodununDeerTutmas __________________________________________________ 58
MainMetodununParametreAlmas _______________________________________________ 58

SINIFLAR _________________________________________________________________60
SnfOluturmak________________________________________________________________ 60
AynSnfTrndenBirdenFazlaNesneOluturma ___________________________________ 62
ThisAnahtarSzc____________________________________________________________ 68
getvesetAnahtarSzc_______________________________________________________ 71
YapcMetotlar_________________________________________________________________ 77

BLM1
Yeni C# Projesi Ama

C# Consolle Appilication Projesi Ama

Console.Write Komutu ve Kullanm

Write komutu consol ekranna bir yaz yazdrmak veya kullancdan bilgi istemek amacyla
kullanlr. Write komutundan sonra yaz yazma ibresi yazdrdnz mesajn yannda yanp
sner yani kullancdan alacanz mesaj sizin mesajnzn yanna yazlr.

ilkuygulama.cs
usingSystem;
usingSystem.Collections.Generic;
usingSystem.Linq;
usingSystem.Text;
namespaceilk_uygulama
{
classProgram
{
staticvoidMain(string[]args)
{
Console.Write("ilkUygulama");
Console.ReadLine();
}
}
}

Ekrankts

Console.WriteLine Komutu ve Kullanm


Write ile ayn grevde kullanlr fakat kullancnn bilgi girecei yer sizin mesajnzn alt olur
yani imle altta yanp sner.

ilkuygulama2.cs
usingSystem;
usingSystem.Collections.Generic;
usingSystem.Linq;
usingSystem.Text;
namespaceilk_uygulama2
{
classProgram
{
staticvoidMain(string[]args)
{
Console.WriteLine("ilkUygulama");
Console.ReadLine();
}
}
}

Ekrankts

Console.ReadLine Komutu ve Kullanm


Console ortamnda klavyeden bilgi okutmak amacyla kullanlan bir komuttur. Okutulan
bilgiler her zaman string tipindedir. Dolaysyla say ya da baka tipte kullanm yaplmak
istendiinde tip dnm yaplmas gerekir.

usingSystem;
usingSystem.Collections.Generic;
usingSystem.Linq;
usingSystem.Text;
namespaceilk_uygulama3
{
classProgram
{
staticvoidMain(string[]args)
{
Console.WriteLine("Birsayigiriniz");
inta=Convert.ToInt32(Console.ReadLine());
Console.WriteLine(a);
Console.ReadLine();
}
}
}

Burada girilen say a deikenine atanp integer (saysal) olarak dntrlp ekrana yazdrlyor.
Ekran kts

BLM2
TEMEL VER TPLER
C# da iki eit veri tipi vardr:

Deer Tipleri (Value type)


Referans Tipleri(Reference Type)

Deikenler bellekte bulunan verilerdir. Bir deikeni kullandmz zaman o deikenin


bellekte bulundu yerdeki bilgiyi kullanrz. Deer tipleri veriyi direk olarak bellek
blgesinden alrken referans tipleri baka bir nesneye referans gsterirler. Yani referans tipleri
iinde veri deil adres bilgisi tutarlar. Veri tipleri stack dediimiz bellek blgesinde tutulurlar,
referans tipleri ise heap bellek blgesinde saklanrlar. int, double, float gibi veri tipleri deer
tiplerine rnek gsterilebilir. Herhangi bir snf tr ise referans tipine rnek gsterilebilir.
Deer tipleri birbirine eitlenirken deikenin barndrd deer bir dier deikene
kopyalanr. Bylece iki farkl bamsz deiken oluur. Referans tipleri ise eitleme srasnda
deikenlerin tadklar veri deil heap blgesinde iaret ettikleri adres kopyalanr. Bylece
eer iki referans deikeni birbirine eitledi isek ve daha sonra bunlardan birinde bulunan
veriyi deitirdi ise otomatik olarak dier referans deikeninin deeri de deiir. nk
adreste bulunan veri deiince bu adresi iaret eden iki deikende yeni veri bilgisine ular.
C# da tanmlanan veri tipleri ve bunlarn CTS deki karlklarn tablo halinde aada
bulabilirsiniz. C# da toplam 15 veri tipi vardr bunlardan 13 deer tipindedir, 2 si ise
referans tipindedir.

Deer Tipleri (Value type)

Deer
Tip Ad

Aralk Deerleri

sbyte

-128 ile 127

byte
short
ushort
int

Aklama

System Tipi

aretli 8 bit tam say

System.SByte

0 ile 255

aretsiz 8 bit tam say

System.Byte

-32.768 ile 32.767

aretli 16 bit tam say

System.Int16

aretsiz 16 bit tam say

System.UInt

aretli 32 bit tam say

System.Int32

aretsiz 32 bit tam say

System.UInt32

aretli 64 bit tam say

System.Int64

aretsiz 64 bit tam say

System.UInt64

0 ile 65.535
-2.147.483.648 ile 2.148.483.647

uint

0 ile 4.294.967.295

long

-9.223.372.036.854.775.808 ile
9.223.372.036.854.775.807

ulong

0 ile 18.446.744.073.709.551.615

float

3.4x10 ile 3.4x10

32 bit ondalkl say

System.Single

double

5.10 ile 1.7x10

64 bit ondalkl say

System.Double

decimal

1.5x10 ile 7.9x10

128 bit iaretli ondalkl say

System.Decimal

Doru Yada Yanl

System.Bool

16 bit Unicode tek karakter

System.Char

bool

True ya da False

char

16 bit Unicode tek karakter

Referans Tipleri(Reference Type)

Deer Tip Ad

Aklama

System Tipi

object

Btn veri trlerinin tredii eleman

System.Object

string

Unicode karakterlerinden oluan string

System.String

BLM3
TR DNMLER

Modern programlamada birok kez deikenlerde tr dnmne ihtiya duyulur.


rnein string trndeki 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.

Bilinsiz Tr Dnm
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.
usingSystem;
classTurDonusumu
{
staticvoidMain()
{
bytea=5;
shortb=10;
sbytec=30;
intd=a+b+c;
stringe="deneme";
charf='k';
objectg=e+f+d;
longh=d;
floati=h;
doublej=i;
doublek=12.5f;
Console.WriteLine(j+k);
Console.ReadLine();
}
}

Sonu : 57,5

10

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.
usingSystem;
classTurDonusumu
{
staticvoidMain()
{
chara='h';
intb=a;
Console.WriteLine(b);
Console.ReadLine();
}
}

Sonu : 104

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:
usingSystem;
classTurDonusumu
{
staticvoidMain()
{
bytea=5,b=10;
shortd=2,e=9;
bytef=a+b;
shortg=d+e;
Console.WriteLine(f+g);
Console.ReadLine();
}
}

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. Bilinsiz tr dnm
yaplabilecekler tablosu aada verilmitir:
Kaynak

Hedef

sbyte

short, int, float, long, double, decimal

byte

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

short

int, long, float, double, decimal

ushort

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

int

long, float, double, decimal

uint

long, ulong, float, double, decimal

long, ulong float, double, decimal


char

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

float

double


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,

11

nk ayn eyi bilinsiz tr dnmyle de yapabilirdik. Aadaki programda bilinli tr


dnm gerekletirilmektedir.
usingSystem;
classTurDonusumu
{
staticvoidMain()
{
inta=5;
byteb=(byte)a;
Console.WriteLine(b);
Console.ReadLine();
}
}

Sonu: 5
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.
usingSystem;
classTurDonusumu
{
staticvoidMain()
{
byteb=(byte)12.5f;
Console.WriteLine(b);
Console.ReadLine();
}
}

Sonu : 12

12

BLM4
OPERATRLER

Programlama dillerinde tek balarna herhangi bir anlam olmayan ancak programn
ileyiine katkda bulunan karakter ya da karakter topluluklarna operatr denir.
rnein a+b ifadesinde + iareti bir operatrdr. Operatrlerin etki ettikleri sabit ya da
deikenlere ise operand denir. rnein a+b ifadesinde a ve b birer operanddr. C#'ta
operatrlerin 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.
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.
Birinci ncelikliler

x++, x--

Tek operand alan operatrler

+, -, !, ~, ++x, --x, (Tr)x

arpma ve blme

*, /, %

Toplama ve karma

+, -

Kaydrma operatrleri

<<, >>

likisel ve tr testi operatrleri

<, >, <=, >=, is, as

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:
usingSystem;
classOperatorler
{

13

staticvoidMain()
{
inti=3*5/7;
Console.Write(i);
Console.ReadLine();
}
}

Bu programda ekrana 2 yazlr. Ancak;


usingSystem;
classOperatorler
{
staticvoidMain()
{
inti=3*(5/7);
Console.Write(i);
Console.ReadLine();
}
}

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 oluursa - ondalk ksm atlr. Ancak program aadaki gibi deitirirsek sonu
deimeyecektir.
usingSystem;
classOperatorler
{
staticvoidMain()
{
inti=(int)(3f*(5f/7f));
Console.Write(i);
Console.ReadLine();
}
}

Sonu: 2

Burada sabitleri floata dntrdk, 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.

Matematiksel Operatrler
+ ve Operatrleri

Toplama ve karma ilemlerini yapan operatrlerdir. + ve operatrlerinin opreandlar


herhangi bir trden olabilir. rnein;
int i = 50 + 40;
float f = 12.56f + 11.4f;

14

*ve/ Operatrleri

arpma ve blme ilemlerini yapan operatrlerdir. * ve / operatrlerinin operandlar herhangi


bir trden olabilir. rnein;
int i = 50 + 40;
float f = 50f + 40f;
Console.WritLine(i);
Console.WritLine(f);

% Operatr

% operatr iki operand almaktadr. Sonu birinci operandn ikinci operanda blmnden
elde edilen kalandr. Btn numerik trler iin kullanlabilir. rnein;
usingSystem;
classOperatorler
{
staticvoidMain()
{
inti=5%2;
Console.Write(i);
Console.ReadLine();
}
}

Sonu: 1
++(Arttrma) ve (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;
usingSystem;
classOperatorler
{
staticvoidMain()
{
inta=5;
inti=++a;
Console.Write(i+""+a);
Console.ReadLine();
}
}

Sonu : 6 6
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.

usingSystem;
classOperatorler

15

{
staticvoidMain()
{
inta=5;
inti=a++;
Console.Write(i+""+a);
Console.ReadLine();
}
}

Sonu : 5 6

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. imdi bu ++ ve -- operatrlerini
bir rnekte hep beraber grelim;
usingSystem;
classOperatorler
{
staticvoidMain()
{
inta=5;
inti=a++;
intb=i;
intc=10;
intd=c;
Console.Write("{0}\n{1}\n{2}\n{3}",a,i,b,d);
Console.ReadLine();
}
}
Sonu:6

Karlatrma Operatrleri
Karlatrma operatrleri iki 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:
usingSystem;
classOperatorler
{
staticvoidMain()
{
boola=4<6;
boolb=6>5;
boolc=7<=7;
boold=9>=12;
boole=10==12;
boolf=1!=8;
Console.Write("{0}\n{1}\n{2}\n{3}\n{4}\n{5}",a,b,c,d,e,f);
Console.ReadLine();
}
}

Bu program ekrana alt alta True, True, True, False, False ve True yazacaktr.

16

as Operatr

Tm deiken trlerinden objecte ve string deerli olmak artyla objectten stringe dnm
yapar.
rnek:
usingSystem;
classOperatorler
{
staticvoidMain()
{
objecti="50";
strings=iasstring;
Console.Write(s);
Console.ReadLine();
}
}
veya
usingSystem;
classOperatorler
{
staticvoidMain()
{
inti=50;
objects=iasobject;
Console.Write(s);
Console.ReadLine();
}
}

kisinde de ekrana 50 yazacaktr.

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:
usingSystem;
classOperatorler
{
staticvoidMain()
{
inti=50;
boolb1=iisint;
boolb2=iisdouble;
boolb3=12isbyte;
boolb4='c'isstring;
boolb5=12f+7isint;
Console.Write("{0}\n{1}\n{2}\n{3}\n{4}",b1,b2,b3,b4,b5);
Console.ReadLine();
}
}

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.

17

Mantksal Operatrler
Bu operatrler true veya false sabit ya da deikenleri mantksal ve, veya, deil ilemine
sokarlar. Bunlar && (ve), || (veya) ve ! (deil) operatrleridir.
rnek:
usingSystem;
classOperatorler
{
staticvoidMain()
{
boolb1=35>10&&10==50;//false
boolb2=35>10&&10!=50;//true
boolb3=5isint||12*3==200;//true
boolb4=5<4||45/5==9;//true
boolb5=!(5<4);//true
Console.WriteLine(b1+""+b2+""+b3+""+b4+""+b5);
Console.ReadLine();
}
}

Sonu : False True True True True


Not: ! operatrnden sonra bir deiken ya da sabit yerine bir ifade geliyorsa ifadeyi
parantez iine almak zorundayz.

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 birbiriyle 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:

usingSystem;
classOperatorler
{
staticvoidMain()
{
bytea=5&3;//00000101&00000011>sonu00000001kar.Yani1kar.
byteb=5|3;//00000101|00000011>sonu00000111kar.Yani7kar.
bytec=5^3;//00000101^00000011>sonu00000110kar.Yani6kar.
byted=5;
bytee=(byte)~d;//00000101'indeili>sonu11111010kar.Yani250kar.
bytef=(byte)~(a+b);//00001000'ndeili>sonu11110111kar.Yani247
kar.
byteg=(byte)~(a+7);//00001000'ndeili>sonu11110111kar.Yani247
kar.
Console.Write(a+""+b+""+c+""+e+""+f+""+g);
Console.ReadLine();
}
}

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

18

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:
usingSystem;
classOperatorler
{
staticvoidMain()
{
inta=0xff;
intb=0Xff;
Console.Write(a+""+b);
Console.ReadLine();
}
}

Bu program ff saysnn onluk dzendeki karl olan 255 saysn ekrana iki kere yazacaktr.
Bitsel Kaydrma Operatrleri

Bu operatrler (<< ve >>) saylarn bitlerini istenildii kadar kaydrmak iin kullanlr. <<
saylar sola kaydrrken, >> saa kaydrr. rnek:
usingSystem;
classOperatorler
{
staticvoidMain()
{
byteb=100;//01100100
bytec=(byte)(b<<1);//bbirkezsolakaydrldve11001000oldu.(200oldu.)
byted=50;//00110010
bytee=(byte)(d>>2);//dikikezsaakaydrldve00001100oldu.(12oldu.)
Console.Write(c+""+e);
Console.ReadLine();
}
}

NOT:<< ve >> operatrlerinin operandlar deiken olabilecei gibi sabit ya da ifade de


olabilir. Operand(lar) byte, sbyte, short, ushortsa sonu intleir.

Atama ve lemli 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:

usingSystem;
classOperatorler
{
staticvoidMain()
{

19

byteb=7,a=1,c;
c=a=b;
Console.Write(a+""+b+""+c);
Console.ReadLine();
}
}

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:
usingSystem;
classOperatorler
{
staticvoidMain()
{
byteb=7,a=1,c;
(c=a)=b;
Console.Write(a+""+b+""+c);
Console.ReadLine();
}
}

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.

20

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.

21

BLM4
AKI KONTROL MEKANZMALARI

Koulfadeleri
ifDeyimi
switchDeyimi
DngYaplar
forDngs
whileDngs
dowhileDngs
foreachDngs
AtlamaDeyimleri
breakAnahtarSzc
continueAnahtarSzc
gotoAnahtarSzc

Koul fadeleri
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:
usingSystem;
classAkisKontrolMekanizmalari

22

{
staticvoidMain()
{
inta=5,b=7;
if(a<b)
Console.Write("ab'denkk");
else
Console.Write("ab'denkkdeil");
Console.ReadLine();
}
}
Sonu:ab'denkk

rnek:
usingSystem;
classAkisKontrolMekanizmalari
{
staticvoidMain()
{
inta=5,b=7;
if(a<b)
{
Console.WriteLine("ab'denkk");
Console.Write(a);
}
else
{
Console.WriteLine("ab'denkkdeil");
Console.Write(b);

}
Console.ReadLine();
}
}

Sonu:ab'denkk5

if else yaplarnda else ksmnn bulunmas zorunlu deildir. Bu durumda sadece koul
salandnda bir eyler yaplacak, koul salanmadnda bir eyler yaplmayacaktr.
rnek:
usingSystem;
classAkisKontrolMekanizmalari
{
staticvoidMain()
{
inta=5,b=7;
if(a<b)
Console.WriteLine("ab'denkk");
Console.ReadLine();
}
}

if else bloklarnn aadaki gibi kullanm da mmkndr:

23

usingSystem;
classAkisKontrolMekanizmalari
{
staticvoidMain()
{
Console.Write("Cinsiyetinizigirin(e,k):");
charcins=Convert.ToChar(Console.ReadLine());
if(cins=='e')
Console.Write("Erkeksiniz");
elseif(cins=='k')
Console.Write("Kzsnz");
else
Console.Write("Ltfencinsiyetinizidorugiriniz!");
Console.ReadLine();
}
}

Bu program kullancdan cinsiyetini girmesi istemekte, eer kullancnn girdii harf e ise
ekrana Erkeksiniz yazmakta, eer girdii harf e deilse ise bu sefer kullancnn girdii
harfi k m 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 bloklar daha da uzatlabilir. Yani else if satrnn bir tane olmas zorunlu deildir.
Ancak tabii 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;

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

24

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:

usingSystem;
classAkisKontrolMekanizmalari
{
staticvoidMain()
{
inta=4;
switch(a)
{
case4:
Console.Write("deneme1");
break;
case4:
Console.Write("deneme2");
break;
case5:
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:

usingSystem;
classAkisKontrolMekanizmalari
{
staticvoidMain()
{
inta=4;
switch(a)
{
case4:
stringb=Console.ReadLine();
Console.Write(b);
break;
default:
Console.Write("deneme4");
break;
}
}
}

Ancak u program hata verir:


usingSystem;
classAkisKontrolMekanizmalari
{
staticvoidMain()
{

25

inta=4;
switch(a)
{
case4:
stringb=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:
usingSystem;
classAkisKontrolMekanizmalari
{
staticvoidMain()
{
inta=5;
switch(a)
{
case4:
stringb=Console.ReadLine();
Console.Write(b);
break;
case5:
Console.Write("imdicase4'egideceksiniz.");
gotocase4;
default:
Console.Write("deneme4");
break;
}
Console.ReadLine();
}
}

goto satr kullanlmsa break; satrnn kullanlmasna gerek yoktur.


Eer farkl case sabitlerinin ayn komutlar altrmasn istiyorsak yle bir program
yazlabilir:
usingSystem;
classAkisKontrolMekanizmalari
{
staticvoidMain()
{
inta=5;
switch(a)
{
case4:
case5:
stringb=Console.ReadLine();
Console.Write(b);
break;
default:
Console.Write("deneme4");
break;
}
}

26

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.

Dng Yaplar

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

27

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 yoksakendinden sonra gelen ilk satrdaki komuttan hemen sonraki satra klr. Dolaysyla
dngden klm olur.

rnek:

usingSystem;
classAkisKontrolMekanizmalari
{
staticvoidMain()
{
inttoplam=0;
for(inti=1;i<=3;i++)
toplam+=i;
Console.Write("toplam={0}",toplam);
Console.ReadLine();
}
}

Bu program 1'den 3'e kadar olan tam saylar (1 ve 3 dhil) toplayp toplam ekrana
yazacaktr.
Faktriyel rnei:
usingSystem;
classAkisKontrolMekanizmalari
{
staticvoidMain()
{
floats;
intsi,f;
boola=true;
for(;a;)
{
Console.Write("Ltfenfaktoriyelininalnmasnistediinizsayygirin:");
s=Convert.ToSingle(Console.ReadLine());
si=(int)s;
if(si!=s||s<1)
{
Console.WriteLine("Ltfenpozitiftamsaygirin.");
a=true;
}
else
{
a=false;
for(f=1;si>1;si)
f*=si;
Console.Write("Faktriyeli={0}",f);
}
Console.ReadLine();
}
}
}

28

Kurallar:

for dngsnn parantezleri iindeki "for(int i=0;i<5;i++)" iki ifade ve bir koulun
istenirse birtanesi, 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:

usingSystem;
classAkisKontrolMekanizmalari
{
staticvoidMain()
{
inta=0;
for(inti=0;i<1;i++)
a=5;
Console.Write(a);
}
}

Bu program ekrana 5 yazacaktr. Ancak;


usingSystem;
classAkisKontrolMekanizmalari
{
staticvoidMain()
{
inta;
for(inti=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.

29

RNEKLER:
rnek 1 :
Kullancnn ad ve bir say klavyeden girilerek, girilen say kadar ekrana kullancnn adn
yazan konsol programn yapnz.
usingSystem;
classfordongusu
{
staticvoidMain()
{
stringad;
intadet=0;
Console.Write("Adnzgiriniz:");
ad=Console.ReadLine();
Console.Write("Kakeretekrarlansn:");
adet=Convert.ToInt32(Console.ReadLine());
for(inti=0;i<adet;i++)
{
Console.WriteLine(ad);
}
Console.ReadLine();
}
}

rnek 2 :
2+5+8+11+14+17+20+23+26+29+32+35.+50 eklindeki matematiksel serinin toplamn
bulup, ekrana yazan konsol programn yapnz.
usingSystem;
classfordongusu
{
staticvoidMain()
{
inttoplam=0;
for(inti=2;i<=50;i+=3)
{
toplam+=i;
}
Console.Write("Toplam="+toplam);
Console.ReadLine();
}
}

rnek 3 :
Klavyeden 10 adet say girilerek, bu saylardan ift olanlarn toplamn bulup, ekrana yazan
konsol programn yapnz.
usingSystem;
classfordongusu
{
staticvoidMain()
{
intsayi=0,toplam=0;
for(inti=1;i<=10;i++)
{
Console.Write("{0}Sayygiriniz:",i);
sayi=Convert.ToInt32(Console.ReadLine());
if(sayi%2==0)
{
toplam+=sayi;
}

30

}
Console.Write("iftSaylarnToplam:"+toplam);
Console.ReadLine();
}
}

rnek 4 :
1 + 2 + 3 + 4 + 5 + . 10 eklindeki matematiksel serinin toplamn bulup ekrana
yazan konsol uygulamasn yapnz.
usingSystem;
classfordongusu
{
staticvoidMain()
{
inttoplam=0;
for(inti=1;i<=10;i++)
{
toplam+=i;
}
Console.Write("Toplam="+toplam);
Console.ReadLine();
}
}

rnek 5 :
*
**
***
****
*****
******

Yukarda grld gibi bir ekran kts veren consol programn yapnz. NOT: Program
dngkullanlarak yaplacaktr.
usingSystem;
classfordongusu
{
staticvoidMain()
{
for(inti=1;i<=6;i++)
{
for(intk=1;k<=i;k++)
{
Console.Write("*");
}
Console.WriteLine();
}
Console.ReadLine();
}
}

31

rnek 6 :
Klavyeden girilen 5 adet saydan ka tanesinin negatif olduunu bulan konsol programn
yapnz.
usingSystem;
classfordongusu
{
staticvoidMain()
{
intsayilar=0,adet=0;
for(inti=1;i<6;i++)
{
Console.Write("{0}Sayygiriniz:",i);
sayilar=Convert.ToInt32(Console.ReadLine());
if(sayilar<0)
{
adet++;
}
}
Console.Write("{0}Adetsaynegatif",adet);
Console.ReadLine();
}
}

while Dngs

Komut ya da komutlarn bir koul saland srece altrlmasn salar. Kuruluu:


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

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.

32

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


Yani for(;i<0;) ile while(i<0) ayn dngy balatr.

kouldan

oluan

hlidir.

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.
do
komut;
while(koul)
veya
do
{
komut1;
komut2;
.
.
.
}while(koul)

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.

foreach Dngs

C#ta foreach dngs bir dizi belirten ifadenin veya bir koleksiyonun her eleman iin
yapsndaki kodlar altran dngdr.
foreach (int a in dizi)
{
Console.WriteLine(a);
}

33

Tanmlanan deiken, srasyla belirtilen dizi ierisindeki elemanlar tutar.


Foreach dngs dngye ait deikeni kullanmamza imkan salar. Deikeni istediimiz
ekilde istediimiz ileme sokabiliriz. Ancak dngye mdahale edemeyiz.

Atlama Deyimleri
break Anahtar Szc

Hatrlarsanz break komutunu switch'teki case'lerden kmak iin kullanmtk. Benzer ekilde
break komutu btn dnglerden kmak iin kullanlabilir. rnek:
usingSystem;
classAkisKontrolMekanizmalari
{
staticvoidMain()
{
for(chara;;)
{
a=Convert.ToChar(Console.ReadLine());
if(a=='q')
break;
}
}
}

Bu program, kullanc "q" harfini girene kadar kapanmamaktadr.

continue anahtar Szc

break szcne benzer. Ancak break szcnden farkl olarak program continue'u
grdnde dngden kmaz, sadece dngnn o anki iterasyonu sonlanr. rnek:
usingSystem;
classAkisKontrolMekanizmalari
{
staticvoidMain()
{
for(inta=0;a<51;a++)
{
if(a%2==1)
continue;
Console.WriteLine(a);
}
Console.ReadLine();
}
}

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

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:
usingSystem;
classAkisKontrolMekanizmalari
{
staticvoidMain()
{
birinci:
Console.WriteLine("Birinciblm");

34

gotoucuncu;
ikinci:
Console.WriteLine("kinciblm");
ucuncu:
Console.WriteLine("ncblm");
Console.ReadLine();
}
}

Bu programda ikinci blm hibir zaman altrlmayacaktr.


RNEKLER
rnek 1 :
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.
usingSystem;
classAkisKontrolMekanizmalari
{
staticvoidMain()
{
inttoplam=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);
Console.ReadLine();
}
}

rnek 2 :
Girilen pozitif herhangi bir tam sayy ikilik dzene eviren program yaznz.
usingSystem;
classAkisKontrolMekanizmalari
{
staticvoidMain()
{
stringmod="";
Console.Write("Ltfenikiliksistemedntrlmesiniistediinizsaynzgirin:");
floata=Convert.ToSingle(Console.ReadLine());
intb=(int)a;
if(a<=0||a!=b)
mod="Birpozitiftamsaygirmediiniziinsaynzikiliksisteme
dntrlmedi!";
else
for(;b>0;b/=2)
mod=b%2+mod;
Console.Write(mod);
Console.ReadLine();
}
}

35

rnek 3 :
Konsol ekranna girilen 0 ile 100 (snrlar dhil) arasndaki 10 notun en byn, en
kn ve ortalamasn yazan program yaznz.
usingSystem;
classAkisKontrolMekanizmalari
{
staticvoidMain()
{
intbs=0,toplam=0,ks=0;
for(inta=0,b;a<10;a++)
{
Console.Write(a+1+".notugiriniz:");
b=Convert.ToInt32(Console.ReadLine());
if(b>100||b<0)
{
Console.Write("Yanlnotgirdiniz.Ltfentekrar");
a;
continue;
}
if(a==0)
{
bs=b;
ks=b;
}
else
{
if(b>bs)
bs=b;
if(b<ks)
ks=b;
}
toplam+=b;
}
Console.Write("Enbyk:{0}\nEnkk:{1}\nOrtalama:"+toplam/10,bs,ks);
Console.ReadLine();
}
}

BLM5
DZLER

Arrays Tek Boyutlu Diziler


Ayn veri tipindeki liste bilgileri ile almak iin kullanlr. Listede bulunan veriler bellekte
dizili srasyla tutulur. Dizilerde ki sralamaya indis sralamas denir. ndis sralamas 0' dan
balar ki bu durumda dizideki ilk eleman 0' nc elemandr.
Kullanm:
tip[ ] dizi_adi = new tip[eleman says];

Yeil Blge:

36

nce veri hangi tipte olacaksa o belirtilir. Unutmayalm bir dizide sadece ayn tipte veri
olabilir. Sonra bu veri tipinin bir dizi olduunu belirtmek iin keli parantez konulur.
Sar Blge:

Burada dizi iin bir ad belirleriz.


Pembe Blge:

Atama operatrnden sonra "new" yazyoruz. Bylece yeni bir dizi tanmlamas yaplaca
bildiriliyor.
Turkuaz Blge:

Veri tipinin adn yazdktan sonra keli parantez iinde dizi eleman saysn yazyoruz.
Bylece bellek zerinde dizi yaplanmas salanyor.

rnek:

int[] sayi = new int[4];

Bu ekilde dizi tanmlamas yaptktan sonra artk dizi elemanlarn altta grld gibi
belirlemek gerekir.

37

rnek 1:

int[ ] sayi = new int[4];


sayi[0] = 5;
sayi[1] = 12;
sayi[2] = 3;
sayi[3] = 9;
sayi[4] = 45;

Yukardaki rnekte kullanlan yap yazmas zaman aldndan pek kullanlmaz.


Burada rnei bu ekilde vermemizin sebebi dizilerin indis srasn gstermek iindi.
Buna gre yukardaki rnein aynsn altta grld ekilde de yazabiliriz ki sk kullanlan
yntemde budur.
rnek: 2

int[] sayi = new int[] {5, 12, 3, 9, 45} ;


Buradaki fark ise keli parantez iine eleman saysn yazmyoruz nk zaten hemen
ardndan
kme
parantezi
iinde
elemanlar
yazyoruz.
Yukarda saylarla ilgili rnek verdik. Altta ise metinlerle ilgili rnek verilmitir.
rnek 3:

string[ ] gunler = new string[7];


gunler[0] = "Pazartesi";
gunler[1] = "Sal";
gunler[2] = "aramba";
gunler[3] = "Perembe";
gunler[4] = "Cuma";
gunler[5] = "Cumartesi";
gunler[6] = "Pazar";
rnek 4:

string[ ] gunler = {"Pazartesi","Sal","aramba","Perembe","Cuma","Cumartesi","Pazar"};


u ana kadar dizileri tanmladk. Dizilerin kodlama iinde kullanm ile ilgili rnekler altta
verilmitir.Buna gre bir dizi iindeki eleman yazdrmak iin iki yol izleyebiliriz.
Birinci yol dizi iindeki eleman bir deikene atamak ve ardndan o deikeni ekrana
yazdrmak. Alttaki rnekte "gunler" adl dizinin nc eleman "gun" adl deikene
aktarldktan sonra deiken yazdrld.

38

RNEKLER
rnek 1:
usingSystem;
usingSystem.Collections.Generic;
usingSystem.Linq;
usingSystem.Text;
namespaceConsoleApplication1
{
classProgram
{
staticvoidMain(string[]args)
{
string[]gunler={"Pazartesi","Sal","aramba","Perembe","Cuma","Cumartesi",
"Pazar"};
stringgun=gunler[3];
Console.WriteLine(gun);
Console.ReadLine();
}
}
}

Alttaki rnekte ise deikene falan atama yapmadan dorudan yazdrma komutunun iine
"gunler[3]" yazarak ekrana yazdrma ilemi yapld.

rnek 2:
usingSystem;
usingSystem.Collections.Generic;
usingSystem.Linq;
usingSystem.Text;
namespaceConsoleApplication1
{
classProgram
{
staticvoidMain(string[]args)
{
string[]gunler={"Pazartesi","Sal","aramba","Perembe","Cuma","Cumartesi",
"Pazar"};
Console.WriteLine(gunler[3]);
Console.ReadLine();
}
}
}

Arrays ki Boyutlu Matris Diziler


nceki dersimizde tek boyutlu dizileri grmtk. Bu dersimizde ise iki boyutlu dizileri
greceiz. Bunlara matrix diziler de denilmektedir.
Aradaki fark alttaki sz diziminde grlecei zere ilk keli parantez iinde bir adet virgl
bulunmakta, son keli parantez iinde ise iki tane deer bulunmaktadr. Bunlardan ilki satr
saysn dieri ise stun saysn gstermektedir.
Kullanm:
veritipi[,] <dizi ad> = new veritipi[satr deeri, stn deeri]

39

rnek:
int[,] tablo = new int[3, 4];
Yukardaki rnei biraz daha ayrntl grelim.

Keli parantez iindeki ilk deer satr deerini gstermektedir. Altta grld gibi "3" adet
satr olumaktadr.
Buna gre;
Birinci satr indis no : [0]
kinci satr indis no : [1]
nc satr indis no : [2]

40

Keli parantez iindeki ikinci deer stun deerini gstermektedir. Altta grld gibi "4"
adet stun olumaktadr.
Buna gre;
Birinci stun indis no
: [0]
kinci stun indis no
: [1]
nc stun indis no : [2]
Drdnc stun indis no: [3]

imdi bu satr ve stunlar birletirdiimizde alttaki yapy elde ederiz. Buna gre her
karedeki krmz rakamlar satr deerlerini gstermekte mavi rakamlar stun deerlerini
gstermektedir.

Yukardaki tabloya gre altta grld gibi her kare iin bir deer belirledim.
int[,] tablo = new int[3, 4];

41

tablo[0,0] = 1;
tablo[0,1] = 2;
tablo[0,2] = 3;
tablo[0,3] = 4;
tablo[1,0] = 5;
tablo[1,1] = 6;
tablo[1,2] = 7;
tablo[1,3] = 8;
tablo[2,0] = 9;
tablo[2,1] = 10;
tablo[2,2] = 11;
tablo[2,3] = 12;
Yukardaki "tablo" adl dizinin grnm alttaki gibi olacaktr.

42

RNEKLER
rnek 1:
Kullancnn girdii kelimenin harflerini alfabetik sralayan c# console uygulamasn yaznz
usingSystem;
usingSystem.Collections.Generic;
usingSystem.Linq;
usingSystem.Text;
namespaceConsoleApplication1
{
classProgram
{
staticvoidMain(string[]args)
{
Console.Write("BirKelimeGiriniz=");

stringisim=Convert.ToString(Console.ReadLine());
intuzunluk=isim.Length;
char[]dizi=newchar[uzunluk];
stringsirali="AlfebetikSraleDizilii=";
for(inti=0;i<uzunluk;i++)
{
dizi[i]=isim[i];
}
Array.Sort(dizi);
for(inti=0;i<uzunluk;i++)
{
sirali+=dizi[i];
}
Console.WriteLine(sirali);
Console.ReadLine();
}
}
}

rnek 2:
Dardan girilen dizinin dizi elemann gsteren program yaznz
usingSystem;
usingSystem.Collections.Generic;
usingSystem.Linq;
usingSystem.Text;
namespaceConsoleApplication1
{
classProgram
{
staticvoidMain(string[]args)
{
int[]dizi=newint[10];
for(inti=0;i<10;i++)
{
Console.Write("{0}.SayyGiriniz=",i);
dizi[i]=Convert.ToInt32(Console.ReadLine());
}
Console.WriteLine("xxxxxxxxxxxxx");

for(inti=9;i>0;i)
{
Console.WriteLine("Dizinin{0}Eleman={1}",i,dizi[i]);
}
Console.WriteLine("xxxxxxxxxxxxx");
Console.Write("Kancelemangrmekistiyorsunuz=");
intsayi=Convert.ToInt32(Console.ReadLine());

43


Console.WriteLine("{0}.eleman={1}",sayi,dizi[sayi]);
Console.ReadLine();
}
}
}

rnek 3:
Verilen bir string dizisini, ters srada (sondan baa doru) listeleyen C# programn yaznz.
usingSystem;
classDiziListele
{
publicstaticvoidMain(string[]args)
{
string[]strDizi={"Ali","Zekiye","Cemil","Kemal"};
intson=strDizi.Length1;
for(inti=son;i>=0;i)
{
Console.WriteLine(strDizi[i]);
}
Console.ReadLine();
}
}

rnek 4:
Kullancnn girdii 5 adet sayy bir diziye atayarak, bu dizide bulunan ift saylarn
ortalamasn ekrana yazan konsol uygulamasn yapnz.
usingSystem;
classDiziArama
{
staticvoidMain(string[]args)
{
intadet=0,toplam=0;
int[]sayi=newint[5];
for(intk=0;k<5;k++)
{
Console.Write("{0}.sayygiriniz:",k);
sayi[k]=int.Parse(Console.ReadLine());
}
for(intk=0;k<5;k++)
{
if(sayi[k]%2==0)
{
adet++;
toplam+=sayi[k];
}
}
Console.WriteLine("Ortalamas={0}",toplam/adet);
Console.ReadKey();
}
}

BLM6
METOTLAR VE FONKSYONLAR

u ana kadar yaptmz rneklerde hep nceden hazrlanm ReadLine(), WriteLine() vb.
gibi metotlar kullandk. Aslnda btn rneklerimizde birer metot oluturutuk. O da

44

alabilir her programda bulunmas gereken Main metoduydu. Artk Main metodu gibi baka
metotlar oluturup 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.

Metot Oluturma 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 oluturup "." operatryle bu nesne zerinden metodumuza erimeliyiz.
rnek:
usingSystem;
class Metotlar
{
int Topla(int a,int b)
{
return a+b;
}
staticvoid 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 oluturmaya gerek yoktur. static olarak tanmlanan metotlara sadece metodun adn
yazarak eriilebilir.

rnek:
usingSystem;
class Metotlar
{
staticint Topla(int a,int b)
{
return a+b;
}
staticvoid Main()
{
int a=Topla(2,5);

45

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 oluturulmusa o
metodu kullanabilmek iin nce snf yazmamz gerekir.

rnek:
usingSystem;
class Metotlar1
{
publicstaticint Topla(int a,int b)
{
return a+b;
}
}
class Metotlar2
{
staticvoid Main()
{
int a=Metotlar1.Topla(2,5);
Console.Write(a);
}
}

Dikkat ettiyseniz bu metodun oluturulma 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 oluturalm ve kullanalm:
usingSystem;
class Metotlar1
{
publicint Topla(int a,int b)
{
return a+b;
}
}
class Metotlar2
{
staticvoid Main()
{
Metotlar1 nesne=new Metotlar1();
int a=nesne.Topla(3,9);
Console.Write(a);
}
}

46

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

rnek:
usingSystem;
class Metotlar1
{
staticvoid Yaz(object a,int b)
{
for(;b>0;b--)
Console.Write(a);
}
staticvoid 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
oluturup, 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:
usingSystem;
class Metotlar1
{
staticvoid Yaz(object a,int b)
{
if(b>10)
return;
for(;b>0;b--)
Console.Write(a);
}
staticvoid Main()
{
Yaz('n',10);
}
}

Bu programda eer metoda verilen ikinci parametre 10'dan bykse metottan hibir ey
yaplmadan klyor.

Metotlarla lgili nemli zellikler

47

Metotlar kullanrken parametrelerini doru sayda, doru srada ve doru trde


vermeliyiz.
Deer tutan metotlarda return satryla belirtilen ifade, metodu olutururken 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:
usingSystem;
class Metotlar1
{
staticvoid Yaz()
{
Console.Write("deneme");
}
staticvoid Main()
{
Yaz();
}
}

48

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 oluturulamaz. rnein aadaki gibi bir kullanm
hataldr:

usingSystem;
class Metotlar1
{
staticvoid Yaz()
{
Console.Write("deneme");
staticvoid Ciz()
{
Console.Write("\n");
}
}
staticvoid Main()
{
Yaz();
}
}

Metot oluturulurkenki 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 oluturulurkenki 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.

Metot Parametresi Olarak Diziler


rnek:
usingSystem;
class Metotlar1
{
staticvoid Yaz(int[] dizi)
{
foreach(int i in dizi)
Console.WriteLine(i);
}
staticvoid 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:
usingSystem;

49

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

Bu kullanm dorudur. Ancak aadaki kullanm hataldr:


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

nk dizilerde deikenlerdeki gibi bir bilinsiz tr dnmnden bahsetmek imkanszdr.

Dizi ve Deiken Parametreler Arasndaki Fark


Aadaki iki program karlatrn:
1.
usingSystem;
class Metotlar1
{
staticvoid Degistir(int[] dizi)
{
for(int i=0;i<5;i++)
dizi[i]=10;
}
staticvoid Yaz(Array dizi)
{
foreach(object a in dizi)
Console.WriteLine(a);
}
staticvoid Main()
{
int[] dizi={1,2,4,7,8};

50

Degistir(dizi);
Yaz(dizi);
}
}

2.
usingSystem;
class Metotlar1
{
staticvoid Degistir(int sayi)
{
sayi=10;
}
staticvoid Yaz(int sayi)
{
Console.WriteLine(sayi);
}
staticvoid 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 esas 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 oluturur 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.

51

Metotlarn Ar Yklenmesi
C#'ta parametre says ve/veya parametrelerin trleri farkl olmak artyla ayn isimli birden
fazla metot oluturulabilir. 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
oluturulmu 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:

usingSystem;
class Metotlar
{
staticvoid Metot1(int x,int y)
{
Console.WriteLine("1. metot arld.");
}
staticvoid Metot1(float x,float y)
{
Console.WriteLine("2. metot arld.");
}
staticvoid Metot1(string x,string y)
{
Console.WriteLine("3. metot arld.");
}
staticvoid 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 oluturulmam olsayd ikinci
metot arlacakt. Son olarak Metot1(10f,56f); satryla da ikinci metot arlr.

Baka bir rnek:

52

usingSystem;
class Metotlar
{
staticvoid Metot1(float x,float y)
{
Console.WriteLine("1. metot arld.");
}
staticvoid Metot1(double x,double y)
{
Console.WriteLine("2. metot arld.");
}
staticvoid 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:
usingSystem;
class Metotlar
{
staticvoid Metot1(float x,float y)
{
Console.WriteLine("1. metot arld.");
}
staticvoid Metot1(int x,int y)
{
Console.WriteLine("2. metot arld.");
}
staticvoid Main()
{
Metot1(5,6.4f);
}
}

Bu durumda birinci metot arlr.

53

Baka bir rnek:


usingSystem;
class Metotlar
{
staticvoid Metot1(float x,float y)
{
Console.WriteLine("1. metot arld.");
}
staticvoid Metot1(int x,int y)
{
Console.WriteLine("2. metot arld.");
}
staticvoid 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.
usingSystem;
class Metotlar
{
staticvoid Metot1(int x,int y,int z)
{
Console.WriteLine("1. metot arld.");
}
staticvoid Metot1(int x,int y)
{
Console.WriteLine("2. metot arld.");
}
staticvoid Metot1(float x,int y)
{
Console.WriteLine("3. metot arld.");
}
staticvoid Main()
{
Metot1(3,3,6);
Metot1(3.4f,3);
Metot1(1,'h');
}
}

Burada srasyla 1., 3. ve 2. metotlar arlacaktr.

Deiken Sayda parametre Alan Metotlar

54

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:
usingSystem;
class Metotlar
{
staticint Toplam(paramsint[] sayilar)
{
if(sayilar.Length==0)
return0;
int toplam=0;
foreach(int i in sayilar)
toplam+=i;
return toplam;
}
staticvoid 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 sayilar.Length satr sayilar dizisinin eleman saysn int trnden
tutar.
Baka bir rnek:
usingSystem;
class Metotlar
{
staticint Islem(string a,paramsint[] sayilar)
{
if(a=="carp")
{
if(sayilar.Length==0)
return1;
int carpim=1;
foreach(int i in sayilar)
carpim*=i;
return carpim;
}
elseif(a=="topla")
{
if(sayilar.Length==0)

55

return0;
int toplam=0;
foreach(int i in sayilar)
toplam+=i;
return toplam;
}
else
return0;
}
staticvoid 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:
usingSystem;
class Metotlar
{
staticvoid Metot1(int x,int y)
{
Console.WriteLine("1. metot arld.");
}
staticvoid Metot1(int x,paramsint[] y)
{
Console.WriteLine("2. metot arld.");
}
staticvoid Main()
{
Metot1(3,6);
}
}

Burada 1. metot arlr. Ancak,


usingSystem;
class Metotlar
{
staticvoid Metot1(int x,int y)
{
Console.WriteLine("1. metot arld.");
}
staticvoid Metot1(int x,paramsint[] y)
{
Console.WriteLine("2. metot arld.");
}

56

staticvoid Main()
{
Metot1(3,6,8);
}
}

Burada 2. metot arlr.

Kendini aran Metotlar

C#'ta bir metodun iinde ayn metot arlabilir.


rnek:
usingSystem;
class Metotlar
{
staticint Faktoriyel(int a)
{
if(a==0)
return1;
return a*Faktoriyel(a-1);
}
staticvoid 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.
usingSystem;
class Metotlar
{
staticfloat Fonksiyon(float x)
{
return2*x+5;
}
staticfloat TersFonksiyon(float x)
{
return(x-5)/2;

57

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

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.

Main Metodunun Deer Tutmas


Main metodunu static int Main() eklinde de yaratabiliriz. Peki bu ne iimize
yarayacak? 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.

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

58

rnek bir program:


usingSystem;
class Metotlar
{
staticvoid 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.

59

BLM7
SINIFLAR
Snflar nesne ynelimli programlamann en nemli gesidir. Snflar sayesinde
programlarmz paralara 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.

Snf Oluturmak
zellii ve iki metodu olan rnek bir snf oluturulmas:
usingSystem;
class SinifIsmi
{
publicint ozellik1;
privatestring ozellik2;
float ozellik3;
publicint metot1(int a,int b)
{
return a+b;
}
privatevoid 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 ozellik1zelliine ve metot1 metoduna SinifIsmi snfnn dndan eriilebilir. Dier
zellik ve metotlara eriilemez. imdi bu snf programmzda kullanalm:
usingSystem;
class SinifIsmi
{
publicint ozellik1;
publicstring ozellik2;
publicfloat ozellik3;
publicint metot1(int a,int b)
{
return a+b;
}

60

publicvoid metot2(string a)
{
Console.WriteLine(a);
}
}
class EsasSinif
{
staticvoid 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. nk SinifIsmi 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:
usingSystem;
class SinifIsmi
{
publicint ozellik1=55;
publicstring ozellik2="deneme";
publicfloat ozellik3=123.78f;
publicint metot1(int a,int b)
{
return a+b;
}
publicvoid metot2(string a)
{
Console.WriteLine(a);
}
}
class EsasSinif
{
staticvoid Main()
{
SinifIsmi nesne=new SinifIsmi();
Console.WriteLine(nesne.ozellik1);
Console.WriteLine(nesne.ozellik2);
Console.WriteLine(nesne.ozellik3);

61

Console.WriteLine(nesne.metot1(2,5));
nesne.metot2("Vikikitap");
}
}

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

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:
usingSystem;
class KrediHesabi
{
publiculong HesapNo;
}
class AnaSinif
{
staticvoid 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,
usingSystem;
class KrediHesabi
{
publiculong HesapNo;
}
class AnaSinif
{
staticvoid Main()
{
KrediHesabi hesap1=new KrediHesabi();

62

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:
usingSystem;
class EsasSinif
{
int a;
staticvoid 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 kullanabiliriz.
rnek:
usingSystem;
class EsasSinif
{
staticint a;
staticvoid 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;

63

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.
RNEKLER:
rnek 1:
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.
usingSystem;
class Dortgen
{
publicint En;
publicint Boy;
publicint Alan()
{
int Alan=En*Boy;
return Alan;
}
publicvoid EnBoyBelirle(int en,int boy)
{
En=en;
Boy=boy;
}
publicvoid 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
{
staticvoid Main()
{
Dortgen d1=new Dortgen();
d1.EnBoyBelirle(20,50);
d1.Yaz();
Dortgen d2=new Dortgen();
d2.EnBoyBelirle(25,12);

64

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
ve Alan 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.

usingSystem;
class Dortgen
{
publicint En=20;
publicint Boy=5;
publicint Alan()
{
int Alan=En*Boy;
return Alan;
}
staticvoid 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.
rnek 2:
usingSystem;
class Dortgen
{
publicint En;
publicint Boy;
publicint Alan()
{
int Alan=En*Boy;
return Alan;
}
publicvoid EnBoyBelirle(int en,int boy)
{

65

En=en;
Boy=boy;
}
publicvoid Yaz()
{
Console.WriteLine("***************");
Console.WriteLine("En:{0,5}",En);
Console.WriteLine("Boy:{0,5}",Boy);
Console.WriteLine("Alan:{0,5}",Alan());
Console.WriteLine("***************");
}
staticvoid Main()
{
Dortgen d1=new Dortgen();
d1.EnBoyBelirle(20,50);
d1.Yaz();
Dortgen d2=new Dortgen();
d2.EnBoyBelirle(25,12);
d2.Yaz();
}
}

rnek 3:
usingSystem;
class Dortgen
{
publicint En=30;
publicint Boy=23;
publicint Alan()
{
int Alan=En*Boy;
return Alan;
}
staticvoid Main()
{
yaz d1=new yaz();
d1.Yaz();
}
}
class yaz
{
publicvoid 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.

66

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.
usingSystem;
class EvHalki
{
publicint DogumYili;
publicstring Meslek;
publicstring Ad;
publicstring GozRengi;
publicint Yas()
{
return2008-DogumYili;
}
publicvoid OzellikleriYaz()
{
Console.WriteLine("---------------");
Console.WriteLine("Ad: "+Ad);
Console.WriteLine("Ya: "+Yas());
Console.WriteLine("Meslei: "+Meslek);
Console.WriteLine("Gz rengi: "+GozRengi);
Console.WriteLine("---------------");
}
}
class AnaProgram
{
staticvoid 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:

67

usingSystem;
class EvHalki
{
publicint DogumYili;
publicstring Meslek;
publicstring Ad;
publicstring GozRengi;
publicint Yas()
{
return2008-DogumYili;
}
publicvoid OzellikleriYaz()
{
Console.WriteLine("---------------");
Console.WriteLine("Ad: "+Ad);
Console.WriteLine("Ya: "+Yas());
Console.WriteLine("Meslei: "+Meslek);
Console.WriteLine("Gz rengi: "+GozRengi);
Console.WriteLine("---------------");
}
}
class AnaProgram
{
staticvoid 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
ramenOzellikleriYaz 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.

This Anahtar Szc


imdi yle bir program yazalm:
usingSystem;
class Dortgen
{
publicint En;
publicint Boy;
void EnBoyBelirle(int en,int boy)
{
En=en;

68

Boy=boy;
}
staticvoid 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:
usingSystem;
class Dortgen
{
publicint En;
publicint Boy;
void EnBoyBelirle(int en,int boy)
{
this.En=en;
this.Boy=boy;
}
staticvoid 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:
usingSystem;
class Dortgen
{
publicint En;
publicint Boy;
void EnBoyBelirle(int En,int Boy)
{
En=En;
Boy=Boy;
}
staticvoid Main()
{
Dortgen d1=new Dortgen();
d1.EnBoyBelirle(20,50);
Console.WriteLine(d1.En+"\n"+d1.Boy);
}
}

69

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:
usingSystem;
class Dortgen
{
publicint En;
publicint Boy;
void EnBoyBelirle(int En,int Boy)
{
this.En=En;
this.Boy=Boy;
}
staticvoid 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.
usingSystem;
class Dortgen
{
int En;
int Boy;
staticvoid 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:
usingSystem;
class Dortgen
{
staticint En=8;
staticint Boy=3;

70

staticvoid Main()
{
int En=50;
int Boy=100;
Console.WriteLine(En+"\n"+Boy);
}
}

Burada ekrana srasyla 50 ve 100 yazlacaktr. Ancak;


usingSystem;
class Dortgen
{
staticint En=8;
staticint Boy=3;
staticvoid 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.

get ve set Anahtar Szc


imdi aadaki kk program yazalm:
usingSystem;
class YardimciSinif
{
int Sayi;
publicvoid SayiBelirle(int sayi)
{
Sayi=sayi;
}
publicint SayiAl()
{
return Sayi;
}
}
class AnaSinif
{
staticvoid Main()
{
YardimciSinif nesne=new YardimciSinif();
nesne.SayiBelirle(34);
Console.WriteLine(nesne.SayiAl());
}
}

71

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 Sayizelliini public olarak ayarlayp direkt olarak zellik zerinde ilem
yaplabilirdi. te faydas:
usingSystem;
class YardimciSinif
{
int Sayi;
publicvoid SayiBelirle(int sayi)
{
if(sayi<0)
Sayi=0;
else
Sayi=sayi;
}
publicint SayiyiAl()
{
if(Sayi>100)
return Sayi/100;
else
return Sayi;
}
}
class AnaSinif
{
staticvoid 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:

usingSystem;
class YardimciSinif
{
int Sayi;
publicint SahteOzellik
{
set
{

72

if(value<0)
Sayi=0;
else
Sayi=value;
}
get
{
if(Sayi>100)
return Sayi/100;
else
return Sayi;
}
}
}
class AnaSinif
{
staticvoid Main()
{
YardimciSinif nesne=new YardimciSinif();
nesne.SahteOzellik=110;
Console.WriteLine(nesne.SahteOzellik);
}
}

Grdnz gibi nce YardimciSinif snfnda SahteOzellik adl bir zellik oluturduk.
Buzellik 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 Length Array 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:
usingSystem;
class YardimciSinif
{
publicint[] Dizi={7,4,3};
publicint[] Metot()
{
int[] a={23,45,67};
return a;
}
}

73

class AnaSinif
{
staticvoid 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.
usingSystem;
class Donustur
{
publicstaticint[] Inte(Array dizi)
{
int[] gecici=newint[dizi.Length];
for(int i=0;i<dizi.Length;i++)
gecici[i]=Convert.ToInt32(dizi.GetValue(i));
return gecici;
}
publicstaticstring[] Stringe(Array dizi)
{
string[] gecici=newstring[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.

usingSystem;
class Donustur
{
publicstaticint[] Inte(Array dizi)
{
int[] gecici=newint[dizi.Length];
for(int i=0;i<dizi.Length;i++)
gecici[i]=Convert.ToInt32(dizi.GetValue(i));
gecici;
return
}
publicstaticstring[] Stringe(Array dizi)
{
string[] gecici=newstring[dizi.Length];
for(int i=0;i<dizi.Length;i++)
gecici[i]=dizi.GetValue(i).ToString();
return gecici;

74

}
}
class AnaProgram
{
staticvoid 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 kopyalayapotr 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:
usingSystem;
class Buton
{
publicint Genislik;
publicint Yukseklik;
publicvoid Ciz()
{
string[,] dizi=newstring[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++)
{

75

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
{
staticvoid Main()
{
Buton buton1=new Buton();
buton1.Genislik=20;
buton1.Yukseklik=13;
buton1.Ciz();
}
}

76

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

Yapc Metotlar

77

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 void anahtar
szc de kullanlmaz.

rnek program:
usingSystem;
class Deneme
{
public Deneme()
{
Console.WriteLine("Deneme snf trnden bir nesne
oluturuldu.");
}
}
class AnaProgram
{
staticvoid 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.
usingSystem;
class Deneme
{
public Deneme(int a,int b,int c)
{
Console.WriteLine(a+b+c);
}
}
class AnaProgram
{
staticvoid Main()
{
Deneme a=new Deneme(2,5,6);
}
}

Grdnz gibi yapc metot parametre de alabiliyor. Yapc metoda parametreler ise nesne
oluturulurken veriliyor.

78

NOT: llaki yapc metodun asl snf dnda bulunmasna gerek yoktur. rnein aadaki
gibi bir kullanm da mmkndr:
usingSystem;
class Deneme
{
Deneme()
{
Console.WriteLine("Bu snf trnden bir nesne oluturuldu.");
}
staticvoid 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.

79

80

You might also like