C# Tür Dönüşümleri
C# programlarında bazen bir veri türündeki değeri başka bir veri türüne çevirmemiz gerekir. Örneğin Console.ReadLine() ile kullanıcıdan alınan bilgi metin türündedir. Bu bilgiyle sayısal işlem yapabilmek için uygun bir sayısal türe dönüştürülmelidir.
Bu makalede C# tür dönüşümlerini, otomatik ve açık dönüşüm arasındaki farkı, Convert, Parse ve TryParse kullanımlarını Console uygulaması örnekleriyle öğreneceğiz.
1. Tür Dönüşümü Nedir?
Tür dönüşümü, bir değerin veri türünü başka bir türe çevirmektir. Örneğin metin olarak tutulan "25" değerini tam sayıya dönüştürerek toplama işleminde kullanabiliriz.
string metinSayi = "25";
int sayi = Convert.ToInt32(metinSayi);
Console.WriteLine(sayi + 5);
Ekran çıktısı:
30
Dönüşüm yapılmasaydı "25" bir metin olarak kalırdı. Sayıya dönüştürüldükten sonra matematiksel işlemde kullanılabilir.
2. Console.ReadLine() Neden Dönüştürülmelidir?
Console.ReadLine(), kullanıcının girdiği bilgiyi string türünde alır. Kullanıcı ekrana 18 yazsa bile program bu girişi başlangıçta metin olarak okur.
Console.Write("Yaşınızı giriniz: ");
string giris = Console.ReadLine();
giris değişkeni string türündedir. Yaş bilgisini sayısal bir işlemde kullanmak için int türüne çevirebiliriz.
int yas = Convert.ToInt32(giris);
Console.WriteLine("Gelecek yıl yaşınız: " + (yas + 1));
3. Convert Metotları
Convert sınıfındaki metotlar, bir değeri uygun başka bir veri türüne dönüştürmek için kullanılır. Sık kullanılan metotlar şunlardır:
- Convert.ToInt32(): Tam sayıya dönüştürür.
- Convert.ToDouble(): double türüne dönüştürür.
- Convert.ToDecimal(): decimal türüne dönüştürür.
- Convert.ToString(): Metin türüne dönüştürür.
- Convert.ToBoolean(): bool türüne dönüştürür.
Örnek: Kullanıcıdan iki tam sayı alıp toplama
Console.Write("Birinci sayıyı giriniz: ");
int sayi1 = Convert.ToInt32(Console.ReadLine());
Console.Write("İkinci sayıyı giriniz: ");
int sayi2 = Convert.ToInt32(Console.ReadLine());
int toplam = sayi1 + sayi2;
Console.WriteLine("Toplam: " + toplam);
Convert kullanımı kolaydır; ancak kullanıcı sayı yerine harf veya geçersiz bir değer girerse program dönüşüm hatası verebilir.
4. Parse Metotları
Parse metotları, metin biçimindeki uygun bir değeri ilgili veri türüne dönüştürür. Örneğin int.Parse() metin olarak verilen tam sayıyı int türüne çevirir.
string metinSayi = "42";
int sayi = int.Parse(metinSayi);
Console.WriteLine(sayi * 2);
Ekran çıktısı:
84
Ondalıklı sayılar için double.Parse() veya decimal.Parse() kullanılabilir. Ondalıklı değerlerin metinden okunma biçimi bilgisayarın bölge ayarlarına göre değişebilir.
string metin = "12,5";
double sayi = double.Parse(metin);
Console.WriteLine(sayi);
Parse ile Convert'in ikisi de dönüşüm yapar. Her ikisinde de dönüştürülmek istenen metin geçerli bir sayı değilse hata oluşabilir.
5. Tür Dönüşüm Hataları
Kullanıcının her zaman beklenen biçimde veri gireceğini varsayamayız. Örneğin tam sayı beklenen alana "on iki" yazılırsa bu metin int türüne dönüştürülemez.
string giris = "abc";
int sayi = int.Parse(giris);
Bu örnekte abc bir tam sayı olmadığı için Parse işlemi hata verir. Kullanıcı girişini kontrol etmek ve hatalı girişte programın durmasını önlemek için TryParse kullanabiliriz.
6. TryParse ile Güvenli Dönüşüm
TryParse, dönüşümün başarılı olup olmadığını kontrol eder. Dönüşüm başarılıysa true, başarısızsa false değeri verir. Hatalı girişte programın dönüşüm hatasıyla durmasını önlemeye yardımcı olur.
Console.Write("Bir tam sayı giriniz: ");
string giris = Console.ReadLine();
int sayi;
bool donusumBasarili = int.TryParse(giris, out sayi);
if (donusumBasarili)
{
Console.WriteLine("Girdiğiniz sayı: " + sayi);
}
else
{
Console.WriteLine("Hatalı giriş. Lütfen tam sayı giriniz.");
}
out sayi ifadesi, dönüşüm başarılı olduğunda elde edilen sayının sayi değişkenine aktarılmasını sağlar.
Daha kısa biçimde, TryParse sonucunu doğrudan koşul içinde de kullanabiliriz:
Console.Write("Bir tam sayı giriniz: ");
string giris = Console.ReadLine();
if (int.TryParse(giris, out int sayi))
{
Console.WriteLine("Girdiğiniz sayının iki katı: " + (sayi * 2));
}
else
{
Console.WriteLine("Geçerli bir tam sayı girmediniz.");
}
7. Otomatik ve Açık Tür Dönüşümü
Bazı türler arasında dönüşüm C# tarafından otomatik olarak yapılabilir. Değer kaybı riski olmayan uygun sayısal dönüşümlerde bu işlem örtük (implicit) dönüşüm olarak adlandırılır.
int tamSayi = 25;
double ondalikliSayi = tamSayi;
Console.WriteLine(ondalikliSayi);
int türündeki değer double türüne aktarılabilir. C# bu dönüşümü otomatik yapar.
Daha geniş bir türden daha dar bir türe dönüşümde bilgi kaybı yaşanabileceği için bazen türü açıkça belirtmek gerekir. Buna açık (explicit) dönüşüm denir:
double ondalikliSayi = 12.8;
int tamSayi = (int)ondalikliSayi;
Console.WriteLine(tamSayi);
Ekran çıktısı:
12
Bu dönüşümde ondalık kısım atılır. Açık dönüşüm yaparken değerin bir bölümünün kaybolabileceğini göz önünde bulundurmalıyız.
8. Tür Dönüşümü ile Tür Değişikliği Aynı Şey midir?
Bir değişkene aynı türden yeni bir değer atamak, tür dönüşümü değildir. Tür dönüşümünde değerin veri türü değiştirilir.
int puan = 70;
puan = 90; // Aynı türde yeni değer atandı.
string metinPuan = "90";
int sayisalPuan = int.Parse(metinPuan); // string türü int türüne dönüştürüldü.
İlk örnekte puan değişkeninin türü değişmez; yalnızca değeri güncellenir. İkinci örnekte ise metin içindeki sayı tam sayıya çevrilir.
9. Uygulama: İki Sayıyı Güvenli Şekilde Toplama
Aşağıdaki uygulama kullanıcıdan iki değer alır. TryParse ile her iki değerin de tam sayıya dönüştürülebilir olup olmadığını kontrol eder. Dönüşüm başarılıysa toplamı gösterir.
Console.Write("Birinci sayıyı giriniz: ");
string giris1 = Console.ReadLine();
Console.Write("İkinci sayıyı giriniz: ");
string giris2 = Console.ReadLine();
bool ilkSayiGecerli = int.TryParse(giris1, out int sayi1);
bool ikinciSayiGecerli = int.TryParse(giris2, out int sayi2);
if (ilkSayiGecerli && ikinciSayiGecerli)
{
int toplam = sayi1 + sayi2;
Console.WriteLine("Toplam: " + toplam);
}
else
{
Console.WriteLine("Lütfen iki alana da tam sayı giriniz.");
}
Burada && operatörü, iki dönüşümün de başarılı olmasını şart koşar. Her iki giriş sayıya çevrilebilirse toplama yapılır; aksi durumda kullanıcıya uyarı verilir.
10. Convert, Parse ve TryParse Arasındaki Fark
- Convert: Uygun bir değeri başka bir veri türüne dönüştürmek için kullanılır. Geçersiz girişlerde hata oluşabilir.
- Parse: Metin biçimindeki uygun değeri ilgili türe dönüştürür. Metin geçersizse hata oluşur.
- TryParse: Dönüşümün başarılı olup olmadığını bildirir; hatalı girişleri kontrol etmek için uygundur.
Kullanıcıdan veri alınan uygulamalarda hatalı giriş olasılığı bulunduğundan TryParse tercih etmek daha güvenli bir yaklaşımdır.
11. Konunun Özeti
- Tür dönüşümü: Bir değerin veri türünü başka bir türe çevirme işlemidir.
- Console.ReadLine(): Kullanıcı girdisini string türünde alır.
- Convert.ToInt32() ve int.Parse(): Uygun metin değerlerini tam sayıya dönüştürür.
- TryParse: Dönüşümün başarılı olup olmadığını kontrol etmeyi sağlar.
- Örtük dönüşüm: Uygun durumlarda C# tarafından otomatik yapılır.
- Açık dönüşüm: Tür, kodda belirtilerek dönüştürülür; değer kaybı yaşanabilir.
Tür dönüşümleri, kullanıcıdan alınan verilerle işlem yapabilmek ve farklı türlerdeki değerleri birlikte kullanabilmek için gereklidir. Kullanıcı girdilerinde TryParse kullanmak, hatalı girişleri kontrol ederek uygulamanın daha güvenli çalışmasına yardımcı olur.
Öğrenciler için uygulama: Kullanıcıdan iki sınav notu alınız. Girişleri TryParse ile kontrol ediniz; geçerli notlar girilmişse ortalamayı hesaplayıp ekrana yazdırınız.