{Merhaba Dünya Ben Emre Kıyak}

 





Metotlarda reference ve value type parametrelerinin kullanımı

Share |


"C#'ta metotlar" konusundan sonra metotlarla ilgili bilmemiz gereken önemli bir konuyu burada paylaşacağım. Bildiğiniz gibi metotları yazarken dışarıdan bir takım parametreler alabilirler. Bu parametreleri önceki örneklerde "value type" yani değer tipi olarak verdik. Bu yazımızda örnek metotlara "reference type" yani referans tipinde parametreler verip bir karşılaştırma yapacağız.

class Program

    {
        static void Main(string[] args)
        {
            int Yas = 24;
            Console.WriteLine("Yaşınız : " + Yas);
 
            Yasini_Soyle(Yas);
 
            Console.WriteLine("Yaşınız : " + Yas);
 
            Console.ReadLine();
        }
 
        static void Yasini_Soyle(int k)
        {
            k = 20;
        }
    }

Yukarıdaki örnekte Yasini_Soyle() metodu dışarıdan int tipinde bir değer almaktadır. Main metodu içinde bu fonksiyonu çağırıyoruz ve parametre olarak 24 değerini veriyoruz. Bu değer metot içinde 20 olarak değiştiriliyor ancak int Yas = 24 değişkeni üzerinde bir tesiri olmuyor. Main metodu içinde console.writeline() fonksiyonu ekranda "Yaşınız 24" ifadesi yazacaktır. İkinciye console.writeline() fonksiyonunu çağırdığımızda ekranda yine "Yaşınız : 24" yazacaktır. Çünkü metotlara geçirilen değer tipleri kopyalanarak geçirilir. Yani Yasini_Soyle() metoduna bir value type geçirdiğimizde bu artık stackde ayrı bir yer işgal eder.

Şimdi örneğimize dışarıdan reference type bir parametre alan metot ile devam edelim. Ve değişiklikleri izleyelim.

class Program
    {
        static void Main(string[] args)
        {
            StringBuilder sb = new StringBuilder();
            sb.Append("Bursa");
            Console.WriteLine(sb);
 
            Func(sb);
 
            Console.WriteLine(sb);
            Console.ReadLine();
        }
 
        static void Func(StringBuilder sb)
        {
            sb.Append("İstanbul");
        }
 
    }

Yukarıdaki örnekte Func() isimli metodumuz dışarıdan stringbuilder tipinde bir parametre alıyor. Stringbuilder bir reference typetır. Main metodumuzda da bir stringbuilder nesnesi oluşturuyoruz ve Append() metodu ile de bir string değer ekliyoruz. Func() metodunu çağırdığımızda kendisine içinde "Bursa" ifadesi de yazan sb isimli nesnemizi parametre olarak geçiriyoruz. Metodumuz bu nesneye ayrıca "İstanbul" stringini de eklemiştir. Konsol ekranda görüntüyü aldığımızda önce Bursa yazacak ardından Bursaİstanbul yazacaktır. Önceki örnekle kıyaslarsak Main metodu içindeki ana nesnemiz bu durumdan etkilenmiştir. Çünkü reference type olarak RAM'in heap bölgesindeki değerleri üzerinde değişiklik yapılmıştır. Diğer bir ifadeyle reference tür olarak parametre alan metodlarda reference türler kopyalanmazlar. Sadece reference türün RAM'deki adresi kopyalanır. Böylece yapılan değişiklikler ana nesne üzerinde etkili olur. Burada Func() metoduna dışarıdan verdiğimiz parametre ayrı bir type olarak RAM'de kopyalanmamıştır. Var olan nesnenin adresini metoda geçirmiştir. Böylece metod içinde yapılan değişiklik Main() metodundaki nesneyi etkilemiştir.


24 Kasım 2009 Salı sabah 11:21

Mesajınızı yazabilirsiniz


Rumuz :  
 
Email :   
  
Mesaj :  
Bu konuya abone olmak ister misiniz ?

Güvenlik kodunu göremiyorsanız sayfayı yenileyin.
Güvenlik Kodu :