C# Başvuru Parametreleri

Daha önce yöntemlere parametre olarak bir değişken aktarıldığında parametrenin değişkenin kopyasının oluşturulduğu biliniyor. Bu durum parametre değer türü (int gibi), boş olabilen tür (int? gibi) ya da başvuru türü (Bisiklet gibi) bile böyledir. Bu da yöntem içerisinde parametrenin değerinin değiştirilmesinin aktarılan değişkenin değerini etkilemeyeceği anlamına gelir. Örneğin, aşağıdaki kodda, konsola yazılan sonuç 11 değil 10’dur. DegerArtir yöntemi, orijinal değişkenin (a) değil değişkenin kopyası olan deger değişkeninin değerini artırır:

[csharp]static void DegerArtir(int deger)
{
deger++;
}
static void Main()
{
int a = 10;
DegerArtir(a);
Console.WriteLine(a); // 10 yazar
}[/csharp]

“ref” ve “out” Parametreleri

Programlama dilinde yönteme aktarılan değişkenin kendi değerini değiştirmek için ise ref ve out anahtar sözcükleri kullanılır.

“ref” Parametresi

Yöntem bildiriminde kullanılan bir parametrenin adının önüne ref yazılırsa değişkenin değeri değil, değişkenin yığındaki (stack’teki) adresi parametre olarak gönderilmiş olunur. Bu yapıldığında artık parametrenin değerini değiştirmek, değişkenin değerini değiştirmek anlamına gelir. Değişkeni bir ref parametresine aktarırken değişkenin önüne de ref yazılmalıdır. Bu söz dizimi, bağımsız değişkenin değişebileceğine dair görsel bir ipucu verir. Aşağıda, önceki örneğin ref anahtar sözcüğü kullanılarak yazılmış biçimi görülebilir:

[csharp]static void DegerArtir(ref int deger)
{
deger++;
}
static void Main()
{
int a = 10;
DegerArtir(ref a);
Console.WriteLine(a); // 11 yazar
}[/csharp]

Bu defa, DegerArtir yöntemine orijinal değişkenin kopyası yerine orijinal değişkene bir başvuru tanımla. Böylece yöntemin bu başvuruyu kullanarak yaptığı her değişiklik orijinal bağımsız değişkeni de değiştirdi ve bu nedenle konsolda 11 yazdı.

“out” Parametresi

out anahtar sözcüğü de aslında ref anahtar sözcüğüne benzer. Aralarındaki fark out anahtar sözcüğünün değişkenlerin ilk değer verilmeden de parametre olarak aktarılmasını mümkün kılmasıdır. Örneğin ref anahtar sözcüğü kullanılan aşağıdaki kod derleme sırasında hata verir.

[csharp]static void DegerArtir(ref int deger)
{
deger = 10;
deger++;
}
static void Main()
{
int a; // İlk değer verilmemiş
DegerArtir(ref a); // Derleme hatası
Console.WriteLine(a);
}[/csharp]

Oysa aynı örneği aşağıdaki gibi out anahtar sözcüğü kullanılarak denildiğinde çalışacaktır.

[csharp]static void DegerArtir(out int deger)
{
deger = 10;
deger++;
}
static void Main()
{
int a;
DegerArtir(out a);
Console.WriteLine(a); // 11 yazar
}[/csharp]

Yığın (Stack) ve Öbek (Heap)

Yazılan programlar ve bu programların kullandığı veriler bellek üzerinde tutulur. Değer ve başvuru türleri arasındaki farkları anlamak için verinin bellekte nasıl düzenlendiğini iyi anlamak gerekir.
İşletim sistemleri ve çalışma zamanları sık sık veriyi tutmak için kullanılan belleği her biri ayrı olarak yönetilen iki büyük parçaya ayırır. Belleğin iki büyük parçasına yığın (stack) ve öbek (heap) adı verilir. Yığın ve öbek çok farklı amaçlara hizmet eder:

  •  Yöntem parametreleri ve yerel değişkenleri her zaman yığın üzerinde oluşturulur. Yöntem bittiğinde parametreler ve yerel değişkenler için alınan bellek otomatik olarak geri verilir.
  •  new anahtar sözcüğünü kullanarak bir nesne (sınıf örneği) yaratıldığında, nesneyi oluşturmak için gerekli bellek her zaman öbek üzerinde oluşturulur.
  • Tüm değer türleri yığın üzerinde yaratılır.
  • Tüm başvuru türleri (nesneler) öbek üzerinde yaratılır (başvurunun kendisi de yığın üzerinde olduğu hâlde).
    Boş olabilen türler aslında başvuru türleridir ve öbek üzerinde yaratılır.

System.Object Sınıfı

Programlama dili System.Object sınıfını object anahtar sözcüğüyle de kullanabilmeyi sağlar. Buradan da anlaşılabileceği gibi System.Object önemli bir sınıftır. Başvuru türü olan herhangi bir değişkene başvuruda bulunan bir değişken oluşturmak için System.Object sınıfı kullanılabilir. Aşağıdaki şekilde bu durumdaki bellek yerleşimi gösterilmiştir.

[csharp]Bisiklet c;
c = new Bisiklet(18);
object o;
o = c;[/csharp]

System.Object sınıfı

 

Kaynak: Megep Modülleri

Ahmet Şenlik

Kocaeli Üniversitesinde Bilgisayar Programcılığı okudum DGS ile 2016 yılında Sakarya Üniversitesi Bilgisayar mühendisliğini kazandım. Yazılımla uğraşmayı çok seviyorum bu alanda kendimi daha da geliştirmeyi düşünüyorum. Eğer siz de seviyorsanız bu işi devam edin başlamadıysanız başlayın başaracağınıza inanın. :)

You may also like...

Bir yanıt yazın

E-posta adresiniz yayınlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir

Bu site, istenmeyenleri azaltmak için Akismet kullanıyor. Yorum verilerinizin nasıl işlendiği hakkında daha fazla bilgi edinin.