Csharp ref, out ve params Kullanımı
8 Aralık 2011
4.276 kez okundu
Yorum yok
Bugünkü yazımda sizlere c# da kullanılan ref, out ve params keywordlerinin kullanımından bahsedeceğim.
Genel olarak programlamada iki türlü değişkenler vardır.
- Deger (value) tipinde
- Referans tipinde değişkenler
Değer tipindeki değişkenler bellekte deger olarak tutulurken, referans tipindeki değişkenler bellekte adres olarak tutulurlar. Eğer siz bir metoda normal (deger) tipte bir değişken yollarsanız, gönderdiğiniz değer için metod içerisinde aynen bir kopya oluşturulur ve bu kopya üzerinden işlem yapılır. Yani sizin orjinal değerinizide değişiklik olmaz. Metod geriye döndüğünde değerinizin değişmediğini görürsünüz.
using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace value_type { class Test { public int metod(int deger) { return deger = deger + 1; } } class Program { static void Main(string[] args) { Test t = new Test(); int deger = 10; Console.WriteLine(deger); int yeni_deger = t.metod(deger); Console.WriteLine(yeni_deger); Console.WriteLine(deger); } } } |
Referans tipinde değişken gönderdiğinizde ise degerin kendisi yerine bellek adresi gönderilir. Böyle olunca bellek adresi kopyalansa bile yine aynı adresi işaret ettiğinden orjinal değer üzerinde işlem yapılır.
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 | using System; namespace value_type { class Test { public int metod(ref int deger)//ref keywordu ile adres alınıyor { return deger = deger + 1; } } class Program { static void Main(string[] args) { Test t = new Test(); int deger = 10; Console.WriteLine(deger); int yeni_deger = t.metod(ref deger); //ref keywordu ile adres gönderiliyor Console.WriteLine(yeni_deger); Console.WriteLine(deger); } } } |
Yani sizin tek değişkeniniz vardır ve metod içinde ve dışında bu değişken üzerinde işlem yapılır. Bu yöntemi kullanabilmek için metod çağrılırken gönderilen değerin başına “ref” keywordu konulmalı, ayrıca metodun tanımlandığı yerde değişken tipinden önce yine “ref” keywordu yazılmalı.
Referance tipi kullanılırken bir sorun vardır. Referans göndereceğiniz değişken bir şey eşitlenmiş olmalıdır. Bu sorunun çözümü için c# da out keywordu kullanılmaktadır. Out keywordu, metoda gönderilen değerin önemi olmadığı sadece geri dönen değerlerin önemli olduğu durumlarda kullanılır ve metod içerisinde direk olarak başka bir değişkene eşitlenemez.
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 | using System; namespace value_type { class Test { public int metod(out int deger)//ref keywordu ile adres alınıyor { //return deger = deger + 1; // Bu satır çalışmayacaktır. Çünkü gelen değişkene değer atılmadan kullanılmak isteniyor. Gelen değişken ise herhangi bir değer getirmemektedir. deger = 20; return deger; } } class Program { static void Main(string[] args) { Test t = new Test(); int deger = 10; Console.WriteLine(deger); int yeni_deger = t.metod(out deger); //ref keywordu ile adres gönderiliyor Console.WriteLine(yeni_deger); Console.WriteLine(deger); } } } |
Referanstan tek farkı metoda giderken herhangi bir değer götürmemesi. Bu yüzden metod içerisinde değer atanmadan kullanılamaz.
Params keywordu ise bu üçünden biraz farklı bir kullanım içindir. Params keywordu metoda gönderilecek değişkenlerin sayısının belli olmadığı durumlarda kullanılır. Ve değişkenleri liste şeklinde alır.
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 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 | using System; namespace value_type { class Test { public static void Params_string(params string[] list) { for (int i = 0; i < list.Length; i++) { Console.Write(list[i] + " "); } Console.WriteLine(); } public static void Params_object(params object[] list) { for (int i = 0; i < list.Length; i++) { Console.Write(list[i] + " "); } Console.WriteLine(); } } class Program { static void Main(string[] args) { //Params_string metoduna istediğimiz kadar string yollayabiliriz. Test.Params_string("kitap", "kalem", "defter", "pc"); //Params_object metoduna istediğimiz kadar farklı tipte değişken yollayabiliriz. Test.Params_object(1, 'a', "test"); // Param değişkenler sıfır veya daha fazla değişken alabilir Test.Params_object(); // Direk array tipinde değişken de yollanabilir. string[] myIntArray = { "5", "6", "7", "8", "9" }; Test.Params_string(myIntArray); object[] myObjArray = { 2, 'b', "test", "again", 1.5 }; Test.Params_object(myObjArray); // Bu satır ise objelerin stringe çevrilememesi nedeniyle hata verir. //Test.Params_string(myObjArray); } } } |
Eğer belli bir değişken metoda gönderilmek zorunda ise ve daha sonrası belli değil ise, öncelikle metod tanımlanırken belirli olan değişkenler kullanılır daha sonra params.
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 39 40 41 42 43 44 45 46 | using System; namespace value_type { class Test { public static void Params_string(string ilk_deger,string ikinci_deger,params string[] list) { Console.Write(ilk_deger+" "); Console.Write(ikinci_deger+" "); for (int i = 0; i < list.Length; i++) { Console.Write(list[i] + " "); } Console.WriteLine(); } } class Program { static void Main(string[] args) { //Params_string metoduna istediğimiz kadar string yollayabiliriz. Test.Params_string("kitap", "kalem", "defter", "pc"); // Direk array tipinde değişken de yollanabilir. string[] myIntArray = { "5", "6", "7", "8", "9" }; Test.Params_string("11","22",myIntArray); //Params olarak değer göndermeye bilirsiniz. Test.Params_string("5","6"); // Ancak zorunlu değerlerden daha az sayıda değişken gönderemezsiniz //Test.Params_string("5"); } } } |
Eğer params ve zorunlu parametreleri birlikte kullanacaksanız, params parametresinin en son yazıldığından emin olun.
Bunlara da Göz Atmak İsteyebilirsiniz.
Rica: Sitemizin Google'da daha üst sıralarda çıkması için lütfen alttaki Google+ veya Begen butonuna tıklayınız , ya da yazılarımızı Facebookta Paylaş butonu ile paylaşabilirsiniz.
Yazılarımızı okuyan okurlarımızın yorumlarını bizimle paylaşmaları, bizi daha çok yazı yazmaya teşvik edecektir. Lütfen yorumlarınızı, görüşlerinizi, eleştirilerinizi bizden esirgemeyin.
<<< Önceki: Csharp Property Nedir, Nasıl Kullanılır?
Sonraki: Dinamik Programlama (Dynamic Programming) – En Kısa Yol Problemi >>>
Yorum Bırakın!