C# Type Conversion (Tür Dönüşümü)

Merhabalar,

Bu hafta belirlediğim RoadMap‘in 3. bölümü olan “Tür Dönüşümü (Type Conversion)” hakkında edindiğim yararlı bilgileri ele alacağım. Programlamaya başlarken genelde en çok yaptığımız hatalardan biri tür dönüşümleriyle ilgilidir. Tür dönüşümlerini doğru anlamak ve yerinde uygulamak yapılan hataları en aza indirger.

Bir önceki serimde temel veri türlerini ele almıştık. Hatırlamak amacıyla konu başlıkları nelerdi anımsayalım. Bir önceki seriye buradan ulaşabilirsiniz.

  • C# dilindeki Temel Veri Türleri
  • Stack, Heap, Register, Static ve Sabit Bölgeler
  • Değer (Value) ve Referans (Reference) Tipler
  • CTS (Common Type System) Tipleri
  • Değer Tipleri özeti
  • Referans Tipleri özeti
  • C# 7.0 ile gelen Sabit Ayıraçları
  • var anahtar sözcüğü ile değişken tanımlama

Seriye başlarken bizim motivasyonumuzu artıracak alıntı sözler ile başladım. Bu serinin tamamında bizi gaza getirebilecek güzel alıntıları paylaşıyor olacağım. Bu serinin motivasyon cümlesi;

“Hayatlarımızı biçimlendiren, ara sıra yaptığımız şeyler değil, sürekli olarak yaptığımız şeylerdir”

Antony Robbins

Bir önceki serimizi anımsayıp ve motivasyon cümlesini yazdığımıza göre artık yeni serinin konusu olan Tür Dönüşümü’ne başlayabiliriz.

Tür Dönüşümü

ikinci serimde temel veri türleri ve değişkenleri görmüştük. 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.

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.

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.

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

Tür dönüştürme tablosu hakkında daha detaylı bilgiye buradan ulaşabilirsiniz.

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.

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.

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.

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

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.
Boxing ve Unboxing işlemleri

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

Bugün serimizin sonuna gelmiş bulunmaktayız. Tür dönüşümü ile ilgili edindiğim yararlı bilgileri paylaşmaya çalıştım. Tabi bu yararlı bilgiler bana göre yararlı bilgiler 🙂 Bu bilgiler ile her zaman belirttiğim gibi birçok konu başlığını daha önceden duymuş veya biliyor olabilirsiniz. Amaç C# programlama dilinde programlama genel kültürünü artırmak ve etkin bir şekilde C# programlama dilini projelerimizde kullanabilmek.

Bir sonraki serimde RoadMap’e bağlı kalarak Operatörler (Operators) hakkında edindiğim bilgileri paylaşıyor olacağım. Görüşmek dileğiyle.

Kaynaklar:

Her Yönüyle C# 7.0, Sefer Algan, Pusula Yayincilik,

https://docs.microsoft.com/en-us/dotnet/csharp/programming-guide/types/casting-and-type-conversions

Leave a Comment