Skip to content

Bölüm 2 / 15

Değişkenler ve veri tipleri

int, double, decimal, string, bool, char, DateTime.

9 dakikalık okuma

Önceki ders değişkeni "bellekte adlandırılmış göz" olarak tanıttı. Bu ders o gözün tam halini kurar: tanımlama sözdizimi, isimlendirme, C#'ın temel veri tipleri — int, double, decimal, string, bool, char, DateTime — ve tipler arası dönüşüm. Para hesabında neden decimal kullanıldığı, Console.ReadLine çıktısının neden sayıya çevrilmesi gerektiği gibi sınavların ve mülakatların standart soruları bu derstedir.

01Ne öğreneceksin

  • Değişken tanımlamanın iki yazımı: açık tip (int yas = 26;) ve var — ikisinin de aynı derecede tipli olduğu
  • Yedi temel tip: int, double, decimal, string, bool, char, DateTime — hangisi ne zaman
  • Tip güvenliği: uyumsuz atamanın derleme hatası olması ve bunun neden avantaj olduğu
  • Dönüşümler: örtük genişleme, açık daraltma (cast), int.Parse ve ToString

02Tanımlama: tip, ad, değer

C#'ta değişken tanımının tam biçimi üç parçadır: tip (gözde ne tür veri duracak), ad (göze nasıl seslenilecek) ve isteğe bağlı başlangıç değeri:

int yas = 26;          // tip: int, ad: yas, değer: 26
string ad = "Aysel";   // tip: string, ad: ad, değer: "Aysel"
double boy;            // tanımlandı ama değer verilmedi
boy = 1.68;            // değer sonradan atandı

Tip, gözün hem boyutunu hem kural setini belirler: int gözüne yalnızca tam sayı girer, string gözüne yalnızca metin. Değeri atanmamış yerel bir değişkeni okumaya çalışmak derleme hatasıdır — C# "belki doludur" belirsizliğine izin vermez.

Aynı değişken bir kez tanımlanır, sonrasında adıyla kullanılır; int yas = 26; satırından sonra tekrar int yas = 30; yazmak hatadır, yas = 30; yeterlidir.

03var: tipi derleyici bulur

Hat 0'daki programlarında var kullandın. var "tipsiz" demek değildir; "tipi sağdaki değerden sen çıkar" demektir ve çıkarımı derleyici derleme anında yapar:

var yas = 26;        // derleyici: bu int
var ad = "Aysel";    // derleyici: bu string
var oran = 0.15;     // derleyici: bu double
yas = "yirmi altı";  // DERLEME HATASI: yas int'tir, string atanamaz

Son satır kritik: var ile tanımlanan değişkenin tipi ilk atamayla kesinleşir ve bir daha değişmez. Açık tip ile var arasında davranış farkı yoktur; okunabilirlik tercihi vardır. Bu müfredatta ikisini de göreceksin: tipin görünmesinin öğretici olduğu yerde açık tip, sağ taraftan zaten belli olduğu yerde var. var yalnızca başlangıç değeri verilen tanımlarda kullanılabilir (var boy; yazılamaz — derleyicinin çıkaracağı bir şey yok).

04İsimlendirme

Kurallar (derleyici zorunlu tutar): ad harf ya da _ ile başlar; harf, rakam ve _ içerebilir; boşluk içeremez; int, var gibi anahtar kelimeler ad olamaz. C# büyük-küçük harfe duyarlıdır: yas ile Yas farklı değişkenlerdir.

Gelenekler (derleyici zorlamaz, meslek zorlar): yerel değişkenler camelCase yazılır — küçük harfle başlar, sonraki her kelime büyükle bitişir: dogumYili, toplamTutar, kdvOrani. Ad, içeriği söylemelidir: d değil dogumYili; x1 değil kdvDahilFiyat. Kaynak kodda Türkçe karakter (ş, ğ, ü…) teknik olarak geçerlidir ama kullanılmaz — klavye uyumu ve ekip standartları nedeniyle bu müfredat da değişken adlarında Türkçe karakter kullanmaz (dogumYili, yıl değil).

05Sayı tipleri: int, long, double, decimal

int tam sayı tutar; aralığı yaklaşık ±2,1 milyardır (tam değer: -2.147.483.648 … 2.147.483.647). Sayaç, adet, yıl, indeks — tam sayı olan her şeyin varsayılan tipidir. Daha büyük tam sayılar için long vardır (±9,2 kentilyon; örneğin milisaniye cinsinden zaman damgaları).

double ondalıklı sayı tutar; hızlıdır, bilimsel ve geometrik hesabın tipidir. Ama ikilik tabanda çalıştığı için bazı ondalık kesirleri tam temsil edemez:

Console.WriteLine(0.1 + 0.2);    // 0.30000000000000004
Console.WriteLine(0.1m + 0.2m);  // 0.3  (m soneki: decimal)

decimal onluk tabanda çalışır, 28-29 anlamlı basamak taşır ve ondalık kesirleri tam tutar; bedeli daha yavaş olmasıdır. Kural nettir ve sınavların klasiğidir: para ve finansal hesap decimal ile yapılır — kuruş farkları double'ın temsil hatasında kaybolamaz. Decimal sabit yazarken m soneki gerekir: decimal fiyat = 149.90m;.

TipNe tutarTipik kullanımÖrnek
intTam sayı, ±2,1 milyarSayaç, adet, yılint adet = 12;
longTam sayı, çok büyük aralıkKimlik no, zaman damgasılong no = 10012345678L;
doubleOndalıklı, ikilik tabanÖlçüm, oran, bilimsel hesapdouble boy = 1.68;
decimalOndalıklı, onluk tabanPara, finansal hesapdecimal fiyat = 149.90m;

06Metin ve karakter: string, char

string metin tutar ve çift tırnakla yazılır; char tek bir karakter tutar ve tek tırnakla yazılır:

string ad = "Aysel";
char ilkHarf = 'A';
string bos = "";        // geçerli: boş metin

Metinleri + ile uç uca ekleyebilirsin (Hat 0'da yaptın); daha okunaklı yol interpolation'dır — tırnağın önüne $ konur, değişkenler süslü parantezle içeri gömülür:

var ad = "Aysel";
var yas = 26;
Console.WriteLine("Merhaba " + ad + ", yaş: " + yas);   // birleştirme
Console.WriteLine($"Merhaba {ad}, yaş: {yas}");          // interpolation — tercih edilen

Süslü parantezin içine ifade de yazılabilir: $"Gelecek yıl {yas + 1}". Metin içinde çift tırnak gerekiyorsa önüne \ konur ("o \"evet\" dedi"); \n satır atlatır. String'in kesme, arama, dönüştürme gibi zengin işlemleri Hat 03'te ayrı bir derstir (cs-string); bu hat boyunca tanımlamak ve interpolation yeter.

07bool ve DateTime

bool yalnızca iki değer alır: true (doğru) ve false (yanlış). Küçük görünür ama akışın tamamı ona bağlıdır: bir sonraki derste karşılaştırmaların bool ürettiğini, 4. derste if'in bool'a göre dal seçtiğini göreceksin.

bool kayitliMi = true;
bool odemeAlindi = false;

DateTime tarih ve saati birlikte tutar. Şu anı DateTime.Now verir; belirli bir tarih new DateTime(yıl, ay, gün) ile kurulur; parçalarına özellikleriyle erişilir:

DateTime simdi = DateTime.Now;
Console.WriteLine(simdi.Year);               // 2026
DateTime ilanTarihi = new DateTime(2026, 8, 27);
DateTime sonGun = ilanTarihi.AddDays(15);    // 15 gün sonrası
Console.WriteLine(sonGun.ToString("dd.MM.yyyy"));  // 11.09.2026

AddDays gibi işlemler mevcut değeri değiştirmez, yeni bir DateTime döndürür — bu yüzden sonucu bir değişkene almak gerekir. new anahtar kelimesinin tam anlamı OOP bölümünde (10. ders); şimdilik "bu tipten yeni bir değer kur" diye oku.

08Tip güvenliği ve dönüşümler

C# tip güvenli dildir: her ifadenin tipi derleme anında bellidir ve uyumsuz atama derleme hatasıdır. int yas = "26"; yazan bir program hiç çalışmaz — hata, kullanıcıya değil sana, en ucuz anda gösterilir. Bu, Hat 0'ın 3. dersindeki "derleyici hatayı erken yakalar" avantajının günlük hali.

Tipler arasında geçiş üç yolla yapılır:

Örtük dönüşüm — veri kaybı imkânsızsa derleyici kendiliğinden genişletir:

int adet = 5;
double oran = adet;      // 5 → 5.0, kayıp yok, izin otomatik

Açık dönüşüm (cast) — veri kaybı mümkünse niyetini parantezle beyan etmen gerekir; ondalık kısım yuvarlanmaz, atılır:

double puan = 3.9;
int tam = (int)puan;     // 3 — 4 değil: kesme, yuvarlama değil

Metin ↔ sayı — cast burada çalışmaz; dönüşüm metotları kullanılır:

Console.Write("Doğum yılın: ");
string girdi = Console.ReadLine();       // ReadLine HER ZAMAN string döner
int dogumYili = int.Parse(girdi);        // "2000" → 2000
int yas = 2026 - dogumYili;              // artık hesap yapılabilir
string mesaj = yas.ToString();           // 26 → "26"

"2000" ile 2000'in farklı şeyler olduğunu netleştir: ilki dört karakterlik metindir, toplanamaz; ikincisi sayıdır. int.Parse sayıya çevrilemeyen metin alırsa (örneğin "abc") çalışma zamanı hatası fırlatır; kullanıcı girdisini güvenli çevirmenin yolu (TryParse) Hat 03'te, hataları yakalamanın genel mekanizması da orada (cs-exception).

Son kavram: const. Değeri programın ömrü boyunca değişmeyecek bir isim tanımlar; atamayı değiştirmeye çalışmak derleme hatasıdır. Sabitler geleneksel olarak açık tiple yazılır: const decimal KdvOrani = 0.20m;. Kodda çıplak sayı gezdirmek yerine sabite ad vermek, hem okunabilirlik hem tek yerden değiştirme sağlar.

09Mini alıştırma — profil kartı

Yaklaşık 20 dakika · dotnet new console -o profil

  1. Yeni proje aç (dotnet new console -o profil → cd profil → code .). Program kullanıcıdan sırayla ad, doğum yılı ve aylık bütçe (TL) istesin. Üç girdiyi de Console.ReadLine() ile al; doğum yılını int.Parse, bütçeyi decimal.Parse ile çevir.
  2. Şunları hesapla: yaş (2026 - dogumYili), günlük bütçe (butce / 30) ve doğum yılının üzerinden geçen ay sayısı için kabaca yas * 12.
  3. Sonucu interpolation ile üç satırlık bir kart olarak yazdır; en az bir satırda süslü parantez içinde ifade kullan (örnek: $"Gelecek yıl {yas + 1} yaşında olacaksın").
  4. dotnet run ile çalıştır, kendi bilgilerinle dene.
  5. Bilerek boz ve gözle: (a) doğum yılına abc yaz — çalışma zamanı hatasını, tür adını (FormatException) ve satır numarasını oku. (b) decimal.Parse satırını int.Parse yap, bütçeye 5000.50 gir — ne olduğunu açıkla. (c) Bütçe değişkenini double'a çevirip 0.1 + 0.2 tarzı bir toplam yazdır, decimal ile farkını gör.
  6. Kapanış: günlük bütçe satırını gunluk.ToString("0.00") ile iki ondalık basamağa yuvarlayarak yazdır.

10Kendini sına

Para tutarları için neden double değil decimal kullanılır?

double ikilik tabanda çalışır ve 0.1 gibi bazı ondalık kesirleri tam temsil edemez; hesap biriktikçe kuruş düzeyinde temsil hataları oluşur (0.1 + 0.2 = 0.30000000000000004). decimal onluk tabanda çalışır, ondalık kesirleri tam tutar; daha yavaştır ama finansal hesapta doğruluk hızdan önce gelir. Decimal sabitler m sonekiyle yazılır: 149.90m.

var ile tanımlanan değişken tipsiz midir? var x = 5; x = "beş"; ne olur?

Tipsiz değildir. var, tipi sağdaki değerden derleme anında çıkarttırır; var x = 5; ile int x = 5; birebir aynıdır. Tip ilk atamayla kesinleşir ve değişmez: x = "beş"; satırı "int'e string atanamaz" derleme hatası verir — program hiç çalışmaz.

Console.ReadLine() hangi tipte değer döndürür? Kullanıcıdan alınan yaşla hesap yapmak için ne gerekir?

Her zaman string döndürür — kullanıcı "26" yazsa bile bu iki karakterlik metindir, sayı değildir. Hesap için önce sayıya çevrilir: int yas = int.Parse(Console.ReadLine());. Metin sayıya çevrilemiyorsa Parse çalışma zamanında FormatException fırlatır.

(int)3.9 kaçtır? Cast ile int.Parse arasındaki fark nedir?

(int)3.9 3'tür — cast ondalık kısmı yuvarlamaz, atar (kesme). Cast, sayısal tipler arasında dönüşümdür: double'dan int'e gibi. int.Parse ise metni sayıya çevirir: "3" → 3. Metne cast uygulanamaz; (int)"3" derleme hatasıdır.

11Sınav köşesi

Yazılıda nasıl sorulur

Üç klasik kalıp: (1) Tip seçimi — "Parasal değerler için en uygun veri tipi hangisidir?" (decimal), "Tek bir karakter tutan tip?" (char). (2) Çıktı sorusu — cast ve tamsayı içeren kod parçası verilir; (int)3.9'un 3 olduğunu, ReadLine'ın string döndürdüğünü bilmek çözer. (3) Doğru-yanlış — "var ile tanımlanan değişkenin tipi çalışma zamanında değişebilir" (yanlış), "C# büyük-küçük harfe duyarlıdır" (doğru), "int değişkene değer atamadan okumak derleme hatasıdır" (doğru).

Sözlüde nasıl anlatılır — 2 dakikalık taslak

"C#'ta temel veri tiplerini anlatır mısınız?" sorusuna aile aile cevap: (1) Tam sayılar: int varsayılan, büyük aralık için long. (2) Ondalıklılar: double hızlı ama ikilik tabanda — ölçüm ve oran için; decimal onluk tabanda tam — para için. Bu karşıtlığı mutlaka kendin söyle; en sevilen takip sorusudur. (3) Metin tarafı: string metin, char tek karakter. (4) bool akış kontrolünün temeli; DateTime tarih-saat. Kapanış cümlesi: "C# tip güvenlidir — uyumsuz atama derleme hatasıdır, bu da hata sınıfının tamamını çalışma zamanından derleme zamanına çeker."