Derinlemesine yazılım eğitimleri için kanalımı takip edebilirsiniz...

C#’ta Gösterici(Pointer) Nedir? – I

Merhaba,

Üzerinde çalışılan projede bellek veya mikroişlemci düzeyinde herhangi bir işlevde bulunmuyorsak eğer bellek yönetimi .NET mimarisinde Garbage Collector(Gereksiz Bilgi Toplayıcı) dediğimiz mekanizma tarafından bizim yerimize otomatik olarak sağlanmaktadır. Eğer ki yazılımsal olarak bellek yönetimini direkt olarak programcıya bırakmak istiyorsak eğer Gösterici(Pointer) dediğimiz yapılar devreye girmektedir.

C ve C++ dillerinin en güçlü yanı olan göstericiler C# dilinde de mevcuttur. İşlevsel olarak verdiğim iki dilde nasıl bir fonksiyonelliğe sahiplerse C#’ta da aynı özelliklerle karşımıza çıkmaktadırlar. Peki nedir o özellikler?

Göstericiler; değişkenlerin ve nesnelerin bellekteki adreslerini tutan değişken tipleridir.
Örnek olarak aşağıda tanımlanan değişkeni ele alalım.

int a = 3;

“a” değişkeni bellekte “3” değerini tutmaktadır. Biz bu “3” değerine erişmek için “a” değişkenin referans adını kullanmaktayız. Fakat mikroişlemci düzeyinde değişken diye bir terimin olmamasından dolayı mikroişlemci bellekteki herhangi bir nesneye-değişkene erişmek için o değişkenin bellek adresini kullanır. Heh işte bellekteki bu adreslerin programlamadaki karşılıkları gösterici(pointer)lerdir.

Şimdi düşünün ki, “a” değişkenini gösteren beş adet pointer olsun. Bu pointerların hepsinin değeri “3” olacaktır. Eğer ki pointerların tuttuğu adresteki veri değişirse bu değişiklik tüm pointerlara ve değişkene yansıtılacaktır.

Programlamada pointer kullanmanın birçok avantajının yanında bir o kadar da dezavantajı mevcuttur. Her ne kadar bellek yönetimi elimizin altında olsada, bir pointerın gösterdiği adreste pointerın tipinde geçerli bir değer olmasının garantisi yoktur. Artık o adreste değer olarak ne varsa pointer tipinde bir değer olarak farz edilir. Bu olası durumlarda ne yazık ki öyle kolay kolay gözlemlenebilir bir yapıya sahip değildirler. Onlarca test sonucunda hiç hata yokmuş gibi çalışan programımız hiç beklenmediği bir anda çökme durumuyla karşı karşıya kalabilir.

İşte .NET mimarisi(ve Java’da dahil) bu sorunu ortadan kaldırmak için her durumda pointer kullanımı yerine “reference” dediğimiz nesneleri refere eden yapıları getirmiş bulunmaktadırlar.

İlerideki yazılarımızda göreceğiniz üzere pointer değişkenler her ne kadar ilgili değişkenin bellekteki adresini tutsalarda C# ile bu adreslerin değersel bilgilerini elde edememekteyiz. Oyca C ve C++ ile bellek adreslerine erişim mümkündür…

Ayriyetten unutmayın ki pointer kullanarak bellek yönetimini programcıya devrettiysek Garbage Collector mekanizması aktifliğini yitirecektir.

Aslında bir gerçeği itiraf etmekte fayda vardır ki, o da çok çok istisnai durumlar mevzu bahis olmadıkça göstericilere ihtiyacınız olmayacağıdır. Peki nedir o istisnai durumlar?

  • Geriye Uyumluluk(Backward Compatibility)
    İşletim sisteminin eski ve kullanımı çok nadir olan fonksiyonelliklerine gereksinim duyduğumuzda yahut COM ve Win32 API olarak tarif edilen harici kaynakları kullanacağımız durumlarda gösterici(pointer) kullanan fonksiyonlarla karşılaşmamız yüksek olasıdır. Eğer ki C#’ta pointer kullanımına izin verilmemiş olsaydı işte o zaman bu dil dedesinin mezar taşını okuyamaz olurdu.
  • Performans
    C ve C++ programlama dillerinin popülaritesinin altındaki en büyük koz bellek yönetiminde araya pürüz karıştırmamalarıdır. Haliyle bizler içinde performansın çok çok önemli olduğu yerlerde gösterici kullanmamızdan daha doğal birşey olmasa gerek…
  • Alt Seviye İşlemler
    Donanımsal programlanmış projelerde göstericiler olmazsa olmaz yapılardır.
  • Hata Ayıklayıcı Programlar
    Debugger diye nitelendirilen hata ayıklayıcı programları yazabilmek için mutlaka belleğe direkt erişimin olması gerekmektedir.

Bu içeriğimizde C# programlama dili açısından pointerların önemini teorik olarak ele almaya çalıştık. Ayrıca mantıksal olarak biraz konuyu eşeleyip tadında bıraktık. Sonraki yazımızda C# ile pointer kullanmanın anahtarı olan unsafe keywordü üzerine içeriğimizi detaylandıracağız.

O halde görüşmek üzere diyorum…
Hoşçakalın…
İyi çalışmalar…

Bunlar da hoşunuza gidebilir...

2 Cevaplar

  1. 26 Nisan 2017

    […] önceki C#’ta Gösterici(Pointer) Nedir? başlıklı yazımda C# programlama dili sınırlarında göstericileri ele almış, nerede, ne […]

  2. 25 Mayıs 2017

    […] C#’ta Gösterici(Pointer) Nedir? – I […]

Bir cevap yazın

E-posta hesabınız yayımlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir

*