İçeriğe geç
Educora
Başlangıç18 dk5 / 16

Metotlar: parametreler, dönüş değerleri, ref ve out

Kendi metotlarını yaz: parametreler, `return`, kısa `=>` yazımı, isteğe bağlı ve adlandırılmış argümanlar, demetler, `ref` ve `out`.

Kendini test et
Bu derste öğreneceklerin
  • Parametreli bir metot tanımlamak ve onu çağırmak
  • return ile sonuç döndürmek ve bunun void metotlardan farkını açıklamak
  • İsteğe bağlı parametreleri ve adlandırılmış argümanları kullanmak
  • Değerle geçirmeyi ref ve out ile geçirmeden ayırt etmek

Programının beş yerinde indirimli fiyatı hesaplıyor ve her seferinde aynı üç satırı kopyalıyorsun. Sonra formülde bir hata buluyorsun ve şimdi onu beş yerde düzeltmen gerekiyor! Metotlar bu sorunu çözer: kod bir kez yazılır, bir ad alır ve istediğin kadar çağrılır. Console.WriteLine, int.Parse ve string.Join zaten tanıdığın metotlardır; şimdi kendi metotlarını yazacaksın.

Metot tanımlamak ve çağırmak

Bir metot başlığında önce dönüş türü, sonra ad, parantez içinde de türleriyle birlikte parametreler yazılır. void, metodun hiçbir şey döndürmediğini belirtir. Üst düzey deyimlerle yazılan bir programda metotlar genellikle dosyanın sonuna konur, ama onları yukarıdan da çağırabilirsin. Metot adları büyük harfle başlar: Greet, CalculateTotal.

C#
Greet("Aysel");
Greet("Murad");

void Greet(string name)
{
    Console.WriteLine($"Salam, {name}!");
}
Beklenen çıktı
Salam, Aysel!
Salam, Murad!
Tanım
Parametre ve argüman

Parametre, metot başlığında tanımlanan değişkendir (string name). Argüman ise metot çağrılırken o parametreye verilen gerçek değerdir ("Aysel").

return: sonucu döndürmek

Metot bir sonuç döndürüyorsa void yerine sonucun türü yazılır ve gövdede return kullanılır. return metodu bitirir ve değeri çağrıldığı yere gönderir. Gövdesi tek bir ifadeden oluşan bir metot, => okuyla kısaca yazılabilir.

C#
double area = RectangleArea(4, 3.5);
Console.WriteLine($"Room area: {area}");
Console.WriteLine(IsEven(10));
Console.WriteLine(CelsiusToFahrenheit(25));

double RectangleArea(double width, double height)
{
    return width * height;
}

bool IsEven(int n) => n % 2 == 0;

double CelsiusToFahrenheit(double c) => c * 9 / 5 + 32;
Beklenen çıktı
Room area: 14
True
77

İsteğe bağlı parametreler ve adlandırılmış argümanlar

Bir parametreye varsayılan değer verilebilir: çağrıda argüman yazılmazsa bu değer kullanılır. Böyle parametreler listenin sonuna yazılır. Argümanlar adlarıyla da verilebilir (discount: 10); o zaman sıraları önemli olmaz ve çağrının anlamı hemen anlaşılır.

C#
Console.WriteLine(FinalPrice(80));
Console.WriteLine(FinalPrice(80, 25));
Console.WriteLine(FinalPrice(discount: 10, price: 50));

PrintTicket("Leyla");
PrintTicket("Elvin", seats: 3);

decimal FinalPrice(decimal price, int discount = 0)
{
    return price - price * discount / 100;
}

void PrintTicket(string name, string city = "Baku", int seats = 1)
{
    Console.WriteLine($"{name}: {seats} seat(s) in {city}");
}
Beklenen çıktı
80
60
45
Leyla: 1 seat(s) in Baku
Elvin: 3 seat(s) in Baku
seats: 3 adıyla verildiği için city parametresi atlanabildi.

Birden fazla sonuç: demetler, ref ve out

Bir metot, birden fazla değeri aynı anda bir demet (tuple) olarak döndürebilir: dönüş türü parantez içinde yazılır, örneğin (int Min, int Max). Çağırırken demeti hemen ayrı değişkenlere ayırabilirsin:

C#
int[] temperatures = [12, 5, 27, 9];
var (low, high) = MinMax(temperatures);
Console.WriteLine($"Min: {low}, max: {high}");

(int Min, int Max) MinMax(int[] numbers)
{
    int min = numbers[0];
    int max = numbers[0];
    foreach (int n in numbers)
    {
        if (n < min) min = n;
        if (n > max) max = n;
    }
    return (min, max);
}
Beklenen çıktı
Min: 5, max: 27

Varsayılan olarak argümanlar değerle geçirilir: metot bir kopya alır ve onu değiştirse bile çağıran taraftaki değişken aynı kalır. ref anahtar sözcüğü değişkenin kendisini geçirir; metot onu değiştirebilir. out ise sonuçları geri vermek içindir: metot out parametresine mutlaka bir değer yazmalıdır. ref ve out hem metot başlığında hem de çağrıda yazılır.

C#
int score = 10;
AddBonusCopy(score);
Console.WriteLine($"After copy: {score}");
AddBonus(ref score);
Console.WriteLine($"After ref: {score}");

Divide(17, 5, out int quotient, out int remainder);
Console.WriteLine($"17 / 5 = {quotient}, remainder {remainder}");

if (int.TryParse("42", out int number))
    Console.WriteLine($"Parsed: {number}");
if (!int.TryParse("forty", out _))
    Console.WriteLine("'forty' is not a number");

void AddBonusCopy(int value) => value += 5;

void AddBonus(ref int value) => value += 5;

void Divide(int x, int y, out int q, out int r)
{
    q = x / y;
    r = x % y;
}
Beklenen çıktı
After copy: 10
After ref: 15
17 / 5 = 3, remainder 2
Parsed: 42
'forty' is not a number
  • AddBonusCopy yalnızca bir kopyayı değiştirdi; bu yüzden score 10 olarak kaldı.
  • ref ile metot değişkenin kendisini aldı ve onu 15 yaptı.
  • int.TryParse, out ile çalışır: dönüşüm başarılıysa true döndürür ve sayıyı yazar, değilse hata fırlatmadan false döndürür. out _, sonuca ihtiyacımız olmadığını belirtir.

Önemli noktalar

  • Metot başlığı: dönüş türü, ad, parametreler — double Area(double w, double h).
  • void metot hiçbir şey döndürmez; diğerleri return ile bir değer döndürür.
  • Tek ifadelik bir metot => ile kısaca yazılabilir.
  • Varsayılan değerler (int discount = 0) argümanı isteğe bağlı yapar; adlandırılmış argümanlar (seats: 3) sırayı serbest bırakır.
  • Argümanlar varsayılan olarak kopya şeklinde geçirilir; ref değişkenin kendisini verir, out ise bir sonucu dışarı verir.

Kendini test et

10 soru. Her doğru cevap XP kazandırır.

1 / 10
void dönüş türü ne anlama gelir?