Farklı veri türlerinin birlikte işlem yapabilmeleri için veri türlerinde dönüşüm yapılmaktadır. Değer tiplerini incelediğimizde byte, sbyte, int, float, double, decimal şeklinde küçük değerlerden çok büyük değerlere doğru veri türlerinin sıralandığını görüyoruz. Burada küçük bir değerin büyük bir değere dönüşümünde problem yaşanmaz. Örneğin int a = 50; şeklinde ifade edilen a değişkeni float y = a; şeklinde float türündeki y değişkenine bir dönüşüm işlemine gerek kalmadan atanabilir. int türü float türüne göre daha küçük bir tür olduğu için arka planda gizli bir tür dönüşümü yapılır. Ama büyük türden küçük türe dönüşüm sırasında aynı şey söz konusu değildir. Bu durumda veri kayıpları yaşanır.
int x = 5;
byte y = 250;
double z;
z = x + y;
Yukarıdaki örnekte int ve byte türünden değişkenler gizlice double türüne dönüştürülüyor. Bu dönüştürme işlemi sırasında fazladan eklenen bitler sıfıra dönüştürüldüğünden değişkenin değerini değiştirmez. Böylece küçük türden büyük türe dönüşümde veri kaybı yaşanmaz.
Eğer büyük bir veri türünden küçük bir veri türüne dönüşüm yapıyorsak burada veri kayıpları ile karşılaşmamak için dikkatli olmalıyız.
int k = 50;
byte a = (byte) k;
Yukarıdaki örnekte parantez içindeki byte ifadesi int türünden k değişkeninde saklanan veriyi byte türüne dönüştürerek a değişkenine atamaktadır. Burada dönüşüm işlemi başarılı bir şekilde gerçekleştirilir ancak k değişkeni 257 gibi byte türü aralığının üstünde bir değer alırsa bu dönüşüm işlemi sırasında veri kaybı olacaktır. Benzer şekilde float türündeki 12,5f değerini int tam sayı olarak dönüşüm işlemi yaptığımızda virgülden sonraki değerler alınmayacak, veri kaybı oluşacaktır. O yüzden tür dönüşümlerinde büyük türden küçük türe bir dönüşüm işleminde dikkatli olmak gerekir.
Buraya kadar değer tiplerinin kendi içindeki tür dönüşümünden bahsettik. Peki bir değer tipi referans tipe dönüştürülebilir mi ? Evet yapılabilir. Çünkü bütün türler, referans tipinden olan object türünden türetilmişlerdir. Object nesnesinde var olan bütün özellik ve fonksiyonlar da diğer türlere kalıtım yoluyla aktarılmıştır. Bunlardan ToString() metodunun tüm nesnelerde olduğunu görebilirsiniz.
Bir diğer konu da değer tipleri bildiğiniz gibi RAM'in STACK bölgesinde tutulurlar. Referans tipleri de HEAP bölgesinde tutulurlar. int türünden bir değişkenin object nesnesine dönüştürülmesi işlemine boxing denilir ve stack bölgesinde tutulan değer heap bölgesine taşınır. Bu işlemin tersi de unboxing işlemidir. Bu işlemlerde veri kaybı yaşanmaz. Sadece veri bellekte stack ve heap bölgeleri arasında dolaştırılır.
int a = 5;
object k = (object)a;
int b = (int)k;
Son olarak system.convert isimli sınıf altında bu dönüşümleri yapan fonksiyonlar bulunmaktadır.
Örneğin
string a = "5";
string b = "3";
int c = Convert.ToInt32(a) + Convert.ToInt32(b);
Yukarıdaki işlemde string türünden referans bir tip olan a ve b değişkenleri HEAP alanından convert metodu ile int türüne dönüştürülerek STACK alanına taşınmışlardır ve burada ilgili matematiksel işlem gerçekleştirilmiştir.
Kaynak : Her yönüyle C# - Sefer Algan - Bölüm 3
2 Eylül 2009 Çarşamba sabah 11:53
Mesajınızı yazabilirsiniz