Değişkenler arası dönüşüm

Selamlar, bu yazımızda değişkenler arası dönüşümler nedir nasıl yapılır o konuya değinmek istiyorum. Fakat konuya başlamadan önce geçen konumuzda açıkladığımız derinleme bakışta değinmediğim bir noktaya değineceğim.

Farkettiyseniz sizeof methodu ile bir değişkenin bellekte kapladığı yeri görebiliyorduk, ve ben bazı değişkenleri gösterip bazılarını da kendinizin bakmasını istemiştim eğer baktıysanız bool değişkenin sizeof methodundan dönen sayısı 1 dir yani 1 byte 1 byte 8 bit ediyor ve biz bool değişkenini incelerken bellekte 1 bit yer kapladığını söylemiştik.

Aslında bool değişkeni oluşturulduğunda bellekte bir byte’lık yer ayrılır fakat sadece 1 bit kullanılır, yani kalan 7bit boşa gidiyor =)

Her neyse gelelim konumuza. Tür dönüşümleri

Öncelikle neden böyle bir şeye ihtiyacımız var bir onu açıklayayım.

Bizim bazen verileri kendi arasında dönüşüm yapmamız gerekir örneğin double tipindeki bir veriyi integer tipine integer tipindeki bir veriyi double’a çevirmemiz gerekiyor.

Şimdi şöyle biz eğer kullanıcılarımızın not ortalamasını hesaplarken 100 üzerinden konuşuyorum, 95.5 gibi bir değer çıkabiliyor karşımıza fakat program içinde bunun ilk 95’lik kısmını kullanmamız gerekiyor veya veri tabanına eklerken noktalık ifadeleri eklemememiz gerekiyor, çünkü veri tabanında değişkeni tutarken int tipinde tutulduğunu varsayıyorum.

Siz eğer ;

Böyle bir şey yaparsanız muhtemelen hata alırsınız (95.5d değerinin not ortalaması olduğunu varsayıyorum). Bu hatayı almanızın sebebi tür dönüşümü sırasında veri kaybınızın olacağındandır buradaki kayıp nedir 0.5lik kısımdır tam olarak burada konumuz Implicit casting ve Explicit casting olayına giriyor. Şimdi sırayla başlayalım

Implicity casting

Eğer sizin dönüştürmek istediğiniz verinin değeri dönüştürülecek olan verinin değerinden daha küçük ise c# bunu otomatik olarak yapar çünkü veri kaybı nerdeyse 0 ‘dır.

Yani bu ne demek oluyor? biz değişkenlerin sizeof ve maxValue değerlerine bakarsak burada her şey ortaya çıkıyor zaten, bizim dahili olarak oluşturmuş olduğumuz double sayısı int sayısından her halükarda büyük, yani biz int sayısını double sayısına çevirirken herhangi bir veri kaybı yaşama olasılığımız çok düşük, yani eğer yukarıdaki kod şöyle olsaydı ;

Gördüğünüz gibi vscode üstünde 85 üzerine mouse imleci ile geldiğimde türünün System.Int32 olduğunu söylüyor neden Int32 olduğuna bu konu içerisinde geleceğiz.

çünkü double sayısı int sayısından daha büyüktür ve int bir veri sayısı double veri sayısına çevrilirken implictly casting yapılabilir oluyor. peki başka neler implicitly casting edilebilir ?

Eğer dikkat ederseniz float sayısı da double’a implicitly casting yapılabiliyor bunun sebepleri double sayısının hepsinden büyük olmasıdır.

double -> float -> decimal -> int -> short -> byte

yukarıda büyükten küçüğe türleri yazdım bu türler küçükten yukarı casting edilmeye çalışılırsa herhangi bir problem meydana gelmez.

Peki double bir sayıyı float sayısına çevirmek istersek?

Zaten hatada da açıkca belirtiliyor, yukarıdan aşağı bir dönüşüm yapmak istersek veri kaybımız olacaktır, ve c# bunu birnevi bizden onaylamamızı istiyor ve elle müdahele etmek lazım bu durumda karşımıza da  Explicitly casting çıkıyor.

Explicit casting

Bu cast türünü yukarıda zaten ifade ettik boyut olarak yüksek bir şeyi daha alt boyutlara dönüştürmeye çalıştığımız olayına söyleniyor.

Siz bir değişkenin başına türünü belirli ederek yazarsanız aslında casting işlemi yapmış olursunuz. Dikkat ederseniz yukarıdaki 85.5 sayısı double fakat başına parantez içerisinde float ekledim ve bu sayıyı float olarak ele alacağımı söyledim.

Fakat eğer bir string değişkenini herhangi bir sayı türüne çevirmeye çalışırsak?

gördüğünüz gibi sayı zaten double olmasına rağmen implict casting’i yemedi bir de explicit deneyelim.

Onu da yemedi 😀 peki ne yapacağız burada da bize Convert class’ı yardım ediyor Convert class’ı ile string verileri sayı verilerine dönüştürebiliyoruz.

Convert classına nasıl erişeceğimizi zaten biliyoruz bunun içerisindeki methodlara . ile erişebileceğimizi de biliyoruz ToDouble ifadesi ile içerisine verilen string ifadeyi double’a çevireceğimi söylüyorum ve gördüğünüz gibi editörümde herhangi bir hata yok peki kodu çalıştırdığımda hata verir mi?

Evet malesef bir hata ile karşılaştık bunun sebebi string ifade içerisinde “d” harfini eklememiz. çünkü zaten ToDouble diyerek double bir ifade almak istediğimi belirttim metin içerisinde bunu belirtmeme gerek yok.

sayi değişkeninin içerisindeki d harfini kaldırırsak kod düzgün çalışacaktır güvenin bana =)

Peki biz her seferinde hangi türe dönüştüreceğimizi nasıl bileceğiz, yani bu soruyu açıkca anlamamız biraz zor şu aşamada fakat hemen şöyle bir örnek göstereyim.

Yukarıdaki görselde Convert.ToInt methodunu kullanmak istedim fakat birsürü var… hangisini seçeceğinize nasıl karar vereceksiniz? Aslında yanlarındaki sayılar sizin bellekte kaplayan bit sayısına tekabül etmekte, yani normal bir bit 4byte olduğu için 4×8’den 32 byte etmektedir, fakat siz gidip 64’ü seçerseniz;

Şöyle bir hata alırsınız bu hatanın sebebi 64bit yer kaplayan int türü 32bit int türünden daha büyük bu hatayı çözmemizin iki yöntemi var siz

  1. Explicit casting

Convert.ToInt64 methodundan gelen sayıyı 32bite dönüştürmek için explicit casting yapabilirsiniz yani,

2. Türü değiştirmek

int değişken tanımlayıcısını long veya Int64 yapabilirisiniz yani

Şimdi gelelim esas sorumuza biz tür dönüşümü yaparken convert class’ını ve Toxxx methodunu kullanmak zorunda mıyız alternatif bir yöntem yok mu ?

Var tabiki, kurtarıcımız parse methodu

Dahili olarak c# içerisinde gelen çoğu değişkenin içerisinde Parse methodu mevcut

Örnek olarak siz bir string ifadeyi int verisine çevirmek isterseniz int içerisinde bulunan Parse methodunu kullanabilirsiniz.

Gördüğünüz gibi hem long’da hem de int veri tipinde Parse methodları mevcut ve bu methodlar ile string ifadeleri istediğimiz türe dönüştürebiliriz. Convert class’ı ile farkı nedir?

Convert methodunun içerisine null bir ifade verirseniz size 0 değerini döndürür, fakat parse methodu içerisinde null verirseniz size hata verecektir.

Yukarıdaki kodu çalıştırırsam eğer çıktım şöyle bir şey oluyor.

Benim 6. satırdaki kodum int sayi= int.Parse(null) olandır gördüğünüz gibi programım çalışmayı bıraktı ve sonlandı.

Fakat her iki method için de bir tehlike mevcut. Eğer siz metinsel ifadelerin içinde güzel sayılar verirseniz, güzel sayılardan kastım gerçekten o veri tipine dönüştürülebilir sayılar örneğin ben 25 verdim ve bu program için ok. 25 çünkü integer bir sayı fakat ben x diye birşeyler girersem ne olur?

Gördüğünüz gibi hata aldık peki ya parse methodunda durum nasıl işler?

Gördüğünüz gibi sonuç değişmiyor aynı hatayı tekrar aldık.

Bir program geliştirdiğinizi düşünün kullanıcıdan sayı alıyorsunuz fakat kullanıcı sayı yerine gidip harf giriyor, böyle bir senaryoda bu iki methodu kullanmanız sizin programınızın sonlanmasına sebep olur peki siz kullanıcı olarak programın sonlanmasını mı  yoksa “hatalı değer girdiniz lütfen bir sayı girin” mesajını görmek mi isterdiniz?

Elbetteki uyarı mesajını görmek isterdiniz.. Eğer böyle bir program geliştirmek istiyorsak şart bloklarını bilmemiz gerekiyor hadi isterseniz şart bloklarından if ile başlayalım sonraki konumuzda.

Evet biliyorum hepiniz artık program yazmak istiyorsunuz, fakat temelleri atmadan direk program yazdırmak istemiyorum. Kodları görsel olarak paylaşıyorum çünkü yazmanızı istiyorum, kopyalayabileceğiniz satırlar da bırakabilirdim fakat ellerinizi kirletin lütfen.

erdincyasan Yazar:

0 0 votes
Değerlendirme
guest
0 Yorum
Inline Feedbacks
View all comments