Prosedürel programlama dillerinde fonksiyon olarak isimlendirilen yapılar, C# gibi nesneye dayalı programlama dillerinde metot olarak isimlendirilmektedir. Rutin halde yapılan işlevler metot haline getirildiğinde kod bakımından daha temiz, kolay okunan ve daha kolay bakım gerçekleştirilebilen programlar ortaya çıkar.
C#’ta kullandığımız metotlar değer döndürme durumu, aldığı parametre türleri, birden fazla görev alabilmesi gibi açılardan bakıldığında çeşitlendirilebilir. Ancak yazılan metotlar, birbirine aykırı olmadığı sürece aşağıdaki çeşitlendirmelerden bir veya birkaçına aynı anda sahip olabilir.
- Değer döndürme durumuna göre metotlar
- Değer döndürmeyen metotlar – void
- Değer döndüren metotlar – return
- Parametre durumuna göre metotlar
- Parametre kabul etmeyen metotlar
- Parametre kabul eden metotlar
- Parametreyi dışarıya verebilen metotlar – ref ve out
- Parametre olarak dizi kabul eden metotlar
- Virgülle ayrılmış çoklu parametre kabul eden metotlar – params
- Özyinelemeli metotlar
- Aşırı Yüklenmiş Metotlar
Değer Döndürmeyen Metotlar
Değer döndürmeyen metotlar tanımlanırken void anahtar kelimesi kullanılır.
1 2 3 4 5 6 7 8 9 10 11 | public void DegerDondurmeyenToplama(int sayi1, int sayi2) { int sonuc = sayi1 + sayi2; Console.WriteLine(sonuc); } static void Main(string[] args) { int a=5, b=2; DegerDondurmeneyenToplama(a,b); } |
Değer Döndüren Metotlar
Değer döndürme işlemi return parametresi ile yapılabilir. return ifadesinden sonra yazılan değişken veya değer, aşağıda gösterilen DegerDondurenToplama() metodunun çağrıldığı yer olan Console.WriteLine() içine değer gönderilmiş olur.
1 2 3 4 5 6 7 8 9 10 11 | public int DegerDondurenToplama(int sayi1, int sayi2) { int sonuc = sayi1 + sayi2; return sonuc; } static void Main(string[] args) { int a=5, b=2; Console.WriteLine(DegerDondurenToplama(a,b)); } |
Aslında değer döndürmeyen, yani void ile tanımlı metotlarda da return komutuna rastlanabilir. Ancak bu tür durumlarda return komutu aşağıdaki gibi kullanılır:
1 | return; |
Bu kullanımın amacı geriye değer döndürmek değil metottan çıkılmasını sağlamaktır.
Aşırı Yüklenmiş Metotlar (Method Overloading)
Bir metota farklı yollarla birden fazla görev verilebilir. Yukarıdaki örnekte DegerDondurenToplama() metodu 2 parametre kabul ederken aynı isimde bu metodun 3 parametre kabul eden hali de yazılabilir. Bunun yanında int değer döndürme yerine double tipinde değer döndürme gibi farklı bir görev de aynı metodun bir kez daha yazılmasıyla elde edilebilir.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | public int DegerDondurenToplama(int sayi1, int sayi2, int sayi3) { int sonuc = sayi1 + sayi2 + sayi3; return sonuc; } public int DegerDondurenToplama(int sayi1, int sayi2, int sayi3, int sayi 4) { int sonuc = sayi1 + sayi2 + sayi3 + sayi4; return sonuc; } static void Main(string[] args) { int a=5, b=2, c=7; Console.WriteLine(DegerDondurenToplama(a, b, c)); } |
Parametre Olarak Dizi Kabul Eden Metotlar
Aşağıdaki örnekte sayilar adında bir int tipinde parametre kabul eden hali gösterilmiştir.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | public int DiziyiToplama(int[] sayilar) { int sonuc = 0; foreach (var sayi in sayilar) { sonuc += sayi; } return sonuc; } static void Main(string[] args) { int[] sayiDizisi = new int[] {5, 2, 7}; Console.WriteLine(DiziyiToplama(sayiDizisi)); } |
Virgülle Ayrılmış Çoklu Parametre Kabul Eden Metotlar
Belki de yukarıdakiler içerisinde en farklı kullanım bu şekildedir. Sağladığı kolaylık sayesinde istenildiği kadar sayının esnek bir şekilde toplanması sağlanabilir. Bu işlem ise, oldukça basit bir şekilde, yalnızca dizi tipindeki parametrenin önüne params ifadesinin eklenmesiyle gerçekleştirilir. Dolayısıyla aşağıdaki metodun yukarıdaki metottan tek farkı, dizi parametresinin params ile yeni bir işlev kazandırılmasıdır.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | public int CokParametreliToplama(params int[] sayilar) { int sonuc = 0; foreach (var sayi in sayilar) { sonuc += sayi; } return sonuc; } static void Main(string[] args) { Console.WriteLine(CokParametreliToplama(5, 2, 7)); Console.WriteLine(CokParametreliToplama(5, 2, 7, 6, 98, 56, 100, 1, 500, 25, 63)); } |
Özyinelemeli Metotlar
Özyinelemeli metotlar da kullanım açısından oldukça farklı yapıdadır. Bu metotlarda temel mantık, metodun kendi kendini çağırması üzerine kuruludur. Özyinelemi metotlarda mutlaka bir son durak tanımlaması yapılmalıdır. Aşağıdaki örnekte, her çarğrıda sayı değeri 1 düşürülmektedir. Ancak ne zaman ki düşürülen sayı değeri en son 1’e ulaşır, o zaman metot kendini bir daha çağırmaz ve geriye yalnızca değer döndürür.
1 2 3 4 5 6 7 8 9 10 11 12 13 | public int OzyinelemeliFaktoriyel(int sayi) { if (sayi == 1) return sayi; return sayi * OzyinelemeliFaktoriyel(sayi - 1); } static void Main(string[] args) { int a=5; Console.WriteLine(OzyinelemeliFaktoriyel(a)); } |
Yukarıda da görüldüğü gibi, if deyiminde else kullanmadan doğrudan bir return komutu göze çarpmaktadır. Değer döndüren metotlarda return ifadesine rastlanıldığı zaman, o satırdan sonrası çalıştırılmaz. Dolayısıyla yukarıdaki kullanım istenirse aşağıdaki gibi de yazılabilir, ikisi arasında herhangi bir fark yoktur.
1 2 3 4 5 6 7 | public int OzyinelemeliFaktoriyel(int sayi) { if (sayi == 1) return sayi; else return sayi * OzyinelemeliFaktoriyel(sayi - 1); } |
Kod anlaşılabilirliği açısından alttaki kullanım tercih edilse de ilk kullanıma da oldukça sık rastlanılır.
Parametreyi Dışarıya Verebilen Metotlar
Şu ana kadar yapılan örneklerde, metoda gönderilen parametrelerin değerleri metot içinde değiştirilse bile bu parametrenin gönderildiği yerde herhangi bir etkilenme söz konusu olamaz. Ancak bir metodun birden fazla değer döndürmesini istediğimiz durumlarda ref ve out belirteçleri önem kazanır.
ref Parametresi
Birden fazla parametrenin önüne ref belirteci eklenmesiyle bu değerlerin içeriği metot içinde değiştirilir ve dışarıya da etki eder. ref ile tanımlı tüm parametrelerde ilk değer ataması yapılmalıdır.
1 2 3 4 5 6 7 8 9 10 11 12 | public void DegisTokus(ref int sayi1, ref int sayi2) { int depo = sayi1; sayi1 = sayi2; sayi2 = depo; } static void Main(string[] args) { int a=5, b=2; DegisTokus(ref a, ref b); } |
Yukarıdaki örnekte iki adet sayının değerleri değiş tokuş yapılmıştır.
out Parametresi
Parametrelerden yalnızca bir tanesi out parametresi olabilir. out parametresine ilk değer ataması yapılmasına gerek yoktur. Ancak bu parametrenin değeri, metot içinde mutlaka değiştirilmelidir.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | public double Bolum(int sayi1, int sayi2, out double kalan) { double sonuc = sayi1 / sayi2; kalan = sayi1 % sayi2; return sonuc; } static void Main(string[] args) { int a=5, b=2; double kalan; Console.WriteLine(Bolum(a, b, out kalan)); Console.WriteLine(kalan); } |