- Parametreli bir metot tanımlamak ve onu çağırmak
returnile sonuç döndürmek ve bununvoidmetotlardan farkını açıklamak- İsteğe bağlı parametreleri ve adlandırılmış argümanları kullanmak
- Değerle geçirmeyi
refveoutile 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.
Greet("Aysel");
Greet("Murad");
void Greet(string name)
{
Console.WriteLine($"Salam, {name}!");
}Salam, Aysel! Salam, Murad!
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.
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;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.
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}");
}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:
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);
}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.
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;
}After copy: 10 After ref: 15 17 / 5 = 3, remainder 2 Parsed: 42 'forty' is not a number
AddBonusCopyyalnızca bir kopyayı değiştirdi; bu yüzdenscore10 olarak kaldı.refile metot değişkenin kendisini aldı ve onu 15 yaptı.int.TryParse,outile çalışır: dönüşüm başarılıysatruedöndürür ve sayıyı yazar, değilse hata fırlatmadanfalsedö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). voidmetot hiçbir şey döndürmez; diğerlerireturnile 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;
refdeğişkenin kendisini verir,outise bir sonucu dışarı verir.
Kendini test et
10 soru. Her doğru cevap XP kazandırır.
void dönüş türü ne anlama gelir?