Merhaba, bu yazımda parametreleri daha etkin kullanmak için pratik yollardan olan ref ve out parametrelerden bahsedeceğim.
ref
Normal bir kullanımda parametrelerde yaptığımız değişiklikler argümanları etkilemiyor. Örneğin;
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
class Referans { public void Kare(int i) { i = i * i; } } class RefOrnek { static void Main() { Referans rf = new Referans(); int a = 10; Console.WriteLine("Çağrıdan önce: " + a); rf.Kare(a); Console.WriteLine("Çağrıdan sonra: " + a); } } |
Yukarıdaki örnekte Kare() metoduna “a” argümanını gönderip aktardığı değerle işlem yaptırdık. Ve daha sonra “a” değişkenini ekrana yazdırdık. Ancak metodu çağırdıktan sonrada öncede sonuç değişmedi. Çünkü biz “a” argümanının yalnızca değerini gönderdik. Ama referansını aktarmadık. Bu yüzden yaptığımız işlem yalnızca “i” parametresini ilgilendiriyor. Eğer argümanın gönderdiğimiz metotta kendi referansı ile işlem görmesini istiyorsak imdadımıza ref anahtar sözcüğü yetişiyor. Aynı işlemi ref olmadan da yapabiliriz fakat işler daha karmaşık hale geldiğinde zorluk yaşamamak için ref kullanımını daha mantılı olacaktır. ref parametresi kullanımında önemli bir nokta var. ref olarak aktarılacak bir argümana çağrıdan önce değer atanmalıdır. ref kullanarak bir argümana ilk değer atanması mümkün değildir. Şimdi yukarıdaki işlemin biraz daha karmaşığını ref ile yapalım.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 |
class Referans { // Argümanı değiştiren metot // ref'in kullanımı önemli public void Kare(ref int i, ref int k) { i = i * k; } } class RefOrnek { static void Main() { Referans rf = new Referans(); int a = 10; int b = 20; Console.WriteLine("Çağrıdan önce: " + a); // ref'in kullanımı önemli rf.Kare(ref a, ref b); Console.WriteLine("Çağrıdan sonra: " + a); } } |
Görüldüğü gibi ref parametresini kullandığımız zaman “a” parametresinin değeri alan i argümanında yapılan değişiklik “a” parametresini de etkiledi. Yani a’nın hem değerini hem referansını i’ye aktarmıştır olduk.
out
out anahtar sözcüğü iki veya daha fazla geriye döndürmek istediğimizde kullandığımız bir anahtar sözcüktür. ref parametresi de aynı işlemi gerçekleştirebilir. Ancak iki önemli nokta var;
a) out parametresi ilk değer atamasına gerek duymaz. Bu iyi bir özellik, yani sadece geriye değer döndürmek için kullanılır.
b) Metot sonlanmadan out parametresine değer atamak zorundayız, çünkü ilk değer vermediğimiz için herhangi bir değere sahip değil.
Sonuç olarak birden fazla değer döndürme ihtiyacı duyduğumuz zaman out parametresi işimize yarayacaktır. Örnek olarak bir out parametresi kullanımına bakalım.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 |
class OutParametre { int uc,bes = 0; // Üçe veya beşe bölünen sayıları adetini bulan metot // out sayesinde sayi parametresinin değeri de geriye döner public int GetSayi(int n, out int sayi) { for (int i = 1; i <= n; i++) { if (i % 3 == 0) uc++; if (i % 5 == 0) bes++; } sayi = bes; // integer kısmı geriye döndürür return uc; } } class OutOrnek { static void Main() { OutParametre op = new OutParametre(); int a, b; // İki değer döndürmek için ikinci argümanı out ile gönderiyoruz // b değişkeni GetSayi metodunda sayi değişkeninin değerlerini taşır a = op.GetSayi(25, out b); System.Console.WriteLine("Üçe bölünen sayısı: " + a); System.Console.WriteLine("Beşe bölünen sayısı: " + b); } } |
Burada “b” argümanı ile değeri gönderip, sayi parametresi değerimizi döndürüyoruz. Eğer ref parametresini kullanmış olsaydık “b” argümanınına ilk değer atamak zorunda kalacaktık.
Konuyu kısaca özetlersek argümanlarımız ile daha esnek işlemler yapabilmek, birden fazla değer döndürebilmek gibi işlemleri ref ve out ile kolayca yapabiliyoruz. Umarım faydalı bir yazı olmuştur. Herkese iyi bayramlar 🙂
Merhaba,
Ufak bir hatırlatma yapmak istedim. Else if(i%5==0 ) yerine if(i%5==0) olması gerekiyor. Bu şekilde 3′ e bölünmeyip 5′ e bölünenler bulunuyor çünkü.
Teşekkürler.
Teşekkürler uyarınız için, gerekli düzeltmeyi yaptım.