You are on page 1of 36

ETM : DZLER VE METOTLAR

Blm : Diziler ve Koleksiyonlara Giri Konu : Dizi Nedir? Neden htiya Duyarz?

Diziler ayn tipte deerlerin bir arada tanmasn salayan referans tipli programlama eleridir.

Diyelim ki 30 rencinin notlarn tutmak istiyorsun. Tip olarak byte iini grecektir (0 255 aralnda deer tutabilir). Bu programlama grevini yerine getirebi lmek iin byte tipinde 30 tane deikene ihtiya olur. Ancak bu kullanm, takip etmesi olduka g durumlara yol aabilir. Bunun yerine byte tipinde 30 elemanl bir dizi oluturmak ve rencilerin notlarn bu dizide tutmak daha etkin bir zmdr. Ayrca program ierisinde 30 kiinin notunu bir yerden baka bir yere tamak da daha kolay olacaktr. Dizi tanmlanrken ona bir isim verilir. Ancak diziye atlan her bir eleman iin ayr ayr deiken ismi verilmesine gerek yoktur. Diziler, elemanlarna ismiyle deil indeks sralaryla eriim sunar. Diziye atlan her bir eleman otomatik olarak 0dan balayp 1er 1er artan bir indeksleme sistemi ile kaydedilir. Daha sonra dizi elemanlarna erimek istediinde indeksler ile eriebilirsin. rnein rencileri snf listesindeki sralarna gre diziye atp bu sraya bakarak istediin nota eriebilirsin. Diziler referans tiplidirler. Dolaysyla diziye atlan veriler bellein heap blgesinde tutulurken, diziye eriim iin oluturulan deiken bellein stack blgesinde tutulur.

Not : Heap ve Stack, yazdn .NET uygulamalarnda kullanlan deikenlerin ve tanmlanan nesnelerin geici bellek (RAM) zerinde sakland alanlardan ikisidir ve en temel olanlardr. Bu blgeler .NET framework tarafndan otomatik olarak ynetilirler. Gelitirici bu blgelere dorudan mdahele etmez. Kullanlan veri tipleri, nceden tanml kurallara gre bellein ilgili alannda saklanrlar. Stack, daha kk bir alana sahiptir. Burada nispeten basit tipli verilerin saklanmas amalanr. Deer tipli deikenler, bellein stack blgesinde tutulur. (int, double, DateTime vb.) Bellein heap blgesi, daha karmak verilerin saklanmas iin bulunmaktadr. Stack blgesine gre bellekte daha byk miktarda yer kaplar. Referans tipli deikenler, bellein heap blgesinde tutulurlar.(string, object, Console vb.)

2 / 36

ETM : DZLER VE METOTLAR

Blm : Diziler ve Koleksiyonlara Giri Konu : Dizileri Kullanmak

3 / 36

Dizi Deikenleri Tanmlamak


Dizi tanmlama sz dizimi, deiken tanmlama sz dizimi ile benzerdir. Bir diziyi tanmlarken, dizi ierisinde hangi tipte deerler saklayacan belirtmelisin. kisini ayran detay, dizide tipin sonuna koyulan keli parantezlerdir. rnein sayilarim adnda int tipinde bir dizi tanmlamas aadaki gibi yaplr: int[] sayilarim; Burada tanmlanan tip, sadece nceden tanml tiplerden birisi (int, double vb.) olmak zorunda deildir. Temel snf ktphanesindeki herhangi bir tipte olabilecei gibi kendi yazdn tipte bir dizi de tanmlayabilirsin. Dizi deikenlerine oul adlar verilirse, bir diziyi iaret ettii daha rahat anlalabilir. Dizi rnekleri Oluturmak erisinde tutulacak elemanlarn tipi ne olursa olsun diziler, referans tiplidirler. Yani dizi deikeni bellein stack blgesinde, dizinin kendisi bellein heap blgesinde yer alr.

Dizilerin bellee karlmas iin new anahtar kelimesi ile oluturulmalar gerekir. Diziler oluturulurken, ka elemanl olduklar bilinmek zorundadr. Bellekte, bu bilgiye gre yer alr. Programn ilerleyen satrlarnda bu alana belirtilen miktardan fazla eleman girilemez. Girilmeye alldnda boyut dinamik olarak artmaz. Ortama hata frlatlr. Yine dizilerin referans tipli olmasndan tr, dizi yeleri kendi tiplerinin varsaylan deerlerini alrlar. Daha sonra bu deerler, ihtiyalar dorultusunda deitirilir. yleyse 10 elemanl bir bool dizisi oluturulduunda bu dizinin 10 elemannn deeri de otomatik olarak false (bool tipinin varsaylan deeri) eklinde belirlenir.

4 / 36

Bu ekilde 4 elamanl int tipli bir dizi oluturabilirsin.

sayilarim = new int[4];

Dizinin eleman saysn sabit bir deer olarak vermek zorunda deilsin. Tek kural var; o da dizi oluturulduunda ka elamanl olaca bilinmelidir. Bu yzden, dizi rnei farkl yollar kullanlarak oluturulabilir. rnein dizinin eleman says alma zamannda belirlenebilir: ... Console.Write("Ltfen renci saynz giriniz : "); int boyut = int.Parse(Console.ReadLine()); sayilarim = new int[boyut]; Console.WriteLine("{0} elemanl diziniz oluturuldu...",boyut); ...

Dizilere Balang Deerlerini Vermek Bir dizi oluturulduunda dizinin ii, oluturulduu tipin varsaylan deerleriyle doldurulur. Dizinin bu davran deitirilebilir ve balangta istenilen deerlerle bellee karlabilir. Bunu gerekletirmek iin, dizi oluturulma sz diziminin sonunda kme parantezleri kullanlr. Dizide belirtilen tipte ve eleman says kadar deeri, ssl parantezler iine, aralarnda virgl olacak ekilde yazman gerekir. rnek olarak sayilarim adl dizi, 4,9,7 ve 3 deeleri ile birlikte oluturulabilir. sayilarim = new int[4] { 4,9,7,3};

Burada dizi boyutunun 4 elemanl olaca bildirildii iin ssl parantezler ierisine 4 elemandan az ya da fazla deer girilmesi durumunda derleme zaman hatas alnr. Birka veri tipi iin bu sz diziminin rnek kullanl yledir: string[] sehirler = new string[] { "Antalya","stanbul","Ankara" }; double[] oranlar = new double[3] { 0.32 , 0.45 , 0.56 }; char[] alfabe = new char[3] { 'a','b','c};

Dizi oluturulurken eer elemanlarn ilk deerlerini veriyorsan, eleman says belirtmek zorunda deilsin. Derleyici, balang deerlerindeki eleman adedine bakarak dizinin eleman saysn hesaplar. string[] sehirler = new string[] { "Antalya","stanbul","Ankara" };

5 / 36

Dizi oluturulurken eer elemanlarn veriyorsan, new anahtar kelimesi ve veri tipi kullanm ihmal edilebilir. Derleyici, balang deerlerinin adedine bakarak dizinin eleman saysn otomatik olarak hesaplar. string[] sehirler = { "Antalya","stanbul","Ankara" };

Her Bir Dizi Elemanna Erimek stenilen dizi elemanna erimek iin dizi zerinden ilgili elemann indeks sras verilir. rnein sayilarim adiyla oluturulup deerleri verilen dizinin son elemanna erimeye altn dnelim. Burada dikkat edilmesi gereken nokta; C#da dizi mantndaki hereyin indeks olarak 0 deeri ile balamasdr . Tpk ekrana bir ey yazdrrken kullanlan yer tutucularda (placeholder) olduu gibi ({0}). O yzden aadaki dizinin elemanlar ve indeks sralar yledir : 0. indeksli eleman 4 1.indeksli eleman 9 2.indeksli eleman 7 3.indeksli eleman ise 3 int[] sayilarim = new int[4] { 4,9,7,3}; int sayi2 = sayilarim[1]; Console.WriteLine("Dizinin {0}. indeksli eleman : {1}" ,1,sayi2);

Dizi elemanlarnn deerleri tanmlandktan sonra deitirilebilir. Dizinin ikinci indeksli eleman olan 7 deerini aadaki kod parasnda grld gibi 10 olarak deitirebilirsin. sayilarim[2] = 10; // ya da int baskaSayi = 10; sayilarim[2] = baskaSayi;

Bir diziye deerleri verilmeden sadece eleman says sylenerek (varsaylan deerleri ile) oluturulduktan sonra dizi elemanlarn tek tek de verebilirsin. int[] sayilarim = new int[4]; sayilarim[0] = 3; sayilarim[1] = 5; sayilarim[2] = 7; sayilarim[3] = 9;

Dizinin elemanlarna eriimde 0dan balayan indeksler kullanldi iin dizinin son indeksi, eleman says -1 olarak ele alnr. Eer yanllkla elemanl bir dizinin nc indeksli elemanna erimeye alrsan IndexOutOfRange hatas ile karlarrsn.
6 / 36

int[] sayilarim = new int[4] { 4, 9, 7, 3 }; Console.WriteLine(sayilarim[4]); //HATA: Bu diziye eriim iin kullanlacak index 0 ile 3 arasnda olmaldr.

Bir Dizinin Eleman Saysn Elde Etmek Bir dizinin eleman saysn, dizi deikeni zerinden aracan Length zellii ile elde edebilirsin. Console.WriteLine("sayilarim sayilarim.Length); dizisinin eleman says : {0}",

Bir Dizi erisindeki Btn Elemanlar Elde Etmek Bir dizideki eleman says dizinin Length zellii ile elde edilebildiine gre, for dngs kullanlarak dizinin 0nc indeksi ile eleman says -1nci indeksi arasndaki btn deerler elde edilebilir. int[] sayilarim = new int[4] { 3,5,7,9 }; for (int i = 0; i < sayilarim.Length; i++) { Console.WriteLine("{0}.eleman = {1}",i + 1,sayilarim[i]); } Yukardaki dngde ekrana her bir elemann dizideki sras (indeks + 1) ve deeri yazdrlmaktadr. Dng deikeni nce sfr deerini alr. Ekrana mevcut elemann sra numaras olarak 1i yazdrr (0 + 1). Yanna dizideki sfrnc indeksli elemann deeri olan 3 yazdrr. Burada dikkat edilmesi gereken noktalardan biri; dng deikeninin balang deeri olarak 1le deil 0la balamasdr. Dier nokta ise dngnn mantksal koul deyiminin, dizinin boyutu olan 4 iin altrlmamasdr. Bu durum, koul deyiminin i <= sayilarim.Length yerine i < sayilarim.Length olarak yazlmasndan kaynaklanr. Dng bu ekilde drt deer iin de alr ve dizideki btn elemanlarn deerl eri elde edilmi olur. Not : Ayrca indeks deikenini kendin tanmlayarak while dngs yardmyla, dizi ierisindeki btn elemanlara ulaman mmkndr.

Dizi Elemanlarn foreach Dngs ile Elde Etmek C#, dizilerin ierisinde dnp deerlerini elde etmek iin bir yol daha nerir: foreach dngs.
7 / 36

foreach (int gecici in sayilarim) { Console.WriteLine(gecici); } foreach dngsnde tanmlanan dng deikeni otomatik olarak dizideki her eleman srayla elde eder. Dngnn ilk iterasyonunda (ilk turunda) bellee karlan deikenin tipi, dizinin elemanlar ile ayn tipinde olmaldr. foreach, arka tarafta kendi algoritmas ile her iterasyonda dizinin bir elemann okuyup bellekteki geeci deikene atar. Ardndan dng blou ierisinde deikenin o anki deeri okunur. foreach, dizideki deerleri okuma iini 0. indeksten balayp eleman says 1nci indekse kadar srayla yapar. for dngsnde dnlmesi gereken ayrntlar foreachde olmad iin dizinin btn elemanlarn okumada tercih edile bilir.

Yine de bir dizinin elemanlar elde edilmek istendiinde for dngs nn daha kullanl olduu alanlar vardr. foreach deyimi her zaman btn diziyi dner. Eer sadece dizinin belli bir blm elde edilmek isteniyorsa (mesela yars) ya da belli deerler atlanmak isteniyorsa (Mesela her 3 elemandan biri) bunu for kullanarak yapmak ok daha kolaydr. foreach deyimi her zaman dizinin 0.indeksinden eleman says 1.nci indeksine doru alr. Dolaysyla eer dizinin deerleri tersten okunmak istenirse for dngsn kullanmak gerekir. Eer dng blou ierisinde sadece dizideki elemann deeri deil indeks says da istenirse, bu destei salamak iin for dngs kullanlmak durumundadr. foreach dngs ile bu destei salamak iin ekstra bir indeks deikeni oluturulup her turda arttrm ilemleri yaplabilir. Eer dizi elemanlarnn deerleri bir dng ierisinde gncel lenmek istenirse, for dngs kullanlmak zorundadr. nk foreach deyimindeki dng deikeni, dizideki her bir elemann sadece okunabilir kopyasn elde eder. Bu yzden de dizi elemanlarnn deeri foreach dngs ierisinde deitirilemez.

Foreach dngs, sadece ileri ynl ve yalnz okunabilir bir teleme hareketine izin verdiinden, ou durumda for dngsne gre daha performansl alr. rnek Uygulama Aada rnek bir uygulama bulunmaktadr. ncelikle kullancdan ka renci iin not girecei bilgisi alnr. Alnan bu bilgi ile bir dizi oluturulur . Dizinin dinamik oluan eleman says kadar kullancdan deer alnr. Kullancdan alnan deerler, dizinin elemanlar olarak srayla kaydedilir. Ardndan dizinin boyutu ve elemanlar toplu olarak kullancya gsterilir: ... //Kullancdan oluturulacak dizinin eleman says alnr... Console.Write("Ltfen renci saynz giriniz : ");
8 / 36

byte elemanSayisi = byte.Parse(Console.ReadLine()); byte[] notlar = new byte[elemanSayisi]; //Kullancdan alnp dng ierisinde diziye girilen deerleri tutacak //olan deiken tanmlanr. byte alinanEleman;

//Dng ierisinde kullancdan srayla notlar alnp bir deiken //araclyla diziye verilir. for (byte i = 0; i < notlar.Length; i++) { Console.Write("Ltfen {0}. rencinin notunu girip ENTER'a basnz : ",i + 1); alinanEleman = byte.Parse(Console.ReadLine()); notlar[i] = alinanEleman; } Console.WriteLine("Veri girii tamamland. Devam etmek iin ENTER'a basnz..."); Console.ReadLine(); //Kullancdan girileri aldktan sonra verileri grmek isteyip //istemedii sorulur. etiket: Console.Write("Girilen notlar grmek ister misiniz? [E] [H] : "); string devamMi = Console.ReadLine().ToLower(); //Kullanc eer [E] yazarsa, ona renci saysn ve notlarn gsterilir. //Kullanc eer [H] yazarsa, program sonlandrlr. //Kullanc eer [E] ve [H] dnda bir deer girerse, tercihi tekrar //sorulur... switch (devamMi) { case "e": Console.WriteLine("\n{0} rencinin notlar srasyla aadadr:\n",notlar.Length); foreach (byte gecici in notlar) { Console.Write(gecici + " "); } break; case "h": break; default: goto etiket; }

9 / 36

ETM : DZLER VE METOTLAR

Blm : Diziler ve Koleksiyonlara Giri Konu : Koleksiyonlara Giri

10 / 36

Diziler ok yararl programlama nesneleridir. Fakat baz snrlamalar vardr. Bunlardan birincisi dizilerin sadece tek tipten deerler kabul edebilmesidir. Ancak bu sorun yine dizilerle zmlenebilir. Biliyorsun ki object tipinden bir deiken .NET dnyasndaki btn tipleri zerinde tayabilmektedir. yleyse object tipinden oluturulan bir dizi ile tip snrlamas sorunu alabilir ve tek bir dizi ierisinde istenilen tipte deerler tanabilir: object[] karmaDizi = new object[] { 'A',1,true,"Emrah",0.45 }; Dizilerle ilgili ikinci sknt ise dizi lerin boyutudur. Bir dizinin boyutu, tanmlama srasnda verildikten sonra Array snfnn Resize adl metodu ile deitirilebilir. Ancak diziye her eleman eklenmesinde ya da diziden her eleman karlnda bu yenin arlmas gerekmektedir. Bu da skntc verici bir durumdur. C#, birden fazla deeri topluca saklamak iin bir programlama esi daha sunar: Koleksiyonlar (Collections). System.Collections isim alan altnda yer alan birok koleksiyon snf vardr. Koleksiyon snflar, her halkarda object tipinden deer alan tiplerdir. Dolaysyla her tipte deer kabul ederler. Ayrca koleksiyonlar herhangi bir boyut snrlamas olmayan diziler gibidir. Bir koleksiyon snf oluturulurken referans tipli olduu iin new anahtar kelimesi kullanlr. Herhangi bir eleman says bildirimi yaplmaz . Oluturulduktan ve elemanlar verildikten sonra istenildii zaman herhangi bir eleman koleksiyondan karlabil ir veya yeni bir eleman eklenebilir. Koleksiyon iinde yaplan deiikliklerde boyut dinamik olarak deiir. Ayrca btn bunlar tip snrlamas olmadan yaplr. Yazacan programlarda koleksiyonlarn kullanm alanlar iin yle gerek hayat rnekleri verilebilir : Web sitesi zerinden zgemi formu doldurma . Bu senaryoda istenen sayda eposta adresi girii yaplmas ve nceden says bilinmeyen e -posta adreslerinin tutulmas. renci bilgi sistemi uygulamasnda ders seimi. Bir niversite rencisi, web sitesi zerinden istedii dersleri seip kartrken, kod tarafnda dersler bir koleksiyonda tutulabilir. E-Ticaret uygulamasnda alveri sepeti. Ziyareti, sitede farkl sayfalarda gezerken (says nceden bilinemesi mmkn olmayan) istedii rnler i ekleyip karabilmesi iin bilgiler koleksiyon snflarnda saklanabilir. (Not : Bu senaryoda sayfalar aras bilgilerin tanmasn salamak iin ek zmlere de ihtiya olacaktr) En sk kullanlan koleksiyon tiplerinden biri ArrayListtir. Ayrca SortedList, Stack ve Queue dier koleksiyon snflarndan bazlardr. Bir koleksiyonun oluturuluu, deer atanmas, deerlerine eriilmesi ve btn deerlerinin elde edilmesi aadaki kod parasnda olduu gibi gerekletirilebilir: using System; using System.Collections; namespace Koleksiyonlar { class ArrayListKullanimi
11 / 36

{ public static void Main(string[] args) { //Koleksiyon snf oluturulur.. ArrayList koleksiyonum = new ArrayList(); //Koleksiyona object tipinden elemanlar eklenir. koleksiyonum.Add(1); koleksiyonum.Add("Emrah"); koleksiyonum.Add(25); koleksiyonum.Add(new DateTime(1982,2,2)); //Koleksiyon elemanlarna, dnm (cast) yaparak eriilir. nk koleksiyon ierisinde object tipi ile tutulurlar. string adi = (string) koleksiyonum[1]; Console.WriteLine("******Koleksiyondaki 1.indeksli elemana eriildi******\n" + adi); //Koleksiyondaki elemanlarn tmne eriilir : herhangi bir dng tr ile olabilir. Console.WriteLine("******Koleksiyondaki tm elemanlara eriildi******"); foreach (object gecici in koleksiyonum) { Console.WriteLine(gecici); } Console.ReadLine(); } } }

12 / 36

ETM : DZLER VE METOTLAR

Blm : Diziler ve Koleksiyonlara Giri Konu : Metot Nedir?

13 / 36

Metot Nedir? Neden htiya Duyarz?


Metotlar, bir kod blouna isim verip, uygulamann baka yerlerinde, o isimle arp yeniden kullanlmasna izin veren programlama eleridir. Her metodun bir ismi ve bir kod blou vardr. Metodun ad, amacna uygun olarak verilmelidir. rnein, bir snftaki rencilerin baar orannn hesaplamasn yapan bir metoda BasariOraniHesapla isminin verilmesi gibi. Verilen adla arldnda alacak kodlar kme parantezi { } blou arasnda yazlr. Baz metotlara kod blou ierisinde kullanmas iin girdi olarak veri aktarlabilir. Ayrca metot, ieride alan kodlarn sonucunda geriye bir bilgi dndrebilir. ounlukla bir metot geriye bilgi dndrdnde, bu ayn zamanda metodun almasnn sonu olur. Metotlar ok temel ve gl nesnelerdir. Kodun yeniden kullanlabilirliini salarlar. Ayrca tek bir yerden deiiklik yaparak, kullanld her yerde ak mantn deitirebilirler. Metotlar, sadece bir snf veya bir yap ierisinde oluturulabilirler. Bamsz olarak bir isim alan altna ya da snf veya yap dndaki bir tipin ierisine metot yazlamaz.

14 / 36

ETM : DZLER VE METOTLAR

Blm : Diziler ve Koleksiyonlara Giri Konu : Metot Oluturma Sz Dizimi

15 / 36

Bir C# metodu yazarken takip edilmesi gereken sz dizimi u ekildedir: erisimBelirleyici niteleyici donusTipi MetotAdi (parametre listesi) (varsa) (varsa) { //Metot arldnda iletilecek kodlar buraya yazlr. } Bir C# metodu arlrken kullanlacak sz dizimi ise udur. MetotAdi(varsa parametre deerleri); erisimBelirleyicisi, metotlarn dnda bir konudur. Bir metodun snf veya yap yesi olmasnn sonucu belirtilmesi gere ken bir anahtar kelimedir. C# dilinde be eriim belireyicisi vardr ve bu eriim belirleyiciler birer anahtar kelime ile temsil edilir. Burada eriim belirleyicilerin sadece iki tanesinden bahsedilecektir: Private ve Public. Private eriim belirleyicisi metodun sadece ierisinde yer ald snf veya yap yeleri tarafndan arlp kullanlabilmesini salar. public eriim belirleyicisi ise metodun her yerden (kendi yazdmz baka yap ve snflar da dahil) arlp mesini salar. Metot yazlrken eriim belirleyicisi belirtilmezse metodun eriim belirleyicisinin private olduu varsaylr. donusTipi, bir .NET tip addr. Metodun almas sonucu, kendisini arp kullanana gnderecei verinin tipini belirler. Bu tip int, string gibi nceden tanml tiplerden birisi olabilecei gibi kendi yazdmz her hangi bir tip de olabilir. Eer geriye deer dndrmeyen bir metot yazlyorsa bu ksma void kelimesi yazlmaldr. Mesela bir metot, kod blou ierisinde baz iler yaptktan sonra sadece ekrana bir eyler yazdryorsa, deer dndrmyor demektir ve dn tipi void olarak tanmlanr. Baka bir metot, ieride yapt bir hesaplama sonucunu arld ortama aktaryorsa aktard bilginin veri tipi neyse, dn tipi de o olacaktr (Metot ierisinde iki int tipli deikenin toplam, metodu kullanan ortama int dn tipiyle bir deer gnderebilir.) niteleyici, ileri seviye programlamada kullanlan static, abstract, sealed, virtual kelimelerinden birinin yerini tutar. (Bu anahtar kelimelerin kullanld konular, eitimin kapsam dnda kald iin static hari bu anahtar kelimeler anlatlmayacaktr.) MetotAdi, metot arlrken kullanlacak olan isimdir. Bu isim verilirken takip edilecek kural ve neriler deikenlerinki ile benzerdir. Sadece neriler ksmnda adn ba harfinin byk olmas, kod yazm standartlarna destek vermek adna tavsiye edilir (rnein deikenler iin girisSayisi iken, metotlar iin GirisSayisiniHesapla() olur). parametre listesi, opsiyoneldir; yani kullanlabilir de kullanlmayabilir de. Ancak her iki durum iin de metot adndan sonra al ve kapan parantezleri bulunma k zorundadr. Parametreler, metodun almas srasnda kullanlabilecek deerlerdir. Metodun yazm aamasnda sanki varm gibi kabul edilerek kullanlrlar. Gerek deerleri, metodun arld yerde verilir. Bu sayede son derece esnek bir uygulama gelitirme modeli sunarlar. Kullanlacak parametreler, metodun yazm aamasnda metot adndan sonra alan parantezin ardndan srayla tip ad ve deiken ad olacak ekilde tanmlanr. Parametreleri ayrmak iin, iki parametre arasnda virgl kullanlr. Metot blou, metot arldnda alacak olan kodlarn yazlaca yerdir ve ssl parantezlerle snrlanr { }.

16 / 36

ETM : DZLER VE METOTLAR

Blm : Diziler ve Koleksiyonlara Giri Konu : Metot Nasl Yazlr ve Nasl Kullanlr?

17 / 36

Aada basit bir metot rnei yer almaktadr:

Basit bir metot rnei Yukarda, geriye deer dndrmeyen ve arldnda sadece ekrana bir eyler yazdran MesajYazdir adnda bir metot tanmlanmaktadr. Geriye deer dndrmedii iin dn tipi olarak void anahtar kelimesi belirtilmitir. Bir metot sadece snf ya da yap ierisine yazlabilir. Bu metoda baktmzda MetotKullanimi snfnn ierisinde yazld ve dolaysyla bu snfn bir yesi olduu grlr. Ayrca metodun, static niteleyicisi ile yazld grlmektedir. Main metodunun bulunduu snf ierisine bir metot yazlrsa, dorudan metot adyla eriim iin static niteleyicisinin kullanlmas gerekmektedir. Bu kural test etmek iin, static kelimesini kaldrp, uygulamay yeniden altrmay deneyebilirsin. Bu durumda derleme zaman hatas alnr. Bu kelimenin srece katt gerek anlam, snf kavram detaylaryla renildiinde daha kolay anlalacaktr. MesajYazdir isimli metodun, Main() ierisinde arlmas sonucu oluan ekran kts aadadr. (u ana kadarki btn rnekler Main() metodu ierisinde yazlmtr. Bunun sebebi Main() in uygulamann balang noktas olmasdr. Bu yzden metodun arld yer yine Main()in iidir).

Metot rneinin almas Metotlarn ierisinde yazlacak kodun satr snr yoktur. stenilen programlama grevi, bir metot ierisinde kodlanabilir. Ancak satr says ok fazla ise yaplan ileri farkl metotlara blmek daha faydal olacaktr. Yazlan herhangi bir kod blounu, uygulamann birok yerinde kullanma ihtiyac olduunu dnelim. Bu kodlar her ihtiya
18 / 36

duyulduunda tekrar tekrar yazmak yerine, bir defa metot ierisine yazmak daha uygun olacaktr. Daha sonra ihtiya olan yerlerde, metodun adyla ar yaparak bu kod blounun almas salanr. Bu durum, ayn zamanda program kodunun daha rahat okunabilmesine, optimize edilebilmesine ve bakmnn kolayca yaplabilmesine de olanak salar. rnein uygulamann eitli yerlerinde gncel tarih ve saat kullancya gsterilmek istenirse ilgili kodu aadaki gibi her yere yazmak tercih edilmez. static void Main(string[] args) { Console.WriteLine(DateTime.Now); //... Console.WriteLine(DateTime.Now); //... Console.WriteLine(DateTime.Now); Console.Read(); } Bunun yerine gncel tarih ve saati gsteren kod bir metot ierisine yazlr ve istenilen yerde metot arlr. (Kodun Tekrar Kullanlabilirlii Code Reusability) ... static void TarihGoster() { Console.WriteLine(DateTime.Now); } public static void Main(string[] args) { TarihGoster(); //... TarihGoster(); //... TarihGoster(); Console.Read(); } ... Metot ierisindeki kod biraz daha uzun olduunda tabi i ki daha anlaml olacaktr.

Bu yaklamn bir kazanc daha vardr. Kodda bir deiiklik yaplmak istendiinde eer metot kullanlmam ise; bu deiikliin kodun yazld her yerde ayr ayr yaplmas gerekir. Fakat metot kullanlmsa; deiiklik sadece bir yerde yaplr ve metodun kullanld her nokta bu deiiklikten otomatik olarak etkilenir. (Kodun bakm kolayl Code Maintability)
19 / 36

Buraya kadar kendi metotlarmz nasl yazp kullanabileceimizi inceledik. Ayn zamanda eitimin bu blmne gelene kadar faydalanlan metotlar var. rnein programn balang noktas olan Main() metodunu incelendiimizde, normal bir metotta olmas gereken hereye sahip olduu grlr. Baka bir rnek olarak metodlarn bir snf(class) ya da yap(struct) yesi olabilecei bilgisinden yola karak; WriteLine() ve ReadLine() metotlar gz nne alnabilir. Console snfnn yesi olan bu metotlar ve nceden tanml snf ve yaplar ierisinde yer alan pek ok dier metot, .NET platformu iin gelitirilmitir. Bu metotlar, programclarn ihtiyac olan fonksiyonellikleri karlamak zere tasarlanmlardr.

20 / 36

ETM : DZLER VE METOTLAR

Blm : Diziler ve Koleksiyonlara Giri Konu : Return Anahtar Kelimesi

21 / 36

Bir metot ierisindeki kodlarn almas varsaylan olarak , blok sonuna yani kme parantezi kapanna gelindiinde sonlanr. Ardndan kod ak metodun arld yere geri dner. Eer metodun son deyimi beklenmeden sonlanmas istenirse return anahtar kelimesi method ierisinde herhangi bir noktada kullanlabilir. ... static void GununSozunuVer() { Console.WriteLine("Btn renkler hzla kirleniyordu; beyaza verdiler"); return; Console.WriteLine("Szn sahibi : zdemir Asaf"); } public static void Main(string[] args) { GununSozunuVer(); Console.ReadLine(); //Uygulama F5 ile altrldnda konsol //ekrannnn hemen kapanmamas iin yazlr. } ... GununSozunuVer metodu, Main() metodu ierisinde arlp altrlr. Elde edilen ktda; return anahtar kelimesinden sonra ekrana yazdrlmak istenen Szn sahibi : zdemir Asaf ksm yer almaz. nk return kelimesinin grlmesiyle birlikte metodun almas sonlanr.

birincilii

return anahtar kelimesinin kullanm Bu rnekteki gibi bir kullanmn anlamnn olmad dnlebilir. almayacan bile bile neden return anahtar kelimesinden sonra kod yazalm ki diye dnebilirsiniz. O yzden return anahtar kelimesini, if ya da switch gibi koullu deyimin bir paras olarak kullanmak daha uygun olacaktr. Yani belli bir koul salanrsa metodun sonlanmas beklenmeden klmak istendiinde return anahtar kelimesinden faydalanlabilir. static void OdulVer() { Console.WriteLine("Eer ortalaman 70 in zerinde ise Antalya tatilini hakkettin.\n"); int ortalama = 75; if (ortalama > 70) { Console.WriteLine("Ortalaman : {0}...\nNe zaman istersen tatile kabilirsin.\nnk ok alarak bunu hakkettin...", ortalama);
22 / 36

return; } Console.WriteLine("Ortalaman : {0}...\nMaalesef tatil frsatn kardn.\nok almak lazm, ook...",ortalama); } public static void Main(string[] args) { OdulVer(); Console.ReadLine(); } Yukardaki kod blounda ortalama deikeninin alaca deer 70in zerinde ise ekrana bir eyler yazlacak . Ardndan return deyimi alaca iin metodun almas sonlanacaktr. return deyiminden sonra yazlan kodlar almaz. Eer ortalama deikeninin deeri 70 ya da 70den kk ise kod ak, return deyiminin bulunduu if blouna girmez. Bundan dolay returnden sonraki kodlar alr. Bu kod, ortalama deikeninin deeri ile oynanarak test edilebilir.

return anahtar kelimesi ile metodu, kme parantezi kapanna gelmeden sonlandrmak

return ile Bir Deer Dndrmek


u ana kadar rendiklerin dorultusunda, return deyimini metodun sonunda kullanmann ok da anlaml olmayacan dnebilirsin. Zaten metodun sonuna gelindiinde almas sonlanr. Fakat, metodun altnda kendisini aran kullancya bir deer gndermesi gerektiinde, return deyiminin metodun sonunda kullanlmas daha anlaml olur. Metodun arld yerde kullanlmak zere, metot ierisinde yaplan ilerin sonucunda oluan bir deere ihtiya duyulabilir. Bu deeri ele alp baka ilemlerin yaplmas istenebilir. te bu deer metodun sonunda return ifadesinden hemen sonra kullanlarak, ar yaplan yere gnderilebilir. rnein, metot ierisinde tanmlanan ve deeri verilen iki deikenin toplamnn hesapladn dnelim. Yaplan ilemlerin arkasndan return deyimi ile sonuc deikeninin deeri, metodun kullanld yere dndrlebilir. Burada dikkat edilmesi gereken bir nokta vardr. Hatrlarsanz bu konunun banda metot sz dizimi anlatlrken, donusTipi kavramndan bahsedilmitir ve u ana kadar yazlan metotlarda sadece konsol ekranna bireyler yazdrld iin sadece void anahtar kelimesi kullanlmtr. Az nce bahsedilen senaryo iin ise dn tipi void deil; return ile dndrlecek deere uygun bir veri tipi olmaldr: static int Hesapla() { int a = 2; int b = 21; int sonuc = a + b; return sonuc; }

23 / 36

Metot, yukarda belirtildii gibi iki deikenin deerini toplayp nc bir deikene atar ve kendisini arann bu deeri elde edebilmesi iin sonuc isimli deikeni dndrr. Metot darya bir deer dndrd ve sonuc isimli deikenin tipi int olduu iin metodun dn deeri artk void olamaz. Dn deeri int olarak tanmlanmaldr. Bir metodun dn tipini belirlerken, deikenlerde yer alan byk tr ve kk tr arasndaki dnm kurallar geerlidir.

imdi de bu metodun Main() ierisinde arlp, dn deerinin ele alnn grelim: public static void Main(string[] args) { int metottanGelenDeger = Hesapla(); Console.WriteLine("Metodun almas sonucu metodu kullanana dndrd deer : {0}",metottanGelenDeger); Console.ReadLine(); }

return anahtar kelimesi ile darya deer dndrmek Dn deeri void iken, ihtiya duyulduu yerde sadece metodu armak yeterlidir. public static void Main(string[] args) { Hesapla(); Console.ReadLine(); } Fakat, dn deeri int olan Hesapla() metodunda, bu ekildeki kullanmn bir anlam yoktur. nk metodu yazarken amacmz, metodun arld yere, yaplan ilemin sonucunu dndrmektir. Sadece metodu armakla, ierde yaplan ilemin sonucunu elde edemeyiz. Bu yzden, metodun geri dn deeri ile ayn veri tipinde (burada int) bir deiken oluturmak ve deikenin balang deerini metottan almak gerekir. Yukardaki kodda bu deiken, metottanGelenDeger dir. Deiken ilk deer atamas srasnda, atama operatrnn sanda bir metot bulunmas ilgin gelebilir. Geri dn deeri olan bir metodun kullanc iin anlam, dndrd deerdir ve bu deer doru tipte bir deiken zerine atanabilir. Visual Studio uygulama gelitirme ortam da (IDE Integrated Development Environment-) buna destek verir. Bir metodu kullanmak isteyen programcnn o metodu nasl ele alaca konusunda yardmc olmak iin metodun geri dn deerini gsterir.

24 / 36

.NET uygulama gelitirme ortamnn metodun geri dn tipini kullancya gstermesi Metodun arld yerde ad yazlrken veya yukardaki gibi yazldktan sonra imle ile zerine gelindiinde , en bata metodun geri dn tipini grebiliriz. Buna gre eer dn tipi void ise sadece metodu arrz. Dn tipinin void dnda herhangi bir veri tipi olmas durumunda ise, uygun tipte bir deiken tanmlayp, dn deerini bu deiken zerine alrz. Bir metodun geri dndrebilecei veri tipi nceden tanml tiplerden biri olabilecei gibi, kendi yazdmz bir tip de olabilir.

25 / 36

ETM : DZLER VE METOTLAR

Blm : Diziler ve Koleksiyonlara Giri Konu : Parametre Alan Metotlar

26 / 36

Parametreler, metot ierisinde yaplacak ilerde kullanlmak iin dardan alnan deerlerdir. Metot oluturulurken metot adndan sonra gelen parantezlerin ierisinde bildirilir. Bu noktaya kadar, rneklerde parametre kullanlmamtr. Her parametre, metoda tipi ve deiken ad ile bildirilir. Bu parametreler metot ierisinde lokal deiken gibi kullanlr. Metoda birden fazla parametre atanaca zaman, parametrelerin virgl ile ayrlarak bildirilmesi gerekir. static int Hesapla(int a,int b) { int sonuc = a + b; return sonuc; //Dorudan a + b de return edilebilirdi. } Yukardaki metot, int tipinde iki tane parametre al yor. Bu parametreler, a ve b adlaryla metot ierisinde istenildii gibi kullanlabilir. rnekte bu iki deiken bir aritmetik ileme tabi tutuluyor. lem sonucu, baka bir deikene ilk deer olarak atanyor. Sonrasnda da bu yeni deikenin deeri, metodun dn deeri olarak kullanlyor. Bu metodun kullanl aadadr: public static void Main(string[] args) { int toplam = Hesapla(5, 7); //Artk metodun dn deeri toplam isimli deiken zerinde Console.WriteLine("Parametreli metottan elde edilen toplam 5 + 7 = " + toplam); } Hesapla() metodu yazlrken parantez ierisinde bildirilen iki tane int tipli deiken, kod blou ierisinde sanki varm gibi kullanlr. Bu yaplrken deerleri ne olursa olsun metodun alaca varsaylr. Deerlerin toplam metodun geri dn deeri olarak baka bir deikene atanr. Metot arlrken iki parametre deikeninin almas istenen deerler, metodu aran tarafndan verilir. Bu deerler, metodun kod blou ierisinde a ve b adyla kullanlr. Gerekli hesaplamalar yaplp geri dn deeri elde edilir. Parametrelerin deerleri, metodun her arlnda deiik olabilir. Hesapla() metodu da her seferinde kendisine verilen farkl deerlerin toplamn geri dndrr. Bu metodun kts aadadr:

Parametre alan bir metodun altrlmas Parametre alan metotlarn bir dn deeri olmas zorunlu deildir. static void SelamVer(string ad) { Console.WriteLine("Merhaba {0}",ad); } Yukardaki metot string tipinde bir parametre alr. Kod blou ierisinde parametrenin deerinin bana bir yaz getirilerek ekrana yazdrlr. Bu metodun kullanl aadaki gibidir:

27 / 36

public static void Main(string[] args) { SelamVer("Emrah"); Console.ReadLine(); } Bu metodun almasyla elde edilen kt aadadr:

Dn deeri olmayan parametrik bir metot Aadaki metot, bu konunun son rneidir. static bool UyeKontrol(double id, string kullaniciAdi) { if ((id == 12345678) && (kullaniciAdi == "emrhsl")) { return true; } else { return false; } } Bu metot, biri double dieri string tipinde iki tane parametre alr. Bu parametreler ile bir kullancnn web sitemizin kaytl bir yesi olup olmadnn kontrol edildiini varsayalm. Bu rnek siteye, sadece idsi 12345678 ve kullaniciAdi emrhsl olan kullanc kabul edilsin. Aadaki ekilde bir metot ars yaplp kullanlabildiini dnelim. Metodu arrken, metodun ka tane ve hangi tipte parametre bekledii de intelli-sense zellii sayesinde grlebilir:

Metot arlnda istenen parametrelerin IDE tarafndan gsterilii

28 / 36

Bu metodun geri dn tipi booldur. Alnan parametrelerin her ikisi de metot ierisinde kontrol edilen deerler ile ayn ise true; farkllk olmas durumunda ise false deer dnecektir. yleyse metot arlp, parametreleri verildikten sonra geri dn deeri bool tipte bir deiken zerine alnp kontrol edilmelidir. public static void Main(string[] args) { bool uyeMi = UyeKontrol(87654321, "lshrme"); if (uyeMi == true) { Console.WriteLine("Login oldunuz..."); } else { Console.WriteLine("Id ya da kullanc ad yanl"); } Console.ReadLine(); } Metot, parametreleri verilip arlr ve geri dn deeri bir deiken zerine alnr. Verilen parametre deerleri metot ierisine yerletirilip gerekli koullar kontrol edilir. Koullar salanmad iin metottan geriye false dner. Main() ierisinde yaplan ise bu deikenin deerine bal olarak kullancya bir mesaj gstermekt ir.

29 / 36

ETM : DZLER VE METOTLAR

Blm : Diziler ve Koleksiyonlara Giri Konu : Metotlara Parametre Aktarma Yntemleri

30 / 36

Deer Yolu ile Parametre Aktarmak


Metot parametreleri metoda aktarlrken varsaylan olarak deer yolu ile geirilirler. Yani, metot arldnda parametre olarak geirilen bir deikenin deerinin kendisi deil kopyas oluturulup metoda zel olarak kullanlr. Metodun almas bitince de, bu kopya yok edilir. Bu durumu gzlemlemenin en gzel yolu aadaki trde bir metottur. static void BirEkle(int x) { x++; //x'in deerini 1 arttrr. } BirEkle() metodu yardmyla parametre olarak vereceimiz bir deerin gerekten kendi deerinin mi artrlacan yoksa bu artn sadece metot ierisinde kalp sonra yok mu edilecei incelenebilir. public static void Main(string[] args) { int k = 6; BirEkle(k); Console.WriteLine(k); Console.ReadLine(); } Bu metodun altrlmasyla elde edilen kt aadadr:

Parametrenin, metoda deer yolu ile geirilii Main() ierisinde tanmlanan k isimli deikene balang deeri olarak 6 verilir . Ardndan bu deiken BirEkle() metoduna parametre olarak gnderilir. Bu aamada k deikeninin deerinin bir kopyas (x) bellekte metot ierisinde oluturulur. k deikeninin orjinal deeri ise bellein ayr bir blgesinde hala yerini ve deerini korur. Metot iin oluturulan bellek blgesine, k deikeninden elde edilen 6 deeri kopyalanr . Metot ierisinde kopya deikenin deeri bir arttrlp 7 yaplr. Metot sonlandnda ise bu deiken bellekten der. k deikeni ise hala ilk tanmland gibi 6 saysal deerine sahiptir.

Referans Yolu ile Parametre Aktarmak


Metot arldnda parametre olarak geirilen bir deikenin deerinin kendisi kullanlr. Deer y olundaki gibi bellekte yeni bir alan oluturulmaz. Bir baka deyile metoda, ilgili parametrenin bellekteki referans aktarlmaktadr. Bir nceki rnek, referans yolu ile parametre geirmeyi temsil etmek iin kullan labilir. Bir parametreyi metoda referans yolu ile geirmek iin hem metodun yazlnda hem de arlnda parametrenin ve deerin nne ref anahtar kelimesi koyulur.

31 / 36

static void BirEkle(ref int x) { x++; //x'in deerini 1 arttrr. } public static void Main(string[] args) { int k = 6; BirEkle(ref k); Console.WriteLine(k); Console.ReadLine(); } Main() ierisinde tanmlanan ve balang deeri 6 olarak verilen k deikeni, bellekteki adresi ile birlikte metoda parametre olarak geirilir. Bu durum, parametrenin bana getirilen ref anahtar kelimesi ile salanr. Dolaysyla kod blou ierisinde yaplan art bu bellek blgesini etkiler ve metot arsnn ardndan sorgulanan knn deeri 7 olarak elde edilir.

Parametrenin, metoda referans yolu ile geirilii

Output Yolu ile Parametre Aktarmak


Metoda parametreyi output yoluyla geirmek, kavramsal olarak referans yolu ile parametre geirmeye benzer. ref anahtar kelimesi yerine hem metot yazlnda, hem de metot armnda ilgili parametrelerin bana out anahtar kelimesi getirilir. out parametresinin tek fark metoda parametre olarak geirilen deikenin balang deerinin verilmesine gerek olmamasdr. ref anahtar kelimesi kullanldnda ilgili deiken metoda aktarlmadan nce mutlaka ilk deer almaldr. static void KaresiniVer(int a,out int sonuc) { sonuc = a * a; } public static void Main(string[] args) { int kok = 5; int karesi; KaresiniVer(kok, out karesi); Console.WriteLine("5 in karesi : {0}",karesi); Console.ReadLine(); } Bu rnekte, KaresiniVer() metodu iki tane parametre kabul eder. Bu parametrelerden ilki karesi alnacak deerdir. Dieri ise, hesaplanan karenin deerini darya (metodu arana) gndermek iin kullanlacak olan
32 / 36

out parametresidir. Kod blounda sonuc isimli out parametresine a parametresinin karesi hesaplanp atanr. Dikkat edilirse metot geriye hibir deer dndrmez gibi grnr. Fakat, aslnda out parametresi sayesinde ierde hesaplanan bu parametrenin deeri darya karlr. Bu bilgiler nda unlar syleyebiliriz. Main() metodu ierisinde KaresiniVer() metodu arlr. 5 deeri verilen kok deikeni ile balang deeri verilmeyen ve out olarak iaretlenmi sonuc deikeni, bu metoda parametre olarak geirilir. Burada gzlemlenmesi gereken, metoda parametre olarak geirilirken out parametresinin bellekte yeri ayrl olmasna ramen henz deerinin olmamasdr. Metot ierisinde bu bellek alanna 5 deerinin karesi 25 atanr ve bu deerin metot dnda da eriilebilir olduu ekrana yazdrlp grlr.

Parametrenin, metoda out yolu ile geirilii Referans(ref) ve Output(out) yoluyla metotlara deer aktarma sayesinde, bir metottan geriye birden fazla deer dndrlebilir.

params Anahtar Kelimesinin Kullanm


Baz durumlarda metot yazlrken metodu arann ka tane parametre geirecei nceden belli olmayabilir . u ana kadar renilen bilgilerle bu ihtiyac karlayacak bir zm yoktur. Ancak, metotlara herhangi bir tipten bir dizi aktarlmas halinde bu sorun ksmen de olsa alabilir. Bu i iin, metoda parametre olarak dizi alnmas ve parametrenin nne params anahtar kelimesinin getilmesi yeterlidir: static void ParametreSayisiniVer(params int[] dizim) { Console.WriteLine("{0} adet parametre girdiniz...",dizim.Length); } Yukardaki metodun arld noktada, int tipinde, ihtiya duyulan sayda parametre aktarm gerekletirilebilir. Parametreler verilip uygulama altrldnda, parametre deerlerinden oluan dizim adndaki dizi hafzada oluturulur. Bu sayede metot ierisinde bu dizi ele alnabilir. ParametreSayisiniVer() metodu ierisinde girilen parametrelerin says kullancya sylenir. public static void Main(string[] args) { ParametreSayisiniVer (3, 4, 5, 6, 2, 5, 45, 4, 3, 2); Console.ReadLine(); }

33 / 36

Bu metodun arlmasyla elde edilen kt aadadr:

Parametreler, metoda geirilirken params anahtar kelimesinin Kullanl imdi sra sizde; Siz de params anahtar kelimesi kullanarak, kullancnn belirledii sayda tam say tipinde parametre alp ilem yapan bir method yazabilirsiniz. Parametre olarak ald saylarn toplamlarn ve ortalamalarn bulan bir metot , gzel bir rnek olacaktr.

34 / 36

ETM : DZLER VE METOTLAR

Blm : Diziler ve Koleksiyonlara Giri Konu : Not

35 / 36

Metot erisinde Kullanlan Deikenler


Gerek metoda alnan parametreler, gerekse metot ierisinde oluturulan deikenler; metot, alma zamannda arld zaman bellee alnrlar. Metodun almas sona erdiinde de bellekten derler. Bu deikenler sadece tanmlandklar metot ierisinde kullanlabilirler. Dolaysyla uygulamann baka herhangi bir yerinden bu deikenlere erimek mmkn deildir. Bu deikenler, metot her arlnda yeniden oluturulur ve yok edilirler. Dolaysyla bu deikenler zerindeki deerler metodun bir sonraki arlnda elde edilemezler. Ayrca metot ierisinde kullanlan bir deiken ad, baka bir metot ierisinde de kullanlabilir. nk her bir deiken kendi blouna zeldir.

Bu ders notu, Ak Akademi projesi erevesinde TCM tarafndan Microsoft Trkiye iin hazrlanmtr. Tm haklar Microsoft Trkiye ye aittir. zinsiz oaltlamaz, para ile satlamaz.

36 / 36

You might also like