‘C#’ Kategorisi için Arşiv

C# Unsafe yapısı nedir? Nasıl kullanılır?

Yayınlandı: Mart 24, 2012 / C#

C# Unsafe yapısı nedir? Nasıl kullanılır?

.NET’ in altyapısında pointer kavramı sıklıkla kullanılırken pointerların  kullanımı programcılar için gizlenmiştir. Bunun nedeni pointer kullanımının programlardaki görülemeyen hatalara sıkça yol açabilmesidir. Özellikle dili yeni öğrenenler için pointer hataları içinden çıkılmaz bir hale gelebilmektedir. C#’ta göstericiler yerine referans değişkenleri mevcuttur. Referanslar heap bellek bölgesindeki nesnelerin başlangıç adresini tutar. Ancak bu adresin değerine kesinlikle ulaşamayız. Oysa C ve C++ dillerinde stack bölgesindeki değişkenlerin de adreslerine erişbilmemiz mümkündür. Üstelik değişkenlerin adreslerini örneğin 0x965474 şeklinde elde etmemiz bile mümkündür. C ve C++ programcılarına pek yabancı gelmeyecektir bunlar, ancak programlama dünyasına C# ile giren biri için göstericilere neden ihtiyaç duyabileceğimiz pek anlamlı gelmeyebilir. Şunu da söyeleyelim ki çok istisnai durumlar dışında göstericilere ihtiyacımız olmayacak, peki bu istisna durumlar nelerdir?

  • Geriye Uyumluluk(Backward Compatibility) : COM ve WinAPI’deki fonksiyonlar gibi sık sık pointer kullanan fonksiyonları C# ile programlarımızdan çağırabilmek için parametre olarak pointer alan fonksiyonlara pointer göndermemiz gerekebilir. Eğer C# ta pointer kullanımına izin verilmemiş olsaydı tür uyumsuzluğu yüzünden pointer kullanan eski COM ve DLL’lere erişebilmemiz mümkün olamazdı.
  • Performans : C ve C++ dillerinin günümüze kadar çok popüler olmasının altında yatan nedenlerden biri de belleğe direkt erişimi sağladığı içinperformansın inanılmaz derecede yükselmesidir. Bizim için performansın çok önemli olduğu yerlerde pointer kullanmamızdan daha doğal birşey olamaz.
  • Alt Seviye İşlemler : Donanım arayüzleri ile direkt bir ilişki içerisinde olacak programlarda pointerların kullanımı mecburi gibidir. Bazen de belleğe kullanıcıların direkt erişebilmesi gereken programlar olabilir. Bu durumlarda da pointerlardan faydalanabiliriz.

Bütün bunların yanında pointer kullanmanın bir çok sıkıntıyıda beraberinde getireceği kesindir. Öncelikle kullanımının zor olması ve kestirilmesi zor olan hatalara yol açabilmesi bu sıkıntıların en başında gelenidir. Zaten C#’ta pointer kullanacağımız zaman kodu unsafe(güvensiz) anahtar sözcüğü ile işaretlememiz gerekir. Aksi halde program derlenemeyecektir. Normal bir metot içinde gösterici kullanımı yasaklanmıştır.

Yasaklandığından dolayı projenizin properties bölümündeki build kısmından bu özelliğe izin vermeniz gerekmektedir.Aşağıdaki resimdeki gibi…

Şimdi de unsafe anahtar sözcüğünün kullanımına örnekler verelim.

1-) unsafe olarak işaretlenen sınıfların bütün metotlarında gösterici kullanabiliriz.

unsafe class Sınıf
{}

2-) Normal bir metot içinde herhangi bir bloğu unsafe olarak aşağıdaki gibi işaretleyip dilediğimiz gibi gösterici kullanabiliriz. unsafe bloklarının dışında ise gösterici kullanamayız.

int NormalMetot(int a, string str)
{
unsafe
{}
}

3-) Normal bir metodu unsafe olarak işaretleyip sadece o metodun içinde de gösterici kullanabiliriz.

unsafe int NormalMetot(int a, string str)
{}

4-) Bir sınıfın üye değişkenlerinden biri unsafe olarak işaretlenip gösterici olarak bildirilebilir. Ancak bir metot içerisinde yerel bir gösterici tanımlanamaz. Yerel bir gösterici tanımlamak için unsafe olarak işaretlenmiş metod yada blok kullanılır.

class Sınıf
{
unsafe char *ptr;
}