C# Tür Dönüşümleri

nhtctn nhtctn

 Bazı durumlarda tanımladığımız değişkenler programımızın ihtiyacına göre farklı bir türdenmiş gibi olmasını isteyebiliriz. Örnek vermek gerekirse yaptığınız bir programda ihtiyaca göre int veri türü ile byte veri türünün toplanmasını isteyebilirsiniz. Bunun için yani farklı türden değişkenleri tek çatı altında toplamak için tür dönüşümü kullanılır.

Tür dönüşümlerini genel olarak ikiye ayırabiliriz. Bunlar bilinçli (explicit) tür dönüşümleri ve bilinçsiz (implicit) tür dönüşümleri olarak adlandırılır.

Bilinçsiz (explicit) Tür Dönüşümleri

Tanımladığımız bir değişkeni geçici olarak başka bir türe derleyici tarafından çevirmeye bilinçsiz tür dönüşümü denir.

int k = 10;
float a;
a = s;

Tanımladığımız int k değişkenini bir başka tür olan float a değişkenine atayabildik. Tür dönüşümünü gizlice yapan derleyicinin kendisidir.

Not: Bilinçsiz yapılan tür dönüşümleri genel olarak iki biçimde yapılır: Küçük türün büyük türe dönüştürülmesi ve büyük türün küçük türe  dönüştürülmesi.

Küçük Türün Büyük Türe Dönüştürülmesi

Küçük türler büyük türlere dönüştürülürken fazla olan bitler yani büyük türden dolayı eklenen bitler sıfırla beslenir. Küçük türün yüksek anlamlı bitlerinin sıfırla beslenmesi değişkendeki değeri değiştirmediği için tür dönüşümünde herhangi bir ver kaybı olmayacaktır.

Not: Byte türündeki nesneler toplandığında sonuç olarak int türünden nesneler üretir. Yani iki veya daha fazla byte türünde nesne ile aritmetik işlem yapacaksak sonucunu mutlaka int ya da daha büyük bir türden değişkene atamalıyız.

C# dilinde bilinçsiz olarak yapabileceğimiz bütün veri türleri aşağıdaki tablodadır

sbyteShort, int, float, long, double, decimal
byteshort, ushort, int, uint, long, ulong, float, double, decimal
shortint, long, float, double, decimal
ushortint, uint, long, ulong, float, double, decimal
intlong, float, double, decimal
uintlong, ulong, float, double, decimal
long, ulongfloat, double, decimal
charushort, int, uint, long, ulong, float, double, decimal
floatdouble

Bazı Türler arasında tür dönüşümü yapmak mümkün olmayabilir.

  • bool, decimal ve double türünden herhangi birine
  • Herhangi bir türden char türüne
  • float ve decimal türünden herhangi bir türe (float türünden double türüne dönüşüm hariç)

Büyük Türün Küçük Türe Dönüştürülmesi

Büyük türlerin küçük türlere otomatik dönüştürülmesi C#’ta yasaklanmıştır. Eğer bu tür dönüşümüne izin verilseydi birçok veri kaybı yaşanabilirdi.

Bu tür bir dönüşümün mümkün olmaması C# dilinin tip güvenliğine type safety ne kadar önem verdiğinin göstergesidir.

Bilinçli (explicit) Tür Dönüşümü

Bilinçli (explicit) tür dönüşümleri genelde derleyicinin izin vermediği dönüşümlerde yapılır. Bu tür dönüşümler veri kayıplarına neden olacağından dikkatli kullanılmalıdır.

Tür Dönüştürme Operatörü

Tür dönüştürme operatörü açılan ve kapanan parantezlerden oluşur. Yani (..) gibi.

 byte a = 12;
 int i = (byte)a;

Tür dönüştürme operatörü burada okunabilirliği artırmak içindir. Okunabilirliğin büyük çaplı projelerde çok önemli bir kriter olduğunu düşünürsek tür dönüştürme operatörünün ne kadar etkili olduğunu anlayabiliriz.

checked ve unchecked Anahtar Sözcükleri

Büyük türlerin küçük türlere dönüştürülmesi ile veri kayıpları olmaktaydı. Bu veri kayıpları sırasında derleyici herhangi bir hata vermemektedir. Buda isteğimiz dışında bazı önemli hatalara sebep verebilir. Bu yüzden bazen veri kayıplarına karşı önlem almak isteyebiliriz. Bu önlemlerden biri checked anahtar sözcüğünü kullanmaktadır.

checked anahtar sözcüğü ile çalışma zamanında bu tür veri kayıplarının olabileceği durumlarda hata vermesini sağlarız.

int a = 256;
byte b;
 
checked
{
  b = (byte)a;
}
 
Bu tür checked kullanımında derleyici bize hata bildirimi yapacaktır. 

unchecked anahtar sözcüğü checked anahtar sözcüğünün tam tersidir. Varsayılan olarak bütün kodlar unchecked durumundadır.

int i = 256;
int b = 350;
byte k,t;
 
checked
{
  k = (byte)i;
  
  unchecked
  {
    t = (byte)b;
  }
}

Referans ve Değer Türleri Arasındaki Dönüşüm

C# dilinde tür dönüşümleriyle ilgili en önemli konu değer tipindeki verileri referans tiplerine çevirmektir. Seri 2’de değer tipleri ve referans tiplerinin bellekte farklı bölgelerde tutulduğu hakkında bilgi vermiştim.

Değer tiplerinin Referans tiplerine, Referans tiplerinin değer tiplerine dönüşümü boxing ve unboxing kavramlarıyla olmaktadır.

Boxing İşlemi

Şu anda popüler olan birçok dilde referans tipleri ile değer tipleri arasında herhangi bir dönüşüm yapılmamaktadır. Boxing işleminde değer tipini referans tipinden bir nesneye atadığımızda stack bölgesinde tutulan veri bit olarak heap bölgesine kopyalanır. Ve stack bölgesindeki object türünden olan değişken de bu heap bölgesini gösterecek şekilde ayarlanır.

Unboxing İşlemi

Unboxing işlemi boxing işleminin tamamen tersidir. Yani heap bölgesindeki bir nesnenin değer bit olarak stack bölgesine kopyalanır. Böylelikle referans türünü değer türüne dönüştürmüş oluruz.

Unboxing işleminin çalışma zamanında (run-time) hata vermemesi için sağlanması gereken iki önemli koşul vardır. Bunlar:

  • Unboxing işlemine tabi tutulacak nesnenin daha önceden boxing işlemine tabi tutulmuş olması.
  • Boxing işlemine tabi tutulmuş olan bu nesnenin unboxing işlemi sırasında doğru türe dönüştürülmesidir.

System.Convert Sınıfı ile Tür Dönüşümü

C# dilinin doğal yapısında bulunan tür dönüşüm mekanizmalarının yanısıra .NET sınıf kütüphanesindeki bazı özel sınıfların statik metotları da bu tür dönüştürme işlemi yaparlar.

Bazı durumlarda bu dönüşüm işlemi gerçekleşmez. Bu durumlar şunlardır:

  • Herhangi bir türün yine kendi türüne dönüşümünde. Bu durumda herhangi bir tür dönüşümü olmamış olur.
  • Dönüşüm işlemi sonucunda anlamlı bir ifadenin oluşmayacağı durumlarda. Yani bu durumlar “yanlış tür dönüşümü” dediğimiz (Invalid Cast Exception) hatası oluşur.

Convert Sınıfının çeşitli metotları:

Convert.ToBoolean(string str)str nesnesini bool türüne çevirir
Convert.ToByte(string str)str nesnesini byte türüne çevirir
Convert.ToSByte(string str)str nesnesini signed byte türüne çevirir
Convert.ToInt16(string str)str nesnesini short türüne çevirir
Convert.ToUInt16(string str)str nesnesini ushort türüne çevirir
Convert.ToInt32(string str)str nesnesini int türüne çevirir
Convert.ToUInt32(string str)str nesnesini uint türüne çevirir
Convert.ToInt64(string str)str nesnesini long türüne çevirir
Convert.ToUInt64(string str)str nesnesini ulong türüne çevirir
Convert.ToSingle(string str)str nesnesini float türüne çevirir
Convert.ToDouble(string str)str nesnesini double türüne çevirir
Convert.ToDecimal(string str)str nesnesini decimal türüne çevirir
Convert.ToChar(string str)str nesnesini char türüne çevirir

Yorum yazın

BENZER YAZILAR