C# Primitive Data Types (Temel Veri Türleri)

Merhabalar,

C# programlama serisi yazıma kaldığım yerden devam ediyorum. Sağlık sorunları nedeniyle ara vermek zorunda kaldım. Bademciklerim yani Tonsillerle başım beladaydı ve artık veda etmek zorundaydım. Bu operasyonun en güzel yanı sürekli dondurma yemek oldu 🙂 Şimdi sağlık durumum iyi ve serime devam edebilecek enerjiye geri ulaştım.

Bir önceki yazımda C# ve .Net’e giriş yapmıştık. Kısaca nelerden bahsetmiştik anımsayalım;

  • .Net Bileşenleri (CLR, IL ve JIT derleyiciler)
  • CTS ve CLS kavramları
  • Assembly Kavramı (Application Domain)
  • İsim alanları ve .Net Sınıf Kütüphanesi

Bu ve öğreneceğimiz bilgiler bize programlama yapmadan önce bilgi sahibi olmamızı ve programlama mantığının parçalarını birleştirmemiz ve parçalar arasında ilişki kurmamıza olanak sağlayacak.

Bir önceki serimde motivasyon cümlesi yazmıştım. Bugün bize motivasyon sağlayacak cümle:

Hayatına her gün yeni bir renk kat

Anonymous

Temel Veri Türleri

C# programcısı olarak başlangıçtan profesyonelliğe doğru gidebilmek için programlama dillerinin en temel yapısı olan veri türlerinden bahsetmeden olmaz.

C# Dilindeki Temel Veri Türleri

C# dilinde temel olarak veri tipleri ikiye ayrılır: Bunlar, önceden tanımlanmış veri türleri ve kullanıcı tarafından tanımlanmış veri türleridir. Önceden tanımlanmış veri türleride kendi arasında referans tipi (reference type) ve değer tipi (value type) olmak üzere ikiye ayrılır. Bir programcı kesinlikle bu iki veri türü arasındaki temel farkları bilmek zorundadır.

Değişkenler

Değişkenler, içinde farklı türlerde veri saklayabildiğimiz bellek gözeneklerinin programlamadaki karşılığıdır. Hemen bütün programlama dillerinde değişkenler, kullanılmaya başlamadan önce tanımlanır. Derleyici tanımlama satırını görünce bellekte nesnenin özelliğine uygun bir miktarda yer tahsis eder. Verilerin bellekte tutulması altı bölgeden biri ile olmaktadır. Bu bölgeler:

Stack Bölgesi

Genel anlamda stack bölgesi dediğimizde Ram’i anlarız. Programımızın içinde basit bir tamsayı türünden nesnenin tipik olarak çalışma zamanında yüklendiği yer Ram’in stack dediğimiz bölgesidir. Stack bölgelerine Mikroişlemcilerde bulunan Stack Pointer ile doğrudan erişilebilir. Stack Pointer o anda bellekte çalışan bölgenin adresini tutan yapıdır. Stack Pointer, bellekteki alan tahsisatına (allocation) göre bir azaltılır yada bir artırılır. Bu yüzden stack bölgesinde tutulacak verilerin çalışma zamanı öncesi ne kadar alan kapladığının bilinmesi gerekir. Aksi durumda Stack Pointer işlevi ile çelişkili bir durum olurdu. .Net platformunun alt yapısını oluşturan JIT derleyicilerin de programı yüklediğinde Stack Pointer’a doğru konumlandırmak için tahsisatını yapacağı verinin tam boyutunu bilmesi gerekir.

Bütün veriler eğer stack bölgesinde tahsisat (allocation) yapmış olsaydı, programlarımızın esnekliği azalırdı; zira C#’ta bazı nesneler referans yolu ile belirtildikleri için verinin kendisi stack’ta bulunmayabilir.

Heap Bölgesi

Stack bölgesinde olduğu gibi heap alanları da RAM’de bulunan hafıza alanlarıdır. Bütün C# nesneleri bu bölgede oluşturulur. Stack’ten farklı olarak heap bölgesinde tahsisat yapılacak nesnenin derleyici tarafından bilinmesi zorunlu değildir. Bu yüzden heap bölgesini kullanmak programımıza esneklik katmaktadır. C#’ta heap bölgesinde bir nesneye alan tahsisatı yapmak için new anahtar kelimesi kullanılır. New anahtar kelimesi ile tahsisatı yapılmış veriler çalışma zamanında dinamik olarak yaratılırlar; yani derleme zamanında veriler için herhangi bir tahsisat yapılmaz. Heap alanının bize sunduğu esneklik avantajının yarı sıra bazı dezavantajları da vardır. Bunlardan en önemlisi işlemlerin hızının stack mekanizmasına göre daha yavaş olmasıdır.

Stack ve Heap Genel Özet

  • Stack ve Heap RAM’in mantıksal bölümleridir.
  • Stack LIFO mantığı ile çalışır, son giren ilk çıkan.
  • Stack’te değer tipleri, pointer ve adresler saklanırken, Heap’de ise referans değeri saklanır.
  • Stack daha hızlıdır, veriler ard arda saklanır.
  • Heap ortak olarak kullanılır, uygulama başlatıldığında başlar.

Register Bölgesi

Stack ve heap tahsisat (allocation) mekanizmalarına göre daha hızlıdır; sebebi ise Register bölgesinin ikinci bir bellekte olmamasıdır. Register’lar Mikroişlemcilerin içinde bulunan sınırlı sayıdaki yapılardır. Register sayıları sınırlı olduğu için derleyiciler çok sık işlem yaptıkları verileri hız kazanmak için Register’da tutarlar. Bizim mikroişlemci Register’larına doğrudan erişme hakkımız yoktur. Kısacası Register’larla ilgili işlemler tamamen derleyicinin inisiyatifindedir.

Static Bölge

Bellekte herhangi bir sabit bölgeyi temsil eder. Static alanlarda tutulan veriler programın bütün çalışma süresince saklanır. C# ile bir nesneye static özelliği vermek için static anahtar sözcüğü kullanılır.

Sabit Bölge

Sabit (constant) değerler genellikle program kodlarının içine gömülü şekildedir. Bu değerlerin değişmesi mümkün değildir. Sadece okuma amaçlı oldukları için hızlılık açısından bazı durumlarda ROM (Read Only Memory)’da tutulurlar.

RAM Olmayan Bölge

Bellek bölgesini temsil etmeyen disk alanlarını temsil eder. Bazı veri türlerinin kalıcı olması istenir; bu durumda yukarıda saydığımız herhangi bir bölgede verilerin bir kısmı program sonlandığında disklere kaydedilir. Kısacası program çalışmadığında verinin bulunmasını istiyorsak bu tür disk sistemleri kullanmalıyız. (Klasik floppy ve harddisk’te olduğu gibi)

Sabit İfadeleri

Bir program boyunca değerinin değişmeyeceğini düşündüğümüz verileri sabit veri olarak tanımlarız. Sabit verileri tanımlamak için tanımlama satırında const anahtar sözcüğünü kullanırız. Sabit ifadeleriyle ilgili bilmemiz gereken 3 önemli kural vardır. Bunları:

  • Sabitler tanımlandıklarında değerleri atanmalıdır. İlk değer verilmeyen değişkenler const yani sabit olamazlar.
  • Sabit ifadelere ancak sabit ifadelerle ilk değer atanabilir.
  • Sabit ifadeleri içsel tasarım olarak zaten statik oldukları için, ayrıca statik olarak belirtmek hatalıdır ve kullanılamaz.

Değer (Value) ve Referans (Reference) Tipler

C# dilinde önceden tanımlanmış (C# dilinde var olan tipler) veri tipleri, değer tipleri ve referans tipleri olmak üzere ikiye ayrılır. Programcı bu iki veri tipi arasındaki farkı bilmesi gerekir. Daha önceden dediğimiz gibi değişkenler bellekte tutulan verilerdir. Aslında bir değişkeni kullanırken o değişkenin bellekte tutulan adresine ulaşıyoruz.

  • Değer tipleri değişkenin değerini direk bellek bölgesinden alır.
  • Referans tipler ise başka bir nesneyi referans olarak kullanırlar. Yani referans tipleri aslında bir çeşit bellek bölgesi olan heap alanında yaratılan veri türlerinin adreslerini saklarlar.
  • Değer tipleri yaratıldıklarında stack dediğimiz bellek bölgesinde oluşturulurlar.
  • Referans tipler kullanımı biraz daha sınırlı olan heap dediğimiz bellek bölgesinde saklanırlar.

İki değer (value) tipi nesnesini birbirine eşitlerken değişkenlerde saklanan değerler kopyalanarak eşitlenir ve bu durumda iki yeni bağımsız nesne elde etmiş oluruz yani birinin değerini değiştirmek diğerinin değerini etkilemez, ancak iki referans tipi (reference type) birbirlerine eşitlediğimiz de bu nesnelerde tutulan veriler kopyalanamaz , işlem yapılan nesnelerin heap bölgesindeki adresleridir, yani iki nesne aslında heap bölgesinde aynı adresi gösterecekleri için birinde yapılan değişiklik diğerini de etkileyecektir. Referans tipleri tanımlarken herhangi bir adresi göstermediğini belirtmek için null değer atanır.

CTS (Common Type System) Tipleri

.Net bir yazılım geliştirme platformudur. Aslında bütün veri tipleri CTS dediğimiz bir sistem ile tanınırlar. Yani C# dilindeki veri türleri aslında CTS’deki veri türler için birer ara-yüzdür. C# dilinde tanımladığımız bütün basit veri tipleri aslında CTS’de bulunan birer yapı nesnesidir. C# dilindeki önceden tanımlanmış temel veri tipleri on beş tanedir. Bunlardan on üçü değer tipi ikisi de referans tipidir.

CTS sayesinde diller arasında uyumluluk sağlanır ve tek bir platformdan çoklu dil desteği vermek mümkün olur.

CTS Veri Tipleri Şeması

Değer Tipleri

  • Değer tiplerinde bir nesnenin değeri her zaman direk saklanır.
  • Değer tiplerinin tamamı Object denilen bir nesneden türemiştir.
  • Değer tipleri genel olarak yapı (struct) ve enum sabitleri olarak iki gruba ayrılır.
  • Temel veri türleri aslında birer yapı nesnesidir.
byte Veri TürüByte bilgisayarda 8 bitlik bir bilgiyi saklamak için kullanılır. Byte veri türü işaretsiz(unsigned) bir veri türüdür, yani sadece pozitif sayıları tutar. 0 ile 255 arasında değerler alır.
sbyte Veri Türüsbyte türüde byte veri türü gibi 8 bitlik bir veri türüdür. Ancak sbyte negatif sayılarıda içermektedir. Yani sbyte veri türü işaretli(signed) bir veri türüdür. -128 ile 127 arasında değerler alır.
short Veri Türüshort türü 16 bitlik (2 byte) işaretli tamsayı türüdür. -32,768 ile 32,767 arasında değerler alır.
ushort Veri Türüushort veri türü short türü gibi 16 bitlik (2 byte) ancak işaretsiz tamsayı veri türüdür. 0 ile 65,353 arasında değerler alır.
int Veri TürüEn çok kullanılan veri türlerinden biridir. int türü 32 bitlik işaretli tamsayı türüdür. -2,147,483,648 ile 2,147,483,647 arasında değerler alır.
uint Veri Türü32 bitlik işaretsiz tamsayı veri türüdür. 0 ile 4,294,967,295 arasında değerler alır.
long Veri Türü64 bitlik (8 byte) işaretli tamsayı veri türüdür. -9,223,372,036,854,775,808 ile 9,223,372,036,854,775,807 arasında değerler alır.
ulong Veri Türü64 bitlik (8 byte) işaretsiz tamsayı veri türüdür. 0 ile 18,446,744,073,709,551,615 arasında değerler alır.
float Veri Türü32 bitlik (4 byte) gerçek sayı veri türüdür. +-1.5*10^-45 ile +-3.4*10^38 arasında değerler alır. F veya f son eki alırlar. son eki almayan sabitler double türüymüş gibi işlem görecektir.
double Veri Türü64 bitlik (8 byte) gerçek sayı veri türüdür. +-5.0*10^-324 ile +-1.7*10^308 arasında değerler alır.
decimal Veri Türü128 bitlik (16 byte) gerçek sayı veri türüdür. 1.0*10^-28 ile 7.9*10^28 arasında değerler alır. M veya m son eki alırlar.Son eki almayan sabitler double türüymüş gibi işlem görecektir.
bool Veri Türütrue (doğru) ya da false (yanlış) değerleri saklamak için kullanılan veri türüdür. True veya False değerleri atayabildiği gibi karşılaştırma operatörlerinin oluşturduğu ifadelere de atanabilir.
char Veri Türüchar veri türü 16 bit uzunluğunda evrensel bir karakter kod olan Unicode standartlarındaki karakterleri temsil etmek için kullanılır. Her bir karakterin bir Unicode değeri vardır.

Sabit Ayraçları

C# 7.0 versiyonu ile beraber sayı tipindeki değişkenleri daha okunaklı hale getirmek açısından “_” karakterini ayraç olarak kullanabilmekteyiz.

Referans Tipleri

  • C# dilinde önceden tanımlanmış iki tane temel referans tipi vardır; bunlar string ve object türüdür.
  • C# dilinde bütün nesneler birer Object’tir.
  • Object türü özelleştirilerek farklı amaçlar için kullanılır.
  • Object türü ile eşleştirme kavramı, boxing olarak adlandırılır.
string Veri Türüstring veri türü Unicode karakterlerden oluşan bir dizi gibi algılanmalıdır. String türünün CTS’deki karşılığı System.String’dir.
object Veri Türüobject veri türü C#’ta bütün veri türünün gizli olarak türediği veri türüdür. Her nesne bir object olduğu için bütün değerler ve nesneler object türünden bir değişkene atanabilir.

var Anahtar Sözcüğü ile Değişken Tanımlama

C# 3.0 ile birlikte bir metot içerisinde tanımlanacak değişkenler tipleri bildirilmeden tanımlanabilmektedir.

Dile eklenen var anahtar sözcüğü sayesinde değişkene atanan değerin tipinden çıkarsama (type interface) yapılarak derleme aşamasında IL (Intermediate Language – Aradil) içerisine gerçek tip bildirimi eklenir.

Serimizin sonuna gelmiş bulunmaktayız. C# dilindeki temel veri türleri ve faaliyet alanları hakkında bilgi edindik. Bir sonraki serimde RoadMap’e bağlı kalarak Tür Dönüşümü (Type Conversion) hakkında edindiğim bilgileri paylaşıyor olacağım. Bir sonraki serimde görüşmek dileğiyle.

Kaynaklar:

Her Yönüyle C# 7.0, Sefer Algan, Pusula Yayincilik,

https://docs.microsoft.com/en-us/dotnet/csharp/language-reference/proposals/csharp-7.0/digit-separators

1 Comment

Leave a Comment