C# Bilinçsiz Tür Dönüşümü

By Burak TUNGUT - 21.11.2012 - Kategori C#

Bu makalemiz ile C# da bilinçsiz tür dönüşümlerine değinip, bol bol örnek yapacağız.
Aynı zaman da tür dönüşümü mantığına değinip, C# dilinin type safety anlayışına da değinmiş olacağız.
Bir sonraki makalemiz ile bilinçli tür dönüşümlerini de tanıyarak tür dönüşümleri konusunu bitirmiş bulunacağız.

Bu makalemiz ile C# da bilinçsiz tür dönüşümlerine değinip, bol bol örnek yapacağız.
Aynı zaman da tür dönüşümü mantığına değinip, C# dilinin type safety anlayışına da değinmiş olacağız.

Bir sonraki makalemiz ile bilinçli tür dönüşümlerini de tanıyarak tür dönüşümleri konusunu bitirmiş bulunacağız.
 

Ağustos'un son gününde, sıcak bir Antalya gününden yine herkese Merhabalar :)
Karnımız tok, kulaklığın sesi iyi derecede, kıpır kıpır bir şarkı çalıyor. Sanırım herşey olması gerektiği gibi. O zaman bügünkü konumuza artık başlayalım. Bu konudaki örneklerde bol bol debug kullanacağız diye düşünüyorum en iyisi hazırlıkları tamamlayalım artık :)

Tür Dönüşümü nedir ? Neden Kullanırız ?

Uygulamalarımız da elimizdeki nesne ya da çeşitli tiplerin, bazı durumlarda bambaşka şekilde davranmalarını ya da benzemelerini isteriz.Ya da çoğu zaman uygulamalarımız da değişkenler üzerinden çeşitli aritmetik ya da lineer işlemler gerçekleştiriz, ama iki farklı tipi bu işleme koymak çoğu zaman mümkün değildir. İşte bu ve buna benzer çoğu senaryoda tür dönüşümlerine ihtiyaç duyarız.
Sn.Sefer Algan'ın da bu konu hakkında bir örneklemesi vardı, "... Nasıl 3 elma ile 2 armutun toplamı mantığınıza ters düşüyorsa aynı şekilde 3 byte ile 2 int'in toplamıda bilgisayar açısından mantıksızdır..."

Bilinçsiz Tür Dönüşümü

Adından da anlaşıldığı üzere aslında çoğumuz yazdığımız küçük uygulamalarda bile farkında olmadan değişkenleri tür dönüşümüne maruz bırakıyoruz.
Mesela aşağıdaki gibi bir kod bloğu düşünelim,
 

namespace Makale.Test
{
    class Program
    {
        static void Main(string[] args)
        {
            int _int = 35;

            double _double;

            _double = _int;
            Console.WriteLine(_double);
        }

    }
}


Ekran çıktımız ise,



Şeklinde olacaktır.
Aslında alışık olduğumuz bir olay olduğu için çoğumuza şaşırtıcı gelmemiş olabilir fakat burda _int değişkenimiz geçici olarak (bellekte yeni bir adres ile) double veri türüne dönüştürüldü ve _double değişkeninin içeriğine eklendi.
Derleyici aslında burada bir sonraki makalede işleyeceğimiz bilinçli tür dönüşümünden başka birşey yapmadı. Sadece biz bilinçli olarak bunu yapmasak bile derleyici bizim yerimize bunu gerçekleştirdi.

Bu örneğimizi kavradıysak artık tür dönüşümünü ikiye ayırdığımız gibi, bilinçsiz tür dönüşümünüde Küçük Türün Büyük Türe, Büyük Türün Küçük Türe dönüştürülmesi şeklinde ikiye ayırabiliriz.
 

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

Küçük türler, veri kaybı yaşanmaksızın sorunsuzca kendinden büyük türlere dönüştürülebilirler. Dönüşüm sırasında ise veri tipine göre değişecek olan büyüklüğümüz de sonradan eklenecek olan bitler 0 olarak kalırlar.
Hemen bir örnek daha yapalım,
 

namespace Makale.Test
{
    class Program
    {
        static void Main(string[] args)
        {
            byte _byte = 10;
            int _int;

            _int = _byte;
            Console.WriteLine(_int);

            char _char = 'b';
            decimal _decimal;

            _decimal = _char;
            Console.WriteLine(_decimal);
        }

    }
}

 

Mantıkende int, byte'dan ve decimal, char'dan daha fazla büyük değer alabileceği için sorunsuzca dönüşüm işlemimiz gerçekleşti. Decimal değerimiz ise 'b' harfinin Asci tablodaki karşılığındaki değerini aldı.

Aslında son örnek ile de bilinçsiz tür dönüşümünü pekiştirdik fakat iki adet byteın aritmatiksel toplamından elde edilecek veri türünün ne olduğu ?

Integer ile integerın toplamı kendisi, double ile doubleın kendisi, float ile floatın yine kendisi. Fakat byte ile bytein toplanması ya da çarpılması durumunda elde edeceğimiz sonuç neden integer ?



2 adet byte'ın toplamını, başka bir byte değere aktarmaya çalışınca bize verdiği hataya göre 2 adet byte veri tipinin toplamının aslında bir integer olduğu yönünde.
Aslında burda C# dilinin inceliklerinden birini görmekteyiz. C# bize iki adet byte değerin toplamının ya da çarpımının 255 yani byte türünün saklayabileceği maximum değeri aşabileceğinden dolayı bu sonucu integer bir değere aktarmamız yönünde bizi zorluyor. Haksız da sayılmaz :)
 

Dikkat!

  1. Hiç bir tür char veri türüne,
  2. Boolean, decimal ya da ondalıklı sayı türlerine (float,double),
  3. float ve decimal türevlerinden başka türlere biliçsizce dönüştürülemezler!

 

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

Aslında bilinçsiz tür dönüşümlerinde C#, büyük türlerin küçük türlere dönüşümünü veri kaybı olmaması için ve "type safety" anlayışı için engellemiştir.
Büyük türlerin küçük türlere dönüştürülmesini, oluşabilecek veri kayıplarını ve bu kayıpların irdelenmesini yarınki makalemiz de bilinçli tür dönüşümleri konusu ile değiniyor olacağız.

 

 

 

Bir sonraki makalem de görüşmek üzere, esen kalın :)

 

 

H.Burak TUNGUT
Bilgisayar Mühendisliği Öğrencisi
www.buraktungut.com

 

Yorum Bırak

Facebook
Son Yorumlar