C#' ta Değer ve Referans Tipleri

C# dilinde iki tür veri tipi mevcuttur. Bunlar değer ve referans tipleridir. 
Değer tipleri; veriyi taşıyan ve taşıdığı veriye göre bellek üzerinde yer dolduran değişken türleridir. Bellekte az yer kaplarlar ve hızlı bir şekilde erişilebilirler. Ayrıca belleğin "stack" bölgesinde tutulurlar. 
Referans türleri ise, bellek bölgesinde veri yerine adresi tutarlar ve o adresin gösterdiği yerde de veri tutulur. Başka bir deyişle, bir ifade referans türleri içeriyorsa nesnenin adresi üzerinden işlem yapılmaktadır. Veri taşınmasını gerektiren işlemlerde nesnenin bütün verisi kopyalanmaz.
Değişken türleri:  "int", "long", "float", "double", "decimal", "char", "bool", "byte", "short", "struct", "enum"
Referans türleri:  "string", "object", "class", "interface", "array", "delegate", "pointer"
Bir referans türü olan string ile ilgili bu konuda önemli bir istisna vardır. string referans türü olmasına rağmen metotlara geçirilirken değer tipiymiş gibi kopyalanırlar.
Hatırlatma olması açısından stack ve heap yapılarını inceleyelim.
Stack Nedir Heap Nedir  ? 
Kodumuz işletim sisteminde bir yer kaplar. Bu yerin boyutu kimi zaman belli yani değişmez iken kimi zaman ise kullanıcının program esnasında gireceği verilere göre değişebilecek durumdadır. Temel olarak bu farklılıktan dolayı iki farklı yöntemimiz var. Eğer program esnasında boyutları bildirilmiş değişmez bir değer kullanıyorsak stack, değişebilir bir değer kullanıyorsak heap bizim için uygun olacaktır. Stack ve heap kullanımları farklı ve dikkat edilmesi gereken bir konudur. Stack kullanılır ve işi bittikten sonra kendini otomatik olarak bellekten yok eder. Fakat heap‘te bu işi siz yapmalısınız.
 * Stack:  Kullanımı kolaydır. Bilgisayarda RAM’de tutulur. Tıpkı Heap gibi. Oluşturulan değişkinler stack kapsamından çıkınca otomatik olarak yok edilir. Ulaşılması heap‘e göre oldukça hızlıdır. Stack üzerinde kullanım fazla olduğunda alan yeterli olmayabilir. Mesela 20 boyutlu bir diziye 21 eleman atamak gibi… Oluşturulan değişkenler pointer olmadan kullanılabilir. Derleme zamanında oluşturulur. Kullanacağınız yerin boyutunu tam olarak biliyorsanız Stack‘i kullanmak sizin için uygun olacaktır. Stack LIFO mantığında çalışır. Yani son gelen ilk olarak çıkar.Struct tipindeki değişkenler değer tipleridir ve Stack içerisinde saklanır.
  * Heap: Bilgisayarda RAM’de tutulur.Tıpkı Stack gibi. Bir blok içerisinde oluşturulan heap değişkenler, bloğun dışına çıktığında otomatik olarak yok edilemez, bunun manuel olarak yapılması gerekir. Stack ile karşılaştırıldığında oldukça yavaştır. Doğru kullanılmaması durumunda bellek sorunları yaratır. Değişkenler pointer ile kullanılır. Çalışma zamanında oluşturulur. İhtiyacınız olan boyutu tam olarak bilmiyorsanız Heap kullanımı sizin için biçilmiş kaftandır.Class tipindeki değişkenler ise referans tipleridir, referansları Stack’de kendisi ise Heap’de saklanır.


C# da readonly-const kullanımı

Tüm program boyunca değerinin sabit kalmasını istediğimiz değişkenleri tanımlarken const veya readonly kullanırız.Şimdi readonly ve constun farkını görelim..

    Const
  • Tanımlandığı anda değeri verilmek zorundadır.
  • Class seviyesinde veya herhangi bir metodda, herhangi bir yerde tanımlanabilir.
  • Bir defa değer verildikten sonra değeri bir daha değiştirilemez.
  • Bir nesneyi const olarak tanımlıyorsak o nesnenin değerini çalışma anında veremeyiz.
  • Const ile tanımlanan değişkene nesne ile ulaşamayız.     

    Readonly
  • Bir nesneyi sabit olarak tanımlamak istersek ve değerini çalışma zamanında bildireceksek kullanılır.
  • Nesneler ile readonly değişkenine ulaşılabilinir.
  • Yapıcı metod ile değer verilebilir.

Senaryo : Uygulama çalışırken değeri değiştirilemeyecek değişken tanımlamanız gerekiyor.
Çözüm : Muhtemel iki çözüm var, const ve readonly değişken tanımlamak. Fakat aralarında önemli bir fark var;
const : Türkçe’ye Sabit olarak çevrilebilir. Class seviyesinde tanımlanır ve tanımlanma anında değeri verilmek zorundadır. Sonradan değeri değiştirilemez.
readonly : Sadece-Okunabilir anlamına gelir. Class seviyesinde tanımlanır. Tanımlandığı anda değeri verilebilir veya Class Constructor’ında değeri verilebilir. Sonradan değeri değiştirilemez.

Hiç yorum yok:

Yorum Gönder