- Kategori
- Yazılım
Boxing ne değildir?
Sayın okurlar bu metni yakın bir zamanda yayınlanan C# 3.0 kitabımdan aldım. Tabi alırken küçük değişiklikler ve eklemeler yaptım. Ne de olsa kitap için yazılan metnin daha bir ciddiyetle kaleme alınması gerekiyor. C# ile az çok kod yazmış olanların bildiği gibi int tipindeki değişkenlere ondalık nokta içeren kesirli bir sayıyı dönüştürmeden aktarmak mümkün değildir. Bu olayı göstermek için int tipinde bir değişken tanımladım ve bu değişkene kesirli bir sayıyı aktarmaya çalıştım. int tipindeki değişkene kesirli bir sayıyı aktarmak mümkün olmadığı için bu şartlarda proje çalıştırılırsa hata meydana gelir.
private void Form1_Click(object sender, EventArgs e)
{
int i = 123.456;
}
Her ne kadar “i” adındaki değişkeni çalmakla suçlanıyor olsam bile programcıların alışkanlıklarına uyup bu değişkene “i” adını verdim. Ancak object tipindeki değişkenlere istenen tipteki bilgiler aktarılabiliniyor. object tipindeki değişkenlere istenen tipteki bilgiler aktarılabildiği için aşağıda verilen metot işletildiği zaman hata meydana gelmez.
private void Form1_Click(object sender, EventArgs e)
{
object sayi = 123.456;
sayi = "Galatasaray";
}
C# kodu içinde tanımlanan object tipindeki değişkenler int, float, double ve byte gibi değişkenlerin aksine belleğin Heap adı verilen kısmında tutulurlar. Başka bir deyişle int, float, double, char ve byte gibi değişkenler belleğin Stack adı verilen kısmında saklanırken object değişkenler belleğin Heap bölgesinde saklanmaktadır. Tanımladığınız değişkenin bellekte kaplayacağı yer miktarı önceden belli ise belleğin Stack kısmında tutulur.
int, float ve byte gibi stack’te tutulan bir değişkenin içeriğinin Heap’te tutulan object tipli bir değişkene aktarılması işlemine Boxing adı verilmektedir. Aşağıda verilen kodda Stack’te tutulan int değişkenin içeriği Heap’te tutulan object değişkene aktarılmaktadır.
int Sayi = 12345;
object Obje1;
Obje1 = Sayi; // bu işleme Boxing denilmektedir.
Tam bu noktada araya girip başka bir konudan söz etmek istiyorum. Bu amaçla aşağıda verdiğim kodu yazdım. Bu kodda bölme işlemi sonucu elde edilecek Float bilgi dönüştürülüp int tipindeki değişkene aktarılmaktadır.
private void button1_Click(object sender, EventArgs e)
{
try
{
byte Sayi_yek;
byte Sayi_du;
int Sayi_se;
Sayi_yek = Convert.ToByte(textBox1.Text);
Sayi_du = Convert.ToByte(textBox2.Text);
Sayi_se = (int) Sayi_yek/Sayi_du;
textBox3.Text = Sayi_se.ToString();
}
catch
{
MessageBox.Show("Kardeş hata meydana geldi");
textBox1.Focus();
}
}
Bu kısacık koddaki değişken adları dikkatinizi çekmiş olmalıdır. Normalde bu kodu alışkanlıklarım gereği(20 yıllık alışkanlıklar) aşağıdaki gibi yazmayı tercih ederim. Ne ki Sayi1, Sayi2 ve Sayi3 değişkenleri Türkiye’de birileri tarafından register edildiği için kullanmamaya çalışıyorum. Bazılarınız değişken adları nasıl register edilir diye sorabilirler. Haklısınız değişkenler register edilmemeli ama burası sevgili yurdum Türkiye.
private void button1_Click(object sender, EventArgs e)
{
try
{
byte Sayi1;
byte Sayi2;
int Sayi3;
Sayi1 = Convert.ToByte(textBox1.Text);
Sayi2 = Convert.ToByte(textBox2.Text);
Sayi3 = (int) Sayi1/Sayi2;
textBox3.Text = Sayi3.ToString();
}
catch
{
MessageBox.Show("Kardeş hata meydana geldi");
textBox1.Focus();
}
}
Bu kodda dikkatinizi Sayi3 = (int) Sayi1/Sayi2; satırına çekmek istiyorum. Önce byte tipindeki 2 değişken birbirine bölünmektedir. Sonra “(int)” ile bölme işlemi sonucu bulunan değer int tipindeki Sayi3 değişkenine aktarılmaktadır. Aslında bu satır Sayi3 = Sayi1/Sayi2; şeklinde yazılsa bile değişen bir şey olmaz ve dönüştürme otomatik olarak yapılır. İşin özü bu satırda Boxing işlemi yoktur. Birisi çıkar da bu satırda Boxing işlemi var derse ona “tebrikler bu işi bilmediğini tek cümle ile kanıtladınız” diyebilirsiniz. O kişi ama ben Prof’um hem Türkiye’nin en ünlü 3 Bilgisayar Mühendisliği Fakültesinin birinde öğretim üyesiyim derse? Bu durumda ona cevabınız şöyle olabilir :”Hocam bu .NET çıkalı 10 yıl 20 yıl olmadı ki, çıkalı topu topu 6 yıl oldu”. Tabii bu hocamıza http://www.charpnedir.com/, http://www.ceviz.net/, http://www.ceturk.com/, http://www.yazgelistir.com/ vs gibi C# hakkında ayrıntılı bilgi içeren çok sayıda siteden birisini ziyaret etmesinin kafi geleceğini önermeyi unutmamak gerek.
Bir başkası çıkıp ben Bilgisayar Mühendisiyim ve ayrıca Türkiye’nin bilgisayarla ilgili en eski derneğinin yönetim kurulu üyesiyim benden iyi mi bileceksiniz, bu satırda bal gibi Boxing işlemi var derse ne cevap vereceksiniz? Bence ona “pek muhterem bilgisayar mühendisi bey, siz öğrenci iken .NET henüz yoktu yani bu konuya gelme şansınız olmadı”.