C# Veri Türü ve Değişkenler

Veri türü değişkenler, tanımlandığında derleyici tarafından yeterli bellek alanı ayrılan ve değişkenin saklayacağı değerin bu bellek alanında tutulduğu değişkenlerdir. Örneğin, byte türünde bir değişken tanımlanırsa derleyici bu değişkenin değerini saklamak için bize 1 bayt (8 bit) bellek alanı ayırır. Tanımlanan bu değişkene bir değer (örneğin, 135) atandığında, bu değer ayrılan 1 baytlık bellek alanına yazılır.
Başvuru türü değişkenler tanımlandığında, değer türü değişkenlerden farklı olarak derleyici tarafından hafızada değeri saklamak için bellek alanı ayrılmaz. Bunu yerine, değeri saklayacak başka bir bellek alanının adresini tutabilecek kadar küçük bir bellek alanı ayırır. Sınıflar başvuru türü değişkenlerdir. Örneğin, kendi oluşturduğumuz bir sınıf olan Bisiklet türünde bir değişken tanımlandığında Bisiklet değişkeninin değerini tutmak için değil, Bisiklet değişkeninin değerini içeren başka bir belleğin adresini tutmak için gereken bellek ayrılır. Yani değerin kendi değil, değere başvuruda bulunan bellek adresi tutulur.

Veri Türü Değişkenleri ve Sınıfları Kopyalama

Başvuru türlerinin değer türlerinden farkını daha iyi anlatabilmek için önce iki değer türü değişkenin durumu incelenmelidir. Aşağıdaki örnekte a adında int değer türünde bir değişken tanımlanıyor ve 16 ilk değeri atanıyor. Ardından yine int türünde tanımlanan b değişkenine a değişkeninin değeri ilk değer olarak atanıyor. Bu iki satır kodun sonucu olarak a ve b değişkenleri aynı değeri (16) saklıyor olsalar da 16 değerini içeren iki bellek alanı bulunur. Bellek alanlarından biri a değişkeninin değerini, diğeri ise b değişkeninin değerini saklar. Üçüncü satırdaki a değişkeninin değerinin 1 artırılması b değişkenini etkilemez.

[csharp]int a = 16; // a değişkeni tanımlanıyor
int b = a; // b değişkeni a’daki verinin kopyasını içerir
a++; // a’yı artırmak b’nin değerini ekilemez[/csharp]

Programlama dilinde tanımlanan bütün sınıflar başvuru türüdür. Başvuru türü olan c ile d değişkenlerinin durumu incelenmelidir. Aşağıda Bisiklet türünde tanımlanmış c ve d değişkenleri aynı bellek alanına başvurmaktadır. Yani sadece bir Bisiklet nesnesi vardır. c ve d değişkenlerinin her ikisi de ona başvurmaktadır. İki örnekteki farkı daha kolay anlayabilmek için aşağıdaki Bisiklet nesnesindeki * işareti bellekteki adrese başvuruyu gösterir:

[csharp]Bisiklet c = new Bisiklet(16);
Bisiklet d = c;[/csharp]

Değer ve başvuru türleri arasındaki fark

Null Değerler

Şimdiye kadar tanımlanan değişkenlere genellikle aşağıdaki gibi bir ilk değer ataması yapıldı.

[csharp]int s = 0;
double x = 0.0;[/csharp]

Başvuru değişken türü olan sınıfların yeni bir örneği oluşturulurken new anahtar sözcüğü ile nesneye bir ilk değer verildi.

[csharp]Bisiklet bisiklet1 = new Bisiklet(18);[/csharp]

Bazı durumlarda değişkene başlangıç değeri atama sonraya bırakılabilir. Ancak bu iyi bir alışkanlık değildir. Zaten katı kuralları olan programlama dili ilk değer atanmamış bir değişkeni kullanmak istenildiğinde derleme hatası verecektir.

[csharp]Bisiklet bisiklet1 = new Bisiklet();
Bisiklet bisiklet2; // İlk değer atanmamış
if (bisiklet2 == null ) // Derleme hatası verir
{
bisiklet2 = bisiklet1;
}[/csharp]

Yukarıdaki if ifadesi ile bisiklet2 değişkenine bir başlangıç değeri atanıp atanmadığı kontrol edilmek istenmiştir. Fakat bu değişken eğer ilk değer atanmadı ise hangi değeri taşımaktadır? Bu sorunun cevabı null (boş anlamına gelir) adı verilen özel bir değerdir.
Programlama dilinde başvuru türü değişkenlere null değeri atanabilir. Bir değişkene null değeri atandığında, bu o değişkenin bellekte hiçbir nesneye başvurmadığı anlamına gelir.

[csharp]Bisiklet bisiklet1 = new Bisiklet();
Bisiklet bisiklet2 = null;
if (bisiklet2 == null)
{
bisiklet2 = bisiklet1;
}[/csharp]

Boş Olabilen Türler

Null değeri, başvuru türlerine başlangıç değeri vermek için kullanışlıdır. Fakat null değerinin kendisi bir başvurudur ve bir değer türüne atanamaz. Bu nedenle aşağıdaki ifade programlama dilinde geçerli bir ifade değildir:

[csharp]int a = null; // geçerli değil[/csharp]

Bununla birlikte, C# bir değişkeni boş olabilen (nullable) değer türü olarak bildirmek için kullanılabilecek bir değiştirici tanımlar. Boş olabilen değer türü, orijinal değer türü ile benzer şekilde davranır fakat null değeri atanabilir. Aşağıdaki gibi değer türünün boş olabileceğini göstermek için soru işareti (?) operatörü kullanılır:

[csharp]int? b = null; // geçerli[/csharp]

Başvuru türü test edilen yöntemle boş olabilen değişkenin null değer içerip içermediği bulunabilir:

[csharp]if (b == null)[/csharp]

Uygun veri türü ifadesi doğrudan boş olabilen değişkene atanabilir. Aşağıdaki örnekler geçerli ifadelerdir:

[csharp]int? b = null;
int a = 15;
b = 16; // Bir sabiti boş olabilen türe kopyalar
b = a; // Değer türü değişkenini boş olabilen türe kopyalar[/csharp]

Bunun tersi ise geçerli değildir. Yani boş olabilen bir değer, sıradan değer türü değişkenine atanamaz. Bu nedenle, bir önceki örnekteki a ve b değişkenlerine göre aşağıdaki ifade geçerli değildir:

[csharp]a = b; // Geçerli değil[/csharp]

Boş Olabilen Türlerin Özellikleri

Boş olabilen türlerin sahip olduğu HasValue (değere sahip mi?) özelliği boş olabilen bir türün bir değere mi sahip olduğunu yoksa null mu olduğunu kontrol edebilmeyi sağlar. Aşağıdaki gibi value (değer) özelliğini okuyarak bir değer içeren, boş olabilen türün değeri elde edilebilir:

[csharp]int? b = null;
.
.
if (!b.HasValue)
{
b = 15;
}
else
{
Console.WriteLine(b.Value);
}[/csharp]

Yukarıdaki kod parçası, boş olabilen b değişkenin HasValue özelliği false (! işlecine dikkat ediniz) ise 15 değeri atar. Aksi takdirde değişkenin değerini görüntüler.

 

Kaynak: Megep Modülleri

Ahmet Şenlik

Kocaeli Üniversitesinde Bilgisayar Programcılığı okudum DGS ile 2016 yılında Sakarya Üniversitesi Bilgisayar mühendisliğini kazandım. Yazılımla uğraşmayı çok seviyorum bu alanda kendimi daha da geliştirmeyi düşünüyorum. Eğer siz de seviyorsanız bu işi devam edin başlamadıysanız başlayın başaracağınıza inanın. :)

You may also like...

Bir yanıt yazın

E-posta adresiniz yayınlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir

Bu site, istenmeyenleri azaltmak için Akismet kullanıyor. Yorum verilerinizin nasıl işlendiği hakkında daha fazla bilgi edinin.