Konuyu Oyla:
  • Toplam: 0 Oy - Ortalama: 0
  • 1
  • 2
  • 3
  • 4
  • 5
   
Konu: C# - Bilinçli Tür Dönüşüm Sakıncaları {10}
Hera
*
avatar
Yüzbaşı
Durum: Çevrimdışı
Seviye Puanı: 9
Yaşam Puanı: 42 / 201
Deneyim: 5 / 100
Rep Sayısı: 27
Mesaj Sayısı: 101
Üyelik Tarihi: 13.04.2019
     
Yorum: #1
C# - Bilinçli Tür Dönüşüm Sakıncaları {10}
07.05.2019 18:57
Hatırlarsanız bilinçsiz yapılan tür dönüşümlerinde büyük türler küçük türlere dönüştürülemiyordu. Fakat eğer tür dönüştürme operatörü kullanırsak bu mümkündür. Örneğin, aşağıdaki programda daha büyük olan int türü byte türünden bir nesneye atanmıştır. Bu programı derleyip çalıştırdığımızda herhangi bir hata almayız.
Kod:
using System;

namespace Cyberizm
{
    class Program
    {
        static void Main()
        {
            int i = 10;
            byte b = (byte)i;
            Console.WriteLine(b);
        }
    }
}

Yukarıdaki program sorunsuz çalıştı ve ekrana 10 yazdırdı. Peki nasıl oldu da büyük tür küçük türe veri kaybı olmadan dönüştürüldü. Şimdi işin biraz derinlerine bakalım.

i değişkeni int türünden bir veri olarak tanımlanmış ve 10 sayısı i değişkenine atanmış. int türleri hatırlarsanız 4 bytelık bir bilgi tutuyorlardı. Yani i değişkeninin bellekteki yerleşimi şu şekilde olur;
Buradaki her bir sekizli sayı bloğu bir byte'ı göstermektedir. i değişkenindeki 10 değeri son sekizli grupla ilgilidir. Bu değişken byte türüne çevirmeye çalıştığımızda byte türü bir byte'lık verileri tutabildiği için i değişkeninin yalnızca son sekizlik grubu işleme girecektir. Diğer 3 sekizli grup (yüksek anlamlı 3 byte) i değişkeninde etkin rol olmadığı için herhangi bir veri akybo olmadan tür dönüşümü mümkün olabilmektedir.

Ancak sizin de tahmin ettiğiniz gibi eğer i değişkenin değeri son sekizli gruptaki bitler ile ifade edilemiyorsa yani 255 değerini geçiyorsa tür dönüşümünde veir kaybı olmaktadır.

Şimdi de i değişkenine aşağıdaki gibi 10 yerine 256 değerini atayalım ve programı çalıştırdığımızda ekrana yazılanı inceleyelim.
Kod:
using System;

namespace Cyberizm
{
    class Program
    {
        static void Main()
        {
            int i = 256;
            byte b = (byte)i;
            Console.WriteLine(b);
        }
    }
}

Bu programı derleyip çalıştırdığınızda hiç de beklemediğimiz aşağıdaki ekran görüntüsünü elde ederiz;


Ekrana 256 yazmasını beklerken 0 yazıldı. O halde herhangi bir derleyici hatası ile karşılaşmamamıza rağmen veri kaybetmemiz pek de hoş görünmemektedir.

Şimdi de bu veri kaybının nedenini göstereyim;

256 Sayısının bellekteki görüntüsü şu şekildedir;
Bu sayıyı byte türüne çevirmek istediğimizde son sekizli grup (düşük anlamlı byte) işleme alınacağı için b değişkenine 0 değeri atanacaktır.

Gördüğünüz gibi tür dönüştürme operatörü ile yapılan bilinçli tür dönüştürme işleminin faydası kadar zararı da vardır. Bu yüzden programlarımızdaki hataları en aza indirmek için mümkünse tür dönüştürme işlemlerini kullanmamalıyız. Ancak bazı durumlarda tür dönüşümü mekanizmasından faydalanmak hem hız hem de kod organizasyonu açısından gerekli olabilmektedir.

Tür dönüştürme operatörünü değişkenlere uygulayabildiğimiz g ibi sabitler üzerinde uygulayabiliriz. Örneğin, float olan bir sabiti double türünden bir nesneye atamak için aşağıdaki gibi bir ifade kullanılabilir;

double b = (float)25.36;

Tür dönüşümü ile ilgili diğer bir önemli nokta gerçek sayı türlerinin tam sayı türlerine dönüştürülmesi sırasında görülür. Örneğin, float türden olan 25.6f sayısının int türüne çevirdiğimizde 25 tam sayı değerini elde ederiz. Bu tür dönüşümlerde virgülden sonraki veriler kaybolmaktadır.
(Bu konu en son: 07.05.2019 Tarihinde, Saat: 18:57 düzenlenmiştir. Düzenleyen: Hera.)
Alinti
Rep Verenler: Einstein
MECZUP
*
avatar
Binbaşı
Durum: Çevrimdışı
Seviye Puanı: 15
Yaşam Puanı: 164 / 374
Deneyim: 96 / 100
Rep Sayısı: 39
Mesaj Sayısı: 292
Üyelik Tarihi: 17.10.2018
      
Yorum: #2
RE: C# - Bilinçli Tür Dönüşüm Sakıncaları {10}
07.05.2019 19:49
Teşekkürler, Emeğine Sağlık Smile

Meczup Official

VarsaYoksa Cyberizm
Alinti
DeathWing
*
avatar
Yüzbaşı
Durum: Çevrimdışı
Seviye Puanı: 8
Yaşam Puanı: 37 / 196
Deneyim: 84 / 100
Rep Sayısı: 23
Mesaj Sayısı: 97
Üyelik Tarihi: 26.03.2019
     
Yorum: #3
RE: C# - Bilinçli Tür Dönüşüm Sakıncaları {10}
08.05.2019 12:13
Teşekkürler, Emeğine Sağlık Smile
Alinti
Einstein
*
avatar
Yüzbaşı
Durum: Çevrimdışı
Seviye Puanı: 13
Yaşam Puanı: 54 / 300
Deneyim: 0 / 100
Rep Sayısı: 37
Mesaj Sayısı: 195
Üyelik Tarihi: 15.09.2017
     
Yorum: #4
RE: C# - Bilinçli Tür Dönüşüm Sakıncaları {10}
08.05.2019 15:38
Teşekkürler, Emeğine Sağlık Smile

Körler memleketinde görmek bir hastalık sayılır.
- Cenap Şahabettin
Alinti



1 Ziyaretçi