C# – Typecast (Bilinçli Dönüşüm – Explicit Type Conversion) kullanımı

Basit bir tasarruf uygulaması kodu üzerinden typecast (bilinçli dönüşüm) kullanımını inceleyeceğiz. Kodun detaylarında saatte 2 tl elektrik yakan bir ampul ile totalde %20 tasarruf sağlayan bir ampulün girilen kullanma süresi gibi detaylar ile birlikte faturaya yansıyacak fiyatlarını yazdıran bir kod yazmamız isteniyor.

Kodumuz

  • 16. satırda yapılan typecast (bilinçli dönüşüm) işlemi (float) 80 / 100 şeklinde olmalı.
  • 17. satırda Console.WriteLine() metodu ile ekrana yazdıracağımız şeyleri yazdırırken dikkat etmemiz gerekenler vardır. Eğer bir metin yazdırmak istiyorsak bunları parantezde tırnak işaretleri içerisinde yazarız. Eğer ki yazdırmak istediğimiz şeyler kodun içinde tanımlamış olduğumuz değişkenler ise, bunları parantezde direkt olarak değişkenin ismini yazmak suretiyle yazdırabiliriz fakat eğer hem metin hem de değişken yazdırmak istiyorsak bunları + (artı) işareti ile aynı anda yazdırabiliriz. C dilindeki printf fonksiyonunun parantez içindeki gibi virgül ile ayırmak söz konusu değildir.

Kodun Çıktısı

Hatalar

  • Bu hatalı kodda, 16. satırdaki bölme işlemi parantez içinde yapılmış ve önünde de typecast kullanılmak istenmiş fakat bölme işleminin sonucu 0.8 olduğu için işlem yapıldıktan sonra float türüne dönüştürmek bir şey ifade etmeyecektir. Çünkü işlemin sonucu olarak sadece virgülden/noktadan öncesini alacaktır ve 0.8’nın 0’ını alarak floata dönüştürdükten sonra 0.0 elde edilmiş olur.
Hatalı ilk kodumuzun çıktısı budur.
  • Bu hatalı kodun çıktısında görüldüğü gibi sonuç 0 olur çünkü 50 * 0.0 = 0
  • Buradaki hatalı kodda ise, 16. satırda float ifadesi paranteze alınmalıdır. Aksi taktirde bu ifade tanımlanamayacaktır.
Hatalı ikinci kodumuzun çıktısı da bu şekilde.

Type Conversion (Typecast and Methods)

Type Conversion (tür dönüşümü)’ın bir alt formu olan Typecast konusu anladığım kadarıyla; basit, temel ve bir o kadar da önemli bir konu. Kodlamaya başladığım ilk zamanlarda öğrenmiş olmama rağmen ve hatta şu kısa süreli blog serüvenimde bile bununla ilgili bir örnek yapmış olmama rağmen, yaptığım matematik işlemlerinde bu konuyla ilgili detaylar yüzünden sonuca ulaşamadığımı fark ettiğim bir konu olduğu için tür dönüşümleri için ayrı bir başlık açmak istedim.

Veri türeleri arası dönüşüm, bir değişkenin değişik türdeki hâlinin başka bir değişkene atanmasıdır. Typecast (type casting) de denir. İki formu vardır.

Typecast

  1. Bilinçsiz Dönüşüm (Implicit Type Conversion): Düşük kapasiteli bir değişken, sabit ya da değişken ve sabitlerden oluşan matematiksel ifadenin daha yüksek kapasiteli bir değişkene atanması. Özel bir kod gerekmez
  2. Bilinçli Dönüşüm (Explicit Type Conversion): Genellikle derleyicinin izin vermediği durumlarda kullanılır. Bilinçli tür dönüşümüyle küçük türün büyük türe dönüştürülmesi gereksizdir, bilinçsiz tür dönüşümü bu işi yapar. Dönüşümü yapılan değişkenin tuttuğu değer, dönüştürülecek türün kapasitesinden büyükse veri kaybı gerçekleşebilir.

Bilinçsiz Dönüşüm (Implicit Type Conversion)

Bilinçli Dönüşüm (Explicit Type Conversion)

object Türüyle İlgili Kurallar

object türündeki bir değişkene başka herhangi bir türdeki değişken ya da sabit (string dışında) + işaretiyle eklenemez.

object türündeki bir değişkene herhangi bir türdeki değişken ya da sabit atanabilir (bilinçsiz tür dönüşümü). object türündeki bir değişkeni başka bir türe çevirmek için tür dönüştürme işlemi kullanılır. Dönüştürülen türlerin uyumlu olması gerekir.

Aynı satırda çifte dönüşüm yapılamaz.

string Türüyle İlgili Dönüşümler

x.ToString(): x değişken ya da sabitini stringe çevirip tutar.

string türüyle ilgili bilinmesi gerekenler:

Methods (System.Convert sınıfı)

Tür dönüşümü için metotlar System isim uzayında Convert sınıfındadır. Hemen hemen her tür her türe dönüştürülebilir. Değişken türlerinin CTS (Common Type System) karşılıkları bilinmelidir.

~Aritmetik Dönüşüm Hiyerarşisi

Kaynaklar:

C# – Challenges | Longest Word

Merhaba, bugün bahsedeceğim örnek kod, konularına tam anlamıyla hakim olduğum bir kod değil fakat bazı araştırmalar ve okumalar yaparak belli bir yere kadar ilerleme kaydettim ve bu kodu yazabildim. Bir sıkıntımız daha var ki, bu kodu yazmayı ve araştırmalarımı 8 Aralık 2019 Pazar günü tamamlamama rağmen yazısını bugün yani 26 Ocak 2020 Pazar günü yazabiliyorum. Açıkçası kodun ayrıntılarını maalesef unutmuşum. Şimdi sizlere anladığım ve hatırladığım kadarını aktarmaya çalışacağım.

Challenge Türü: Easy

Detaylar

Kodumuz

  • 2. satırda System.Linq kütüphanesi kullanılmalı. Kullanılmazsa 13. satırdaki, dizi elemanlarının büyükten küçüğe doğru sıralanması için kullandığımız OrderByDescending kodu çalışmaz. LINQ sorgusu hafızadaki (veya bir veri kaynağındaki) veri kümesinden program içinde SQL gibi sorgulama yaparak, seçilen verilerden oluşan yeni bir liste elde etmemizi sağlar. Linq hakkında daha fazla detay için bakabilirdiniz -> http://yazilim.cevapsitesi.com/Makaleler/5/linq-language-integrated-query-dile-entegre-edilmis-sorgu-nedir
  • 9. satırda kullandığım ayrac dizisini, yani bölmek istediğim cümledeki sözcükleri birbirinden ayıracak olan sembolleri ve boşluklarları tek tek kendim yazmak durumundayım. Buna maalesef alternatif bir çözüm bulamadım. Sıkıntı şu ki, benim orada tüm karakterleri yazmam mümküd değil ve benim yazmadığım bir sembol ile karşılaşılırsa kelimeleri ayrıması mümkün olmayacak. Örneğin kod ekrandan merhaba%okuyucu şeklinde bir girdi alsın. Bu yadığım kodda % sembolü bir ayraç olarak ifade edilmediği için buradaki merhaba ve okuyucu kelimeleri seçilemeyecek. Bunun yerine merhaba%okuyucu yu tek bir kelime olarak alacak. Bu satırdaki kod hatalı değil fakat eksiktir.
  • 10. satırda bir önceki yazımda da bahsettiğim .Split ifadesi yer alıyor. .Split() ifadesinde parantez içine yazdığımız şeyler bizim ayraçlarımız/bölücülerimiz oluyor. Kodumuz parantez içinde ne varsa, istenileni o ifadeyi gördüğü zamanlarda bölerek bir dizi haline getiriyor.
  • 13. satırda OrderByDescerding kodu sayesinde dizimizin elemanlarını büyükten küçüğe sıralayabiliyoruz. (Bu arada büyükten küçüğe, uzundan kısaya için Descending; küçükten büyüğe, kısadan uzuna için Ascending kullanılır.)

Kodun Çıktısı

Hatalar

  • Hatalı kodda 10. satır, ana kodda 13. satırda olan First() ifadesinin neden yazıldığına tam olarak hakim değilim fakat ortadan kaldırdığımızda aşağıdaki gibi bir hata veriyor. Anladığım kadarıyla En büyükten en küçüğe(en uzundan en kısaya) doğru sıraladığımız sözcük dizimizde tek bir elemanı seçip döndürmemiz geremiyor, bu da en uzun sözcük olan dizinin ilk eleman olduğu için First() ifadesi kullanılıyor. (asaba Last() gibi (dizinin son elemanı) ifadeler de var mı, kullanılıyor mu?)
hatalı kodun çıktısı böyle