Tür Dönüşümü
Programlama Dilleri 3
1
Farklı türden değişkenlerin aynı ifade içinde işlem
görmeleri için tür dönüşümü kullanılır. Tür dönüşümlerini
aşağıdaki şekilde gruplara ayırmak mümkündür:
Tür Dönüşümleri
Bilinçli(explicit) Tür Bilinçli(explicit)
Tür
Dönüşümleri
Bilinçsiz (implicit) Tür Bilinçsiz
(implicit) Tür
Dönüşümleri
Programlama Dilleri 3
2
Bilinçsiz (Impicit) Tür Dönüşümleri
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ü denir. Örn:
using System;
using
System;
public class Tur_donusumu1
{
static void Main()
{ int x=5;
float a;
a=x;
Console.WriteLine(a);
}
}
Programlama Dilleri 3
3
Bilinçsiz
ç yyapılan
p
tür dönüşümlerinde
ş
bir nesnenin türü
asla kalıcı olarak değiştirilmez.
Bilinçsiz yapılan
gerçekleştirilebilir.
tür
dönüşümleri
2
şekilde
a. Küçük Türün Büyük Türe Dönüştürülmesi
b. Büyük Türün Küçük Türe Dönüştürülmesi
Programlama Dilleri 3
4
Bilinçsiz (Impicit) Tür Dönüşümleri
• Küçük
ç Türün Büyük
y Türe Dönüşümü
ş
– Küçük türler büyük türlere dönüştürülürken fazla
olan bitler yani büyük türden dolayı eklenen bitler
sıfırla beslenirler. Küçük türün yüksek anlamlı
bitlerinin sıfırla beslenmesi değişkendeki değeri
d ği i
değiştirmediği
diği için
i i tür
ü dönüşümünde
dö ü ü ü d herhangi
h h i bir
bi
veri kaybı olmaz.
Programlama Dilleri 3
5
using System;
p
public class Tur_donusumu1
_
{
static void Main()
{ byte a=20;
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);
}
}
Programlama Dilleri 3
6
float sayı formatı
31 30
s
23
22
e
0
f
double sayı formatı
63 62
s
52
51
e
0
f
s : işaret biti
e : üsleri temsil eden bitler
f : noktalı (anlamlı) kısım
Programlama Dilleri 3
7
Byte türünden nesneler toplandığında sonuç olarak int
tü ü d nesneler
türünden
l üretilirler.
ü tili l Örn:
Ö
using System;
using
System;
public class Tur_donusumu1
{
static void Main()
{ byte a=15;
byte b=25;
byte c;
byte c;
c=a+b;
Console.WriteLine(c);
}
}
Programlama Dilleri 3
8
Tür
Bilinçsiz Dönüşüme İzin verilen Türler
sbyte
byte, ushort, uint, ulong, veya char
byte
sbyte veya char
short
sbyte, byte, ushort, uint, ulong, veya char
ushort
int
sbyte, byte, short, veya char
sbyte, byte, short, ushort, uint, ulong, veya char
uint
sbyte, byte, short, ushort, int, veya char
long
sbyte, byte, short, ushort, int, uint, ulong, veya char
ulong
sbyte, byte, short, ushort, int, uint, long, veya char
char
sbyte, byte, veya short
float
sbyte, byte, short, ushort, int, uint, long, ulong, char, veya decimal
double
sbyte, byte, short, ushort, int, uint, long, ulong, char, float, veya decimal
decimal
sbyte, byte, short, ushort, int, uint, long, ulong, char, float, veya double
Programlama Dilleri 3
9
Aşağıdaki kod parçasını bilgisayarınızda deneyiniz:
using System;
public class Tur_donusumu1
{
static void Main()
static void Main()
{ short b1=100;
char c1=b1;
bool b2=true;
int i1=b2;
double d1=10.2;
int i2=d1;
int i2=d1;
decimal m1=20.6M;
double d2=m1;
byte bt1=65;
char c2=bt1;
float f1=34.78F;
decimal d3=f1;
}
}
Programlama Dilleri 3
10
Bazı türler arasında tür dönüşümü yapmam mümkün
değildir. Bunlar :
a. Bool, decimal ve double türünden herhangi bir türe
b Herhangi bir türden char türüne
b.
h i bi
d
h
c. Float ve decimal türünden herhangi bir türe (float ş
ç)
türünden double türüne dönüşüm hariç)
Programlama Dilleri 3
11
Bilinçsiz (Impicit) Tür Dönüşümleri
• Büyük
y Türün Küçük
ç Türe Dönüşümü
ş
– Büyük
türlerin
küçük
türlere
otomatik
dönüştürülmesi C#’da yasaklanmıştır. Eğer bu tür
bir dönüştürme(bilinçsiz olarak) mümkün olsaydı
birtakım veri kayıpları yaşanacaktır.
Programlama Dilleri 3
12
Bilinçli (Explicit) Tür Dönüşümleri
Bilinçli (explicit) tür dönüşümü genellikle
derleyicinin izin vermediği dönüşümlerde
kullanılır.
Bu tür dönüşümlerde de yine küçük türler büyük
türe ya da tersi dönüşümler yapılabilir.
Küçük
ç
türlerin büyük
y
türlere ççevrilmesi aynı
y
bilinçsiz dönüşümde olduğu gibidir.
Programlama Dilleri 3
13
Tür Dönüştürme Operatörü
Bilinçli tür dönüşümü yapılırken “tür
tür
dönüştürme operatörleri” kullanılır. Tür
dönüştürme operatörü parantez içinde
değişken ya da sabitten önce yazılır.
– (dönüştürülecek tür)degişken_yada_sabit;
Programlama Dilleri 3
14
using System;
public class Tur_donusumu1
{
static void Main()
i
id M i ()
{ byte a=100;
int b=(int)a;
int b=(int)a;
Console.WriteLine(b);
}
}
Bu işlem
B
il
tü dönüşüm
tür
dö ü ü operatörü
tö ü kullanmadan
k ll
d da
d
yapılabilirdi. Buradaki amaç daha çok okunabilirliği
arttırmaktır.
arttırmaktır
Programlama Dilleri 3
15
Bilinçsiz yapılan tür dönüşümlerinde büyük türler,
küçük türlere dönüştürülemiyordu. Eğer tür
dönüştürme operatörü kullanılırsa bu işlem
mümkün olur.
olur Örn: Aşağıdaki programı deneyin:
using System;
g y
;
public class Tur_donusumu1
{
static void Main()
{ int a=400;
byte b=(byte)a;
C
Console.WriteLine(b);
l W it Li (b)
}
}
Programlama Dilleri 3
16
Programı çalıştırdığımızda ekrana 144 yazdırdı.
Neden?
int a=400 : 00000000 00000000 00000001 10010000
(byte)i : 10010000
144 Dec.
Programlama Dilleri 3
17
using System;
class TurDonusumu9
{
static void Main()
{
int i = 256;
byte b = (byte)i;
Console.WriteLine(b);
double d = 123456.7890123456;
float f = (float)d;
int i3 = (int)d;
Console.WriteLine(f);
Console.WriteLine(i3);
decimal m = 123456789.123456789M;
double d2 = (double)m;
C
Console.WriteLine(d2);
l W it Li (d2)
int i2 = 65600;
(
)
short s = (short)i2;
Console.WriteLine(s);
}
}
Programlama Dilleri 3
18
Checked ve Unchecked
Büyük veri türleri küçük türlere çevrilirken veri
kayıpları
meydana
gelebiliyordu.
Bazı
durumlarda bu veri kayıpları
yp
olmuyorsa
y
ççevrim
işlemi yapılması aksi halde hata oluşması
istenebilir.
Bu durumda “checked” anahtar sözcüğü
kullanılabilir. Bu sözcük veri kaybı oluşması
durumunda derleyicinin hata vermesini sağlar.
Programlama Dilleri 3
19
Aşağıdaki kod parçasını bilgisayarınızda deneyiniz:
using System;
public class Tur_donusumu1
{
static void Main()
{
int i=256;
byte b;
checked
{ b=(byte)i;
}
Console.WriteLine(b);
}
}
Checked anahtar sözcüğü ile çalışma zamanında
oluşabilecek veri kayıplarının olabileceği durumlarda
hata vermesini sağlayabiliriz.
Programlama Dilleri 3
20
using System;
public class Tur_donusumu1
{
static void Main()
{
int i=256;
checked
{ byte b=(byte)i;
}
Console.WriteLine(b);
}
}
Not: checked bir blok oluşturduğu için içinde
yapılan değişken tanımlamaları dış bloklarda
kullanılamaz.
kullanılamaz
Programlama Dilleri 3
21
Normal şartlarda yapılan
işlemler
“ h k d”’di
“unchecked”’dir.
Bö l
Böyle
bi
bir
if d i
ifadenin
konmasının nedeni uzun “checked”
bl kl
blokları
i
içersinde
i d bazen
b
“ h k d”
“unchecked”
blokların oluşturulması istenebilir. Bu
d
durumlarda
l d çokk fazla
f l blok
bl k oluşturmamak
l
k
için “unchecked” ifadesi kullanılabilir.
Programlama Dilleri 3
22
using System;
class TurDonusumu11
{
static void Main()
{
int i1 = 255;
int i2 = 500;
byte b, c;
checked
{
b = (byte)i1;
Console WriteLine(b);
Console.WriteLine(b);
unchecked
{
c = (byte)i2;
}
Console.WriteLine(c);
}
}
}
Programlama Dilleri 3
23
Referans ve Değer Türleri
Arasındaki Dönüşüm
Programlama Dilleri 3
24
Object Türü ve ToString() Metodu
Temel veri türleri de dahil olmak üzere
bü ü verii tipleri
bütün
i l i object
bj
d il
denilen
bi
bir
referans türünden türemiştir. Türeme,
k l
kalıtım
yolu
l ile
il olduğu
ld ğ için
i i var olan
l
özellikler her zaman korunur.
Sınıf kütüphanesinin
p
ve temel veri
türlerinin atası olan object nesnesinin
özellikleri ve işş yyapan
p
metotları bütün
türlerde mevcuttur.
Programlama Dilleri 3
25
ToString() Metodu
.ToString()
g() metodu bütün temel türlerde yya da
referans türlerde kullanılabilir. Amacı ise string’e
dönüşüm işlemdi yapmaktır.
– 56.ToString();
– 12.34F.ToString();
12 34F ToString();
Yukarıdaki örnekler verilen sabit ifadelerin
string’e dönüştürülmesi için kullanılmıştır.
Programlama Dilleri 3
26
Aşağıdaki kod parçasını bilgisayarınızda deneyiniz:
using System;
class TurDonusumu12
{
static void Main()
{
int x = 10;
int y = 20;
string
t i
a = x.ToString();
T St i ()
string b = y.ToString();
Console.WriteLine(x
Console
WriteLine(x + y);
Console.WriteLine(a + b);
}
}
Programlama Dilleri 3
27
Boxing İşlemi
Bir çok modern dilde değer tipleri ile Bir
çok modern dilde değer tipleri ile
referans tipler arasında dönüşüm söz konusu değil iken C# dilinde bu
konusu değil iken C# dilinde bu mümkündür.
“Boxing” (kutulama) olarak ifade edilen yöntem değer tipindeki verileri “object” nesnesine çevirir. Programlama Dilleri 3
28
Object nesneler de referans tip oldukları için “heap”
heap
bellek alanında tutulurlar. Bu yüzden object nesnesine
çevrilen değer tipleri “stack” alanından “heap” alanına
kopyalanır “stack”
kopyalanır.
stack alanında object türündeki değişken,
değişken
“heap” alanını gösterecek şekilde ayarlanır. Bu işleme
“boxing” adı verilir.
using System;
public class Tur_donusumu1
{
static void Main()
{
int a=100;
object b=a;
b a;
STACK Alanı
a
HEAP Alanı
100
b
int
100
Boxing
işleminin
sonucu
}
}
Programlama Dilleri 3
29
Boxing işlemi bilinçsiz olarak yapılabileceği gibi tür
dönüştürme operatörleri kullanılarak bilinçli olarak da
yapılabilir. Örn:
using System;
public class Tur_donusumu1
p
_
{
static void Main()
{
int a=100;
object b=a;
using System;
public class Tur_donusumu1
p
_
{
static void Main()
{
int a=100;
object b=(object) a;
}
}
}
}
Programlama Dilleri 3
30
Unboxing
Heap alanındaki nesnelerin değerlerinin bit olarak stack
bölgesine kopyalanması işlemine “unboxing” adı verilir.
Bu işlem sonucunda referans türler değer türüne
dönüştürülmüş olur.
Unboxing işlerminin çalışma zamanında hata vermemesi
için gerekli iki önemli koşul vardır:
– Unboxing uygulanacak nesnenin daha önceden boxing işlemiyle
dönüştürülmüş olması
– Boxing’e tabi tutulmuş bu nesnenin unboxing ile doğru türe
dönüştürülmesidir.
ş
Unboxing işlemi bilinçsiz bir biçimde yapılmaz, mutlaka
tür dönüşüm operatörü kullanılmalıdır.
Programlama Dilleri 3
31
Aşağıdaki kod parçasını bilgisayarınızda deneyiniz:
using System;
class TurDonusumu13
{
static void Main()
{
int i = 10;
object o = i;
int j = (int)o;
Console.WriteLine(i);
Console.WriteLine(j);
}
}
Programlama Dilleri 3
32
Aşağıdaki kod parçasını bilgisayarınızda deneyiniz:
using System;
class TurDonusumu14
TurDonusumu14
{
static void Main()
{
int i = 10;
object o = i;
long l = (long)o;
Console.WriteLine(i);
Console
WriteLine(i);
Console.WriteLine(l);
}
}
Programlama Dilleri 3
33
System.Convert Sınıfı ile
Tü Dö
Tür
Dönüşümü
ü ü ü
.NET sınıf kütüphanesinde yer alan
ğ
ve temel
“Convert” sınıfı stringg değerleri
veri türlerini birbirine çevirmek için
ç ayrı
y bir
kullanılır. Her bir veri türü için
çevrim fonksiyonuna sahiptir.
Programlama Dilleri 3
34
Convert ToBoolean( )
Convert.ToBoolean(
Convert ToInt64( )
Convert.ToInt64(
Convert.ToByte( )
Convert.ToUInt64( )
Convert.ToSByte(
Co
e t. oS yte( )
Convert.ToSingle(
Co
e t. oS g e( )
Convert.ToInt16( )
Convert.ToDouble( )
Convert.ToUInt16( )
Convert.ToDecimal( )
Convert.ToInt32( )
Convert.ToChar( )
Convert.ToUInt32( )
Programlama Dilleri 3
35
using System;
class TurDonusumu15
TurDonusumu15
{
static void Main()
{
string s1,
s1 s2;
int i1, i2, t;
Console.Write("1.Sayıyı Girin:");
s1 = Console.ReadLine();
Console.Write("2.Sayıyı Girin:");
s2 = Console.ReadLine();
i1 = Convert.ToInt32(s1);
i2 = Convert.ToInt32(s2);
t = i1 + i2;
Console.WriteLine("Toplam
(
p
= " + t.ToString());
g())
}
}
Programlama Dilleri 3
36
Dönüşüm işleminin sonucunda anlamlı bir sonuç
elde edilemeyeceği durumlarda hata meydana
gelir.
using System;
class TurDonusumu16
{
static void Main()
{
char
h
a = '
'a';
'
bool b = Convert.ToBoolean(a);
}
}
Programlama Dilleri 3
37
Download

Hafta3