Bu yazımda sizlere çok kısa olarak c# üzerinden ref/out parametre yapılarını anlatıyor olacağım.Bu yapıları hemen herkesin bildiğini varsayabiliriz, ama bilmeyen arkadaşlar için şu kısa ve öz olarak şu şekilde anlatabiliriz.
ref Anahtar Sözcüğü :
Normalde metodlara parametre olarak geçirilen değer tipleri aslında kopyalanarak gönderilirler. Metod içerisinde parametre olarak gönderilen değerler üzerinde aslında işlem yapılmaz, bellekteki kopyaları üzerinde işlemler yapılır ve metod bittiğinde bellekte tutulan bu kopyalar silinir. Dolayısıyla metod geri dönüşlerinde parametre olarak gönderilen değer tiplerinde herhangi bir değişiklik olmaz. Fakat bazen parametre olarak gönderilen değer tiplerini referanslarıyla birlikte yani bir nevi nesnenin kendisini göndermek isteyebilir ve bu gönderdiğimiz parametre üzerinde işlemlerin yapılmasını isteyebiliriz. C ve C++ dillerinde bunun için Pointer yapısı kullanılırken, C# dilinde ref anahtar sözcüğü kullanılır.
Bunu kısa bir örnekle şu şekilde gösterebiliriz.
Örnek 1 :
Hemen bir web form oluşturup içine bir Listbox nesnesi attık, "Islem" ve "RefIslem" adında 2 metod yazarak çağırdık."Islem" metodu klasik 2 int değer alan bir metod, "RefIslem" metodu ise 2 tane int tipli referans alan metodtur."Islem" metoduna parametre olarak gönderilen değerlerin aslında bellekte birer kopyası oluşturulur, "RefIslem" metoduna ise referansları(adresleri, bir nevi kendileri) gönderilir ve kopya oluşmadan direk ilgili parametreler üzerinde işlemler yapılır.
Sonuç :
Dikkat edilmesi gereken noktalar, "ref" anahtar sözcüğünün metod yazılırken ve çağırılırken kullanılmak zorunda olduğu ve ikinci olarak ref olarak verilen parametrenin, metod çağırılmadan önce ilk değerinin mutlaka verilmesi gerektiğidir.İlk değer verilmeden metod çağırılmaya çalışıldığında hata alınacaktır.
out Anahtar Sözcüğü :
"out" anahtarı metodlarda geri dönüş amaçlı kullanılmaktadır. Normalde yazdığımız metodlarda return ile tek bir değer döndürülürken, "out" anahtarı ile birden fazla değer döndürülebilir. "out" anahtarı aslında "ref" anahtarı ile çok büyük benzerlik gösterir.Aralarında 2 temel fark vardır.
- ref kullanırken parametreye ilk değer atamak zorunlu iken, out kullanımında zorunlu değildir
- out anahtarının kullanıldığı metodlarda, out tipinde belirtilmiş parametreye mutlaka metod sonlanmadan önce geri dönüş değeri atanmalıdır. Aksi halde hata alınacaktır.
Örnek 2 :
Şimdi bir önceki örnekteki gibi bir web form yaratıp, içine listbox attım.Daha sonra "OutIslem" adında bir metod yazıp, metodun parametre olarak gönderilen sayının karesini almasını ve aynı zamanda yarıya bölüp bu iki değişkeni return etmesini sağladım.
- ref kullanırken parametreye ilk değer atamak zorunlu iken, out kullanımında zorunlu değildir
- out anahtarının kullanıldığı metodlarda, out tipinde belirtilmiş parametreye mutlaka metod sonlanmadan önce geri dönüş değeri atanmalıdır. Aksi halde hata alınacaktır.
Örnek 2 :
Şimdi bir önceki örnekteki gibi bir web form yaratıp, içine listbox attım.Daha sonra "OutIslem" adında bir metod yazıp, metodun parametre olarak gönderilen sayının karesini almasını ve aynı zamanda yarıya bölüp bu iki değişkeni return etmesini sağladım.
Sonuç :
Görüldüğü üzere "out" anahtarının kullanımı "ref" ile aynıdır, metod parametresi "out" olarak belirtilmişse, metodun çağırıldığı yerde de aynı parametre "out" anahtarı ile etiketlenmelidir.Aynı zamanda ilk değer vermek gibi bir zorunluluğumuz da yoktur.
ref/out anahtarlı parametreler int,double,string,char,byte,bool ve bunlar haricinde data yapısı olarak kullanmak istersek List,Array,Class yapıları olabilir. Örneğin bir metoda out anahtarlı bir List<int> parametresi gönderilip, bu liste geri dönüş olarak alınabilir.
Örnek 3 :
Aslında Generic Type bölümüne başka bir yazımda değinecektim, ama elim değmişken ref/out anahtarlarının generic type yapıları içinde geçerli olduğunu göstermek istedim.Aşağıdaki örnekte generic array tanımlayıp, bu generic array içindeki elemanları aynı tipteki generic list' e atan örneği inceleyebilirsiniz.
yok yavvvvvvvvvvvvvvvvvvv
YanıtlaSilçok iyi çok teşekkür ederim ALLAH RAZI OLSUN
YanıtlaSil