Jump to content

Metodlar Ve Aşırı Yükleme


wmismail

Recommended Posts

Tüm yazilimci arkadaşlara selamlar,

Bu makalemde Csharp metodlarindan ve asiri yükleme konularindan bahsedecegim.

1000000605_Board.gifMetod

Bir objenin veya sinifin belli işlemleri/hesaplamalari gerçeklestirmesi için kullandigi bir üyedir.Yazim kurali asagidaki gibidir.

1000000605_Pencil.gifSyntax

Attributes(opt) Method-Modifiers(opt) Return-Type Member-Name (Parameter-List(opt))

Özellikler(opsiyonel) Erisim-Belirleyiciler(opsiyonel) Geri-Dönüs-Tipi Üye-Ismi (Parametre-Listesi(opsiyonel))Attributes (Özellikler): Opsiyoneldir.Metodun özellik bilgilerini içerir.Bu konu hakkında ilerleyen zamanlarda ayri bir makale yazacagim.

Method-Modifiers (Erisim Belirleyiciler): Opsiyoneldir.Metodun tipini amacini belirlerler.

Seçenekler: new - public - protected - internal - private - static - virtual - sealed - override - abstract - extern

Return Type (Geri Dönüs Tipi): Gereklidir.Metodun geri dönüs tipini belirler.Bu ya bir tür(string bool) olabilir ya da void olacaktir.

Member Name (Üye Ismi): Gereklidir.Metodun ismini belirler.

Parameter List (Parametre listesi): Opsiyoneldir.Metod'a gönderilecek degiskenlerin türlerini ve hafizada olusturma biçimlerinin belirlendigi yerdir.

Metod tanimlama ile ilgili bazi kurallar mevcuttur.Bunlar;

1000000605_Can.gif Programimizin baslangiç noktasi olan Main metodunu ikinci kez kullanamayiz.

Metod isimleri nümerik karakter ile baslayamaz.

Metod ismi büyük küçük harf duyarlidir.

Metod isimlerinde bosluk kullanilamaz.

Metodun geri dönüs değeri yoksa void anahtar sözcügü kullanilmalidir.

Metodlarin parametre bilgisi eksiksiz girilmelidir.

Bir metod blogu içinde baska bir metod tanimi yapilamaz.

Metodun geri dönüs değeri ile return anahtar sözcügü ile döndürülen tür ayni olmalidir.Bütün bu açiklamalardan sonra bir örnek vererek devam edelim.

1000000605_Board.gifMetod Örnekler

private void ÖrnekMetod()

{

Console.Writeline("Bu metod mevcut kod blogu içinde erisilebilirdir ve geri dönüs tipi void dir.");

}

public void ÖrnekMetod1()

{

Console.Writeline("Bu metod hem mevcut kod blogu içinden hem de bagli sifin olusturuldugu ortamdan erisilebilir ve geri dönüs tipi void dir.");

}

private bool ÖrnekMetod2()

{

Console.Writeline("Bu metod kod blogu içinden erisilebilir ve geri dönüs tipi bool(true/false) dir.");

}

private int ÖrnekMetod3(string strDegisken)

{

Console.Writeline("Bu metod kod blogu içinden erisilebilir ve geri dönüs tipi int dir.Parametre olarak string bir degisken alır.");

}işterseniz simdi biraz "method modifiers" lardan bahsedelim.Burda sadece iki modifierler hakkında bilgi verecegim.Digerlerini ilerleyen makalelerde görecegiz.

Private: Metodun tanimlandigi sinif içinde erisilebilir.

Public: Hem metodun tanimlandigi sinif içinde hem de metodun bagli oldugu sinifin tanimlandigi ortamdan erisilebilir.

(Eger herhangi bir method modifier belirtilmezse, metod bulundugu blok içinde erisilebilir (private) olur)

Erisim alanlarini daha iyi anlamak için asagidaki resme bakabilirsiniz.

1000000605_MetodOrnek.jpg

Burda iki sinifimiz mevcuttur.Class1 ve Class2

Class1 'in üyeleri OrnekMetod ve OrnekMetod1

Class2'nin üyeleri gene OrnekMetod ve OrnekMetod1 dir.

Burda fark class2 sinifinin b ir public metodunun olmasidir.

Bu kodu kendi gelistirme ortaminiza aktarin.

Kirmizi diktörtgen ile isaretlenmis satirda c2 yazip . (nokta)'ya bastiginizda intellisense

size c2 sinifinin üyelerini getirecektir.Bunlar arasinda sadece OrnekMetod1 gözükecek OrnekMetod gozukmeyecektir.

Bunun sebebi iki metodun erisim belirleyicilerinde gizlidir.Public olarak tanimlanan metod disardaki bir ortamdan erisilebilmektedir.

Bunun yanisira Class1 blogunda mavi dikdörtgen ile isaretlenmis koda baktiginizda private olan OrnekMetod metoduna Class1 içinden erisebiliyoruz.

Simdi isterseniz parametrelerden bahsedelim.Bazen yazacagimiz metodlara yapacagimiz işlemlerle ilgili değerler göndermemiz gerekir.Bunun için public degiskenleri kullanmamiz yapi açisindan ters olacak, gereksiz kaynak tüketimine sebep olacaktir.işte bu tür durumlarda parametreler devreye girer.

Metodlar bir veya birden fazla degisik türden parametre alabilirler.Gerçek hayattan bir örnek vermemiz gerekirse bir matematik işlemi için bir sinif tasarladigimizi ve bu sinifin "Topla" isminde bir metodu oldugunu düsünürsek, toplanacak iki sayinin bu metoda parametre olarak gönderilmesi iyi bir örnek olacaktir.

Örnegi inceleyelim.

1000000605_Board.gif using System;

namespace MatematikIslemlerimiz

{

class Class1

{

static void Main(string[] args)

{

MatematikIslemleri Mat=new MatematikIslemleri();

Console.WriteLine("5+6=" + Mat.Topla(5,6).ToString() );

Console.WriteLine("5-6=" + Mat.Cikar(5,6).ToString() );

Console.WriteLine("5*6=" + Mat.Carp(5,6).ToString() );

Console.WriteLine("5/6=" + Mat.Bol(5,6).ToString() );

}

}

class MatematikIslemleri

{

public MatematikIslemleri()

{}

public int Topla(int intdeğer1,int intdeğer2)

{

return intdeğer1+intdeğer2;

}

public int Cikar(int intdeğer1,int intdeğer2)

{

return intdeğer1-intdeğer2;

}

public int Carp(int intdeğer1,int intdeğer2)

{

return intdeğer1*intdeğer2;

}

public int Bol(int intdeğer1,int intdeğer2)

{

return intdeğer1/intdeğer2;

}

}

}Görmüs oldugunuz üzere Matematik işlemleri için yazmis oldugumuz metodlar int türünden parametreler almaktadir ve bu degiskenlerin ömürleri metod blogu ile sinirlidir.

1000000605_Can.gif Parametrelerin ref ve out anahtar sözcükleri ile isaretleyerek hafizada ne sekilde konumlanacagini ayarlayabiliriz.

using System;

namespace MatematikIslemlerimiz

{

class Class1

{

static int intA=1;

static void Main(string[] args)

{

Console.WriteLine("Islem baslangici değer = " + intA);

for (int intR=0;intR<10;intR++)

{

Arttir(ref intA );

}

Console.WriteLine("Islem sonucu değer = " + intA);

}

static void Arttir(ref int intArttir)

{

intArttir+=intArttir;

}

}

}

Örnekte gördügünüz gibi ref anahtar sözcügü ile metoda değerin hafizada bulundugu adres gönderilmekte ve bu sayede değer üzerinde yapilacak degisiklikler direkt olarak dis bloga da yansimaktadir.

ref ve out arasindaki fark ise obje türünden degisken bildirimlerinde ref kullanilirsa objenin yaratilmis olmasi gerekmektedir out ta ise bu zorunluluk yoktur. Peki, eger metoda gönderecegimiz parametrelerin sayisi belli degilse?Mesela Topla metodu 2 adet int türünden parametre almaktadir.Eger biz 3 sayiyi toplamak istersek ne yapacagiz.

işte bu tür durumlarda metoda parametre olarak dizi göndermemiz iyi bir çözüm olacaktir.

1000000605_Board.gif public int Topla(params int[] intdeğerler)

{

int intToplam=0;

foreach (int intdeğer in intdeğerler)

{

intToplam+=intdeğer;

}

return intToplam;

}Bu yöntemi kullanarak artik Topla metoduna degisken sayida parametre gönderebiliriz.

Overloading de nedir?

Gelelim beklenen konuya.Overloading (Asiri yükleme)

Nedir bu overloading? Bazi tasarimlarda bir metod'un alacagi parametre türü ve sayisi degisebilir.Çogunuz peki neden params'i kullanmiyoruz diyebilir.

Eger degisik türden parametreler kullanmayacak olsaydik params uygun bir çözüm olacaktir.Fakat int double bool string türlerini ayni anda kullanamayiz.

Bunun için c# overloading karamini desteklemektedir.

Bir önceki örnegimizde Topla metodu nu ele alalim.Parametre int türünden.Mevcut senaryoda double türünden iki degiskeni toplamak istedigimizde mevcut metod yetersiz kalacaktir.işte bu tür durumlarda Topla metodunu asagidaki gibi asiri yüklüyoruz.

1000000605_Board.gif public int Topla(int intdeğer1,int intdeğer2)

{

return intdeğer1+intdeğer2;

}

public double Topla(double dbldeğer1,double dbldeğer2)

{

return dbldeğer1+dbldeğer2;

}Farkindaysaniz metod kurallarinda ayni isimli iki metodun kullanilamayacagindan bahsetmistik.Peki nasıl oldu da derleyici bu kodda hata vermedi?

C# metodlarin bütünlügünü kontrol ederken her metod için bir imza yaratir.Bu imza yaratilirken metodun ismi, aldigi parametreler kullanilir.Metodun geri dönüs değeri ve params ile isaretlenmis parametreler imza'ya dahil edilmezler.

Asagidaki örnegi inceleyelim.

1000000605_Overload.jpgGörüldügü gibi metodlarin isimleri ayni fakat imzalari farklı oldugu için c# bu metodun asiri yüklendigini kabul edecektir.

c#'da topla metodunu çagirdigimizda intellisense özelligi devreye girecek ve bize overload edilmis metodun alabilecegi parametre kombinasyonlarini siralayacaktir.

1000000605_intelli1.JPG

1000000605_intelli2.JPGEvet bir makalenin daha sonuna geldik.Biraz uzun oldu ama umarim yararlı olmustur.

Hepinize mutlu günler dilerim.

Link to comment
Share on other sites

Archived

This topic is now archived and is closed to further replies.

  • Recently Browsing   0 members

    No registered users viewing this page.

×
×
  • Create New...