Konuyu Oyla:
  • Toplam: 2 Oy - Ortalama: 5
  • 1
  • 2
  • 3
  • 4
  • 5
   
Konu: C# - Bilinçsiz Tür Dönüşümü {8}
Hera
*
avatar
Yüzbaşı
Durum: Çevrimdışı
Seviye Puanı: 10
Yaşam Puanı: 133 / 242
Deneyim: 71 / 100
Rep Sayısı: 44
Mesaj Sayısı: 136
Üyelik Tarihi: 13.04.2019
     
Yorum: #1
C# - Bilinçsiz Tür Dönüşümü {8}
05.05.2019 12:31
Derleyici tarafından bir değişkeni tanımladığımız türün dışında geçici olarak başka bir türe çevirmeye bilinçsiz tür dönüşümü denmektedir. Örneğin aşağıdaki int türünden bir nesne float türünden nesneye atanmıştır;
Kod:
using System;

namespace Cyberizm
{
    class Program
    {
        static void Main()
        {
            int s = 10;
            float a;
            a = s;
            Console.WriteLine(a);
        }
    }
}


Bu programda a değişkeni float olmasına rağmen a değişkenine int türünden olan s değişkenini atayabildik. Bu işlemi sağlayan, derleyicinin gizlice yaptığı tür dönüşümüdür. Yani s değişkeni geçici olarak float türüne çevrilip a değişkenine atanıyor. Eğer bu işlem geçici olmasaydı a = s; ifadesinden sonra sonra s değişkeni float türünden olurdu. Bu durumda, aynı isimli değişken programın farklı noktalarında farklı türden davranacağı gibi programın karmaşıklığı artacaktı. Bu yüzden, özellikle belirtmedikçe bilinçsiz yapılan tür dönüşümlerinde bir nesnenin türü asla kalıcı olarak değiştirilmez.

Bilinçsiz yapılan tür dönüşümleri genel olarak iki biçimde yapılabilir. Bunlar küçük türün bütük türe dönüştürülmesi ve büyük türün küçük türe dönüştürülmesi gibidir. Büyük türler küçük türlere göre daha fazla bilgi içerdiklerinden küçük türler çoğu zaman büyük türlere dönüştürülebilirler. Fakat büyük türler küçük türlere dönüştürülemezler. Eğer bu mümkün olsaydı büyük türlerden küçük türlere geçerken veri kayıpları olacaktı.


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 bitleri yani büyük türden dolayı eklenen bitler sıfırla beslenir. Küçük türün yüksek anlamlı bitlerin sıfırla beşlenmesi değişkendeki değeri değiştirmediği için tür dönüşümünde herhangi bir veri kaybı olmamaktadır.

Bu şekilde yapılan tür dönüşümüne bir örnek vereyim;
Kod:
using System;

namespace Cyberizm
{
    class Program
    {
        static void Main()
        {
            byte a = 20;
            int b;
            b = a;
            Console.WriteLine(b);
            float f = 20f;
            double d;
            d = f;
            Console.WriteLine(d);
            char c = 'a';
            decimal m;
            m = c;
            Console.WriteLine(m);
        }
    }
}

Bu programda en dikkat çekici kısım char türünden c nesnesinin decimal türüne çevrilmesidir. Çünkü atama işlemini yaptıktan sonra m değişkenini ekrana yazdırdığımız da 'a' karakterinin Unicode karşılığını görürüz. Bu programı derleyip çalıştırdığımızda aşağıdaki gibi çıktı elde ederiz;

Şimdi de farklı türlerden nesnelerin aynı ifade içinde nasıl davrandığını görmek için bir örnek verdim. Aşağıdaki örnekte int, byte ve short türünden üç değişkeni toplanarak long türünden bir değişkene atanıyor. Sonuç olarak toplanan her her üç değişken türü de long türünden küçük olduğu için tür dönüşüm işlemi veri kaybı olmadan gerçekleşmiştir.
Kod:
using System;

namespace Cyberizm
{
    class Program
    {
        static void Main()
        {

            int a = 10;
            byte b = 20;
            short c = 30;
            double d;
            d = a + b + c;
            Console.WriteLine(d);
        }
    }
}

Örnekte de görüldüğü üzere gibi küçük veri türleri genellikle büyük veri türlerine dönüşebilir!

Bilinçsiz tür dönüşümü ile ilgili diğer ilgi çekici bir durum ise byte türünden nesnelerin toplanmasıyla ilgilidir. Byte türünden nesneler toplandığında sonuç olarak int türünden nesneler üretilir. Yani iki ya da daha fazla byte türünden nesne ile aritmetik işlem yapacaksak sonucunu mutlaka int ya da daha büyük bir türden değişkene atamalıyız.
Örneğin aşağıdaki programı derlediğimiz de şu hatayı alırız;

"Cannot implicitly convert type 'int' to 'byte'"

Bu, "int türünden byte türüne bilinçsiz olarak dönüştürülemedi" demektir.
Kod:
using System;

namespace Cyberizm
{
    class Program
    {
        static void Main()
        {
            byte a = 5;
            byte b = 10;
            byte c = a + b;
            Console.WriteLine(c);
        }
    }
}

Bu programın sorunsuz bir şekilde derlenebilmesi için "byte c = a + b;" satırının "int c = a + b;" şeklinde değiştirmemiz gerekir. Bu şekilde yaptığımı değişiklik herhangi bir tür dönüşümüne sebep olmayacaktır. Çünkü byte türünden sayılar toplandığında int türünden sayılar üretilir. Eğer bu satırı "double c = a + b;" şeklinde değiştirmiş olsaydık üretilen int türünden sayı double türüne dönüştürülecekti. Peki, nasıl oluyorda iki byte nesnesinin toplamı int türünden bir sayı oluyor?

Bildiğimiz gibi byte türünden saklayabileceğimiz en büyük değer 255'tir. Byte türünden sayılarla işlem yaptığımızda bu sınırı aşma olasılığı çok yüksek olduğu için muhtemel hataları önlemek için C#dilini tasarlayan mühendisler bu önlemi almışlardır. Eğer bir önlem alınmamış olsaydı aşağıdaki programda byte türünden iki değişken çarpımı byte türünden bir değişkenin sınırlarını aştığını için program derlenmeyecekti.
Kod:
using System;

namespace Cyberizm
{
    class Program
    {
        static void Main()
        {
            byte a = 16;
            byte b = 200;
            byte c = a + b;
            Console.WriteLine(c);
        }
    }
}


Bilinçsiz tür dönüşümleri değişkenler üzerinde geçerli olduğu gibi sabitler üzerinde de geçerlidir. Örneğin, bir float sabiti olan 16.5 sayısını double türünden bir değişkene şu şekilde atayabililriz;

double c = 16.5f;

Ya da char türünden bir sabit olan 'a' karakterini int türünden bir değişkene aşağıdaki şekilde atayabiliriz;

int c = 'a';

C# dilinde bilinçsiz olarak tür dönüşümü yapabileceğimiz bütün veri türleri aşağıdaki tablo halinde mevcuttur. Tablodaki birinci kolon dönüşümün yapılacağı tür, ikinci kolon ise dönüşümü sonunda oluşacak türdür.
Yukarıdaki tabloda C# dilinde bilinçsiz olarak yapılabilecek tür dönüşümleri mevcut. Ancak bazı türler arasında tür dönüşümü yapmak mümkün değildir. bu durumları aşağıdaki gibi sıralayabiliriz.
  • bool, decimal ve double türünden herhangi bir türe
  • 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ç)
Bu tür durumları kapsayan bir örnek vereyim, bu örnekte yapılmak istenen tüm dönüşümler hatalıdır.
Kod:
using System;

namespace Cyberizm
{
    class Program
    {
        static void Main()
        {
            short b1 = 50;
            char c1 = b1;
            bool b2 = b1;
            int i1 = b2;
            double d1 = 10.2;
            int i2 = d1;
            decimal m1 = 25.4M;
            double d2 = m1;
            byte bt1 = 65;
            char c2 = bt1;
            float f1 = 25.74F;
            decimal d3 = f1;
        }
    }
}

Yukarıdaki örnekte görülen en ilginç durum short ve char türleri arasındaki dönüşüme izin verilmemektedir. Bildiğiniz gibi her iki türde 16bitlik veriler tutmaktadır. Buna rağmen tür güvenliği açısından bu tür gibi bir dönüşüme izin verilmemiştir.
Alinti
Rep Verenler: The_ZiziL
Einstein
*
avatar
Yüzbaşı
Durum: Çevrimdışı
Seviye Puanı: 12
Yaşam Puanı: 71 / 299
Deneyim: 97 / 100
Rep Sayısı: 37
Mesaj Sayısı: 194
Üyelik Tarihi: 15.09.2017
     
Yorum: #2
RE: C# - Bilinçsiz Tür Dönüşümü {8}
05.05.2019 13:24
Teşekkürler, Emeğine Sağlık Smile

Körler memleketinde görmek bir hastalık sayılır.
- Cenap Şahabettin
Alinti
DeathWing
*
avatar
Yüzbaşı
Durum: Çevrimdışı
Seviye Puanı: 8
Yaşam Puanı: 72 / 196
Deneyim: 84 / 100
Rep Sayısı: 26
Mesaj Sayısı: 97
Üyelik Tarihi: 26.03.2019
     
Yorum: #3
RE: C# - Bilinçsiz Tür Dönüşümü {8}
05.05.2019 16:39
Teşekkürler, Emeğine Sağlık Smile
Alinti
The_ZiziL
*
avatar
Valhalla
Durum: Çevrimiçi
Seviye Puanı: 37
Yaşam Puanı: 902 / 902
Deneyim: 9 / 100
Rep Sayısı: 610
Mesaj Sayısı: 2017
Üyelik Tarihi: 06.02.2017
     
Yorum: #4
RE: C# - Bilinçsiz Tür Dönüşümü {8}
06.05.2019 10:49
Teşekkürler, Emeğine Sağlık.

Allah’tan utanmayan insanlardan da utanmaz…
Alinti
MECZUP
*
avatar
Binbaşı
Durum: Çevrimdışı
Seviye Puanı: 29
Yaşam Puanı: 713 / 713
Deneyim: 53 / 100
Rep Sayısı: 43
Mesaj Sayısı: 1137
Üyelik Tarihi: 18.12.2017
      
Yorum: #5
RE: C# - Bilinçsiz Tür Dönüşümü {8}
06.05.2019 11:51
Teşekkürler, Emeğine Sağlık

Meczup Official

VarsaYoksa Cyberizm
Alinti



1 Ziyaretçi