Değer Tipleri (Value Types)

6 Ara

.Net framework platformunun en basit tipleri nümerik ve mantıksal (Boolean) olan değer tiplerdir. Değer tipleri bellekte her hangi biryerde referans tutmadan direkt olarak kendi verilerini tutarlar. Değer tiplerinin örnekleri(Instances) bellekte stack denilen bölgede tutulur. Stack bölgesindeki verileri runtime esnasında oluşturma, güncelleme ve silme işlemleri en az iş yükü ile hızlıca gerçekleşir.

Genel olarak üç çeşit değer tipi bulunmaktadır.

  • Built-in tipler. .Net Framework bünyesindeki tiplerdir.
  • User-defined tipler. Kullanıcıların tanımladığı tiplerdir.
  • Enumeration tipler. Enum tipleridir.

Bütün bu tipler System.Value temel tipinden türemiştir.

Built-In Değer Tipleri

Built-in değer tipleri .Net Framework ortamında bulunan ve başka tiplerden inşa edilmiş temel tiplerdir. Aşağıdaki tabloda en çok kullanılan nümerik tipler bellekte kapladıkları alanlara göre büyükten küçüğe sıralanmıştır. Bunlardan ilk altı tanesi tamsayı değerlerini, son üç tanesi ise real sayıları temsil etmek için kullanılan tiplerdir.

Tip Byte
System.Sbyte(Sbyte/sbyte) -128 ve 127
System.Byte(Byte/byte) 0 ve 255
System.Int16(Short/short) -32768 ve 32767
System.Int32(Integer/int) –2147483648 ve 2147483647
System.UInt32(UInteger/uint) 0 ve 4294967295
System.Int64(Long/long) –9223372036854775808 ve9223372036854775807
System.Single (Single/float) –3.402823E+38 ve3.402823E+38
System.Double(Double/double) –1.79769313486232E+308 ve1.79769313486232E+308
System.Decimal(Decimal/decimal) –79228162514264337593543950335 ve79228162514264337593543950335

Not: Çalışma zamanı(runtime) 32 bit integer (Int32 ve Uınt32) tiplerini optimize eder. Bu yüzden sayaç(counter) ve sık erişilen değişkenler bu tiplerde olmalıdır. Örneğin döngülerde kullanılan sayaç değişkenleri int tipinde olması performansı arttırır. Floating point işlemlerinde ise Double tipi en etkili tiptir. Çünkü bu tip işlemler donanımlar tarafından optimize edilir.

Nümerik tiplerin yanında nümerik olmayan built-in veri tipleri de aşağıda verilemktedir.

Tip Byte
System.Char(Char/char) 2
System.Bolean (Boolean/bool) 4
System.IntPtr
System.DateTime (Date/date) 8

Bu tiplerin yanında Framework’te 300 den fazla tip mevcuttur. Ancak burada en sık kullanılan tipler verilmiştir. Değer tipleri arasında atama işlemi yapıldığında, veri bir değişkenden diğerine kopyalanmakta ve  iki ayrı stack bölgesinde depolanmaktadır.

Değer tipleri genellikle basit türleri temsil etmesine rağmen yine de nesneler(Object) olarak işleve görmektedir. Yani nesnelere(Object) ait metodları değer tipleri üzerinden çağırabiliriz. Örneğin en sık kullanılan metod olan ToString()  metodu değer tiplerine ait örneklerden erişilebilir. .Net Framework’te bütün neslere System.Object sınıfından türemiştir.bu sayede bütün tiplerin ortak bir noktası olmuştur.

Değer Tiplerinin Tanımlanması

Bir değer tipini kullanmaya başlamadan önce tanımlanması gerekmektedir. Değer tipleri gizli bir kurucu metoda sahiptir. Bu yüzden tanımlama esnasında sınıflarda kullanıldığı gibi  New anahtar kelimesinin kullanılmasına gerek yoktur. Mevcut kurucu metod, tanımlanan değişken örneğine başlangıç değeri olarak (Null, 0 veya False) gibi değerleri otomatik olarak atar. Ancak yinde oluşturulan değişkenlere başlangıç değerlerinin verilmesinde fayda vardır.

Örnek:

bool b = false;

Not: C# büyük harf ve küçük harfe duyarlı bir dildir.

Bazı durumlarda değişkenlerin null olması gerektiği durumlar oluşabilir. Örneğin bir formdan Evet/Hayır şeklinde bir cevap almak istendiğinde kullanıcı seçeneği işaretlemedğinde de null değer saklanması gerekebilir. Bu durumlarda değişkeni Nullable olarak tanımlayabiliriz. .Net 2.0 ile gelen bu özellik sayesinde aşağıdaki gibi tanımlamalar yapabiliriz.

Örnek:

Nullable<bool> b = null;

//Veya

bool? B = bull;

Nullable değişkenlerin HasValue ve Value isimli iki özelliği bulunmaktadır. Bu sayede değişkenin değer içerip içermediği kontrol edilebilmektedir.

User-Defined (Kullanıcı Tanımlı) Tipler

Kullanıcı tanımlı değer tipleri Stracture olarak bilinen ve struct olarak tanımlanan tiplerdir. Diğer değer tipleri gibi struct tipi örnekleri de belleğin stack bölgesinde tutulur. Kendi verilerin tutarlar. Diğer yönleriyle sınıflarla hemen hemen aynı davranırlar.

Stracture tipleri diğer tiplerin kombinasyonundan oluşurlar ve bu da ilgili verilere kolay erişmeyi sağlar. Bunu en basit örneklerinden biri System.Drawing.Point yapısıdır. Bünyesinde int türünden X ve Y adında iki özellik barındırır. Bu özellikler noktanın koordinatlarını verir.

Örnek:

System.Drawing.Point p = new System.Drawing.Point(); //Nokta tanımlanıyor

p.Offset(-1,-1);  //Köşegen yönünde kaydırılıyor.

Kendi struct tipimizi de tanımlayabiliriz.

Örnek:

struct Cycle
{
  int val, min, max;
  public Cycle(int min, int max);
  {
    val=min;
    min=min;
    max=max;
  }

…….

}

Yukardaki Cycle örneğini değer tipinden referans tipine çevirmek son derece kolay. Yapılması gereken sadece struct yerine class yazmaktır. Bu durumda heap bölgesine 12 byte (her değişken için 4 byte) tahsis edilecektir.

İşlevsellik benzer olsa da structure’lar  sınıflardan çok daha etkili sonuç verir. Uzman görüşü olarak 16 byte’tan küçük veriler için performansın yüksek olmasını istiyorsanız class yerine struct kullanmalısınız.

Enumeration Tipleri

Enumeration tipleri kodun rahat okunabilmesini sağlamak amacıyla geliştirilen semboilk tiplerdir. Geliştirme aşamasında sınırlı seçenekler sunmak amacıyla tanımlanırlar.

Örnek:

enum Titler{
    Mr, Ms, Mrs, Dr
}

Kaynak: MCTS Self-Paced Training Kit: Microsoft .Net Framework 2.0 Application Development Faundation