Tip Dönüşümü Örneği
Tip Dönüşümü Örneği
Modern programlamada birçok kez değişkenlerde tür dönüşümüne ihtiyaç duyulur. Örneğin string türündeki sayılarla ("5" veya "2" gibi) matematiksel işlem yapmamız gerektiğinde tür dönüşümü yapmamız gerekir. Aslında bahsettiğimiz tam olarak tür dönüşümü değildir, sadece bir değişkenin değişik türdeki hâlinin başka bir değişkene atanmasıdır. Tür dönüşümleri bilinçli tür dönüşümü ve bilinçsiz tür dönüşümü olmak üzere ikiye ayrılır.
Bilinçsiz tür dönüşümü
sabit ya da değişken ve sabitlerden oluşan matematiksel ifade daha yüksek kapasiteli bir değişkene atanabilir. Buna bilinçsiz tür dönüşümü denir, bunun için herhangi bir özel kod gerekmez.
using System;
class TurDonusumu
{
static void Main()
{
byte a=5;
short b=10;
sbyte c=30;
int d=a+b+c;
string e="deneme";
char f='k';
object g=e+f+d;
long h=d;
float i=h;
double j=i;
double k=12.5f;
Console.WriteLine(j+k);
}
}
Bilinçsiz tür dönüşümüyle ilgili ilginç bir durum söz konusudur. char türünü kendisinden daha kapasiteli bir sayısal türe bilinçsiz olarak dönüştürebiliriz. Bu durumda ilgili karakterin Unicode karşılığı ilgili sayısal değişkene atanacaktır.
using System;
class TurDonusumu
{
static void Main()
{
char a='h';
int b=a;
Console.WriteLine(b);
}
}
Bilinçsiz tür dönüşümüyle ilgili diğer ilginç bir nokta ise byte, sbyte
, short
ve ushort
türündeki değişkenlerle yapılan matematiksel işlemlerdir. Bu tür durumda oluşan matematiksel ifade intleşir. Yani aşağıdaki durumda programımız hata verir:
using System; class TurDonusumu { static void Main() { byte a=5, b=10; short d=2, e=9; byte f=a+b; short g=d+e; Console.WriteLine(f+g); } }
Bilinçli tür dönüşümü
Bilinçli tür dönüşümü 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 sağlanabilse de aslında bu gereksizdir, çünkü aynı şeyi bilinçsiz tür dönüşümüyle de yapabilirdik
using System; class TurDonusumu { static void Main() { int a=5; byte b=(byte)a; Console.WriteLine(b); } }
Eğer değişken adı kısmında tek bir değişken yoksa, bir ifade varsa parantez içine alınması gerekir.
Bu şekilde tür dönüşümü değişkenlere uygulanabildiği gibi sabitlere de uygulanabilir:
using System; class TurDonusumu { static void Main() { byte b=(byte)12.5f; Console.WriteLine(b); } }
Reel türler tam sayı türlere dönüşürken ondalık kısım atılır.
Bilinçsiz tür dönüşümüyle yalnızca küçük türler büyük türlere dönüşebiliyordu, yani veri kaybı olması imkansızdı. Halbuki bilinçli tür dönüşümünde veri kaybı gerçekleşebilir, eğer dönüşümünü yaptığımız değişkenin tuttuğu değer dönüştürülecek türün kapasitesinden büyükse veri kaybı gerçekleşir. Bu gibi durumlar için C#'ın checked
ve unchecked
adlı iki anahtar sözcüğü vardır.
string türüyle ilgili dönüşümler
x.ToString()
Bu metot x değişken ya da sabitini stringe çevirip tutar
using System; class TurDonusumu { static void Main() { int a=6; string b=a.ToString(); Console.WriteLine(b); } }
System.Convert sınıfı ile tür dönüşümü
System
isim alanının altındaki Convert
sınıfı içinde tür dönüşümü yapabileceğimiz birçok metot bulunur. Bu metotlarla hemen hemen her türü her türe dönüştürebiliriz. Ancak bunun için değişken türlerinin CTS karşılıklarını bilmeliyiz. Değişken türleri ve CTS karşılıkları listelenmiştir.
bool Boolean
byte Byte
sbyte Sbyte
short Int16
ushort UInt16
int Int32
uint UInt32
long Int64
ulong UInt64
float Single
double Double
decimal Decimal
char Char
metotları şunlardır
- Convert.ToByte(x)
- Convert.ToSbyte(x)
- Convert.ToInt16(x)
- Convert.ToUInt16(x)
- Convert.ToInt32(x)
- Convert.ToUInt32(x)
- Convert.ToInt64(x)
- Convert.ToUInt64(x)
- Convert.ToSingle(x)
- Convert.ToDouble(x)
- Convert.ToDecimal(x)
- Convert.ToChar(x)
Bu metotlar x'i söz konusu türe dönüştürüp o türde tutarlar. x bir değişken, sabit ya da ifade olabilir. x, ifade olduğu zaman önce bu ifade mevcut türe göre işlenir, sonra tür dönüşümü gerçekleşir
using System; class TurDonusumu { static void Main() { string s1, s2; int sayi1, sayi2; int Toplam; Console.Write("Birinci sayıyı girin: "); s1=Console.ReadLine(); Console.Write("İkinci sayıyı girin: "); s2=Console.ReadLine(); sayi1=Convert.ToInt32(s1); sayi2=Convert.ToInt32(s2); Toplam=sayi1+sayi2; Console.Write("Toplam= "+Toplam); } }