Anasayfa » Csharp

Csharp ref, out ve params Kullanımı

8 Aralık 2011 2.473 kez okundu Yorum yok
1 Star2 Stars3 Stars4 Stars5 Stars (Henüz hiç oy kullanılmadı. İlk oyu siz verin.)
Loading...

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.

  1. Deger (value) tipinde
  2. 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.
?View Code CSHARP
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.
?View Code CSHARP
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.
?View Code CSHARP
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.
?View Code CSHARP
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.
?View Code CSHARP
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.

 

<<< Önceki:

Sonraki: >>>


Facebookta Paylaş

Yorum Bırakın!

Yorum yaz, yada kendi sitende trackback (Geri besleme) olarak ekle. Ayrıca RSS ile bu konuya üye olabilirsin. .

Nazik olun. Temiz tutun. Konu dışına çıkmayın. Spam yaratmayın.

Bu tagları kullanabilirsiniz:
<a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>

Bloğumuz gavatarı desteklemektedir. Kendi gavatarınızı edinmek için lütfen Gravatar a üye olun.