C# veri tipleri nedir?

Her şey tamamda ver tipleri ne işe yarıyor. BTK Akademi'ye geçtim youtubedekiler anlatamıyor.

En temelinde verimlilik var, kod yazarken işin mühendisliğinde isen yani kaliteli kod yazmaya çalışıyorsan veri tiplerine çok dikkat etmelisin, hobi olarak uğraşıyorsan bilgisayarın derleyeceği kadar öğrensen yeter, kodun hata vermiyorsa çalıştır gitsin yani.

Veri tipleri bilgisayarın farklı veri tipleri ile farklı işlemler yapabilmesini sağlıyor. Yani sen bilgisayara bu verinin tipi şudur dersen bilgisayar da o veri tipi için kullanacağı şeyleri hazırlıyor diye düşünebilirsin.

Bu işlemler için kullanılacak şeylere kütüphane diyelim, bilgisayar senin yazdığın kodu anlamak ve çalıştırabilmek için farklı kütüphanelere gereksinim duyuyor. Basit bir program yazdın, bilgisayar bu programı çalıştırabilmek için sadece String yani metin tipi verileri çalıştıracak kütüphaneleri hazırlıyor gibi düşün. Mesela daha karmaşık bir kod yazdın, bilgisayarın bu kodu çalıştırabilmesi için metin, sayı, diziler, map tipindeki veriler, listeler, input/output, tarih vb. veri tiplerini ya da mekanizmaları kullanması gerekebilir. Eğer çok basit, birkaç satırlık bir kod için bütün bu kütüphaneleri ekleseydin bilgisayar gereksiz yere bu kütüphaneleri load etmeye çalışacaktı, programı yükleme, çalıştırma süresi uzayacaktı, RAM kullanımı gereksiz yere artacaktı, yani işin mühendisliğine son derece ters bir durum bu. Yoksa ne var ne yok bütün kütüphaneleri ekleyelim kodun tepesine, ne yazarsan yaz çalışsın 😀

Güncel IDE'ler zaten uyarı verir, der ki senin kodunda hiç Liste yok, liste veri tipi kullanmamışsın ama kodunun tepesine "import bla. Bla. List" diye liste verisi kullanmışsın gibi kütüphane eklemeye çalışmışsın. Ben bunu çalıştırırım ama bu kod bana göre saçma diye uyarır seni.

Ayrıca veri tipleri işin daha da hassas mühendisliğinde çok daha önemlidir,
Ne demek bu; çok büyük bir program yazdığını düşün, mesela bir oyun. Bu oyunda sayısız obje olduğunu düşün, mesela bir sürü ama bir sürü sayı objesi oluşturman ve bunu hafızada tutman gerekiyor. "Amaaan veri tipi dediğin ya sayıdır ya metindir zaten, sayı dediğin de Integerdır" diyerek her sayıyı Integer diye tanımlarsan o program çok yavaş çalışır ya da hiç çalışmayabilir, bilgisayarının belleği yetmez. Çünkü bilgisayar bu verileri hafızasında tutarken her veri tipi farklı miktarda yer kaplar.

Diyelim ki sana bir obje lazım, sen bu objede sadece 0 ya da 1 değerini tutacaksın. Sana Boolean dediğimiz veri tipi yeter. Hafızada 1 bitlik yer kaplar.
Ha diyelim ki bir insanın yaş değerini bir objede tutacaksın. Bunun için kodlamada byte denilen veri tipi sana yeter, -128 ila 127 arasındaki sayıları tutar bu veri tipi, 8 bitlik hafıza kullanır.
Sırf kodlama da değil tabii mesela SQL tipinde bir veri tabanı yönetiyorsan ve bir kolon yaratacaksan insanın yaş değerini bu veri tipinde seçebilirsin, hatta sayının negatif olma ihtimali yok ise (insanın yaşı negatif olmaz mesela) veri tipini UNSIGNED seçersin, böylece artı mı eksi mi diye kullandığın bir biti de sayının içinde kullanabilirsin, 0 ila 255 arasında bir sayı seçebilirsin böylece (-128, 127 aralığı yerine).
Diyelim ki kullanacağın sayı 256'dan falan daha büyük bir değer alabilir, short int, integer, long int diye bu veri tipleri büyüyor. Sana çok basit gelen virgüllü sayılar için bilgisayar bambaşka işlemler yapma ihtiyacı duyabiliyor, basit virgüllü sayılar (mesela 9.9999) için float, eğer virgüllü sayının çok fazla basamağına ihtiyaç varsa (9.99999999999 gibi yani) double diye farklı veri tipleri kullanıyor. Sayıların böyle karmaşıklığı ya da büyüklüğü arttıkça bunu hafızada tutmak için gereken bit miktarı artıyor.

Küçük bir program yazarsan bu bir sorun yaratmaz. Deminki oyun gibi bir program kodluyorsan bu sorun yaratır, kabaca şu mantıkla gözünde canlandırabilirsin.
Sen 4 tane byte tipinde veri ile halledebileceğin 4 tane sayıyı, önemsemeyerek 4 tane integer tipinde veri ile tanımlarsan, hafızada
00000000
00000000
00000000
00000000
Diye tutabileceğin bu 4 sayıyı
00000000000000000000000000000000
00000000000000000000000000000000
00000000000000000000000000000000
00000000000000000000000000000000
Bu kadar bit kullanarak tutabilirsin. Bir programda da böyle verilerden binlerce milyonlarca olduğuna göre kodunu güzel yazmazsan o oyun bilgisayarında çalışmaz, çalışsa da arada kendi kendine kapanır, yavaş çalışır, kasar, geç açılır, makinen ısınır, işlemcini yakar vb. Kodlamayı öğrenenler küçük kod parçaları üzerinden öğrenmeye başladıkları için her sayıya integer deyip geçerler genelde, halbuki veri tipleri ve farklarını bilmek çok ama çok önemlidir. Ama gerçekten de hobi olarak ilgilenen biri isen o kadar kasmaya gerek yok tabii.

not: bahsettiğim veri tipleri popüler dillerde birebiri ya da muadili olan veri tipleridir, c sharptaki adı farklı olabilir ama anladın sen.
 
Son düzenleme:
Bilgisayar temelinde hiçbir şey bilmez. Değişken dediğin şey bilgisayarda ayrılmış bir hafıza adresi ve bu adresin tuttuğu değerden ibarettir. Sen bilgisayara nasıl ve ne kadar yere ihtiyacın olduğunu söylemezsen bilgisayar ona yer ayıramaz çünkü ne yapması gerektiğini bilmiyor. Bir değişkenin int olduğunu söylediğinde bilgisayar hem hafızada 4 bitlik yer ayırması gerektiğini bilir hem de o değişkenin nasıl davranacağını bilir. Hafızaya rastgele şeyler atıp bilgisayarın çalışmasını bekleyemezsin. Bu en basit anlatımla en low-level kısmı işin.

Bunun dışında compiled dillerde senin yazdığın kod compilerda assembly ya da direkt makine dilline dönüştürülüyor. Bilgisayar sadece makine dilinden, 1 ve 0'lardan, elektrikten anlar. Temelinde her şey analog birer sistem, dijital bizim yaptığımız bir nevi "abstraction" aslında. Bilgisayar C# bilmez, dolayısıyla compiler senin kodunu başka bir koda çevirir. Bunu yaparken de bunu en verimli halde yapması gerek. Bir for loopu bilgisayar anlamaz, compiler bunu makine diline çevirirken en verimli şekilde ve çeşitli algoritmalar kullanarak çevirir. En nihayetinde compiler da bir programdır. Bunu yaparken de en iyi algoritmaları kullanması, en doğru ve verimli şekilde çalışması için nelerle uğraştığını biliyor olması lazım. Bunun için de veri tipleri gerekiyor.

Python gibi "dynamically typed" programlarda sen direkt olarak bir veri tipi her zaman belirtmesen de arka planda bir veri tipi çalışıyor. Interpreter bu işi senin için yapıyor ve kodu çalıştıran sanal makinenin de temelinde makine dili var.

Daha derin öğrenmek istiyorsan:
 
Buradaki arkadaşlarin eline sağlık usenmeden yazmışlar ama sizin tek yapmanız gereken derslere devam etmek. Veri tiplerini kullanarak program yaptikca anlayacaksınız. Zaten çok temel bir şey ogrenememe ihtimaliniz yok.
 

Geri
Yukarı