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;) vevar— 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.ParseveToString
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;.
| Tip | Ne tutar | Tipik kullanım | Örnek |
|---|---|---|---|
int | Tam sayı, ±2,1 milyar | Sayaç, adet, yıl | int adet = 12; |
long | Tam sayı, çok büyük aralık | Kimlik no, zaman damgası | long no = 10012345678L; |
double | Ondalıklı, ikilik taban | Ölçüm, oran, bilimsel hesap | double boy = 1.68; |
decimal | Ondalıklı, onluk taban | Para, finansal hesap | decimal 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
- 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 deConsole.ReadLine()ile al; doğum yılınıint.Parse, bütçeyidecimal.Parseile çevir. - Ş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 kabacayas * 12. - 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"). dotnet runile çalıştır, kendi bilgilerinle dene.- Bilerek boz ve gözle: (a) doğum yılına
abcyaz — çalışma zamanı hatasını, tür adını (FormatException) ve satır numarasını oku. (b)decimal.Parsesatırınıint.Parseyap, bütçeye5000.50gir — ne olduğunu açıkla. (c) Bütçe değişkeninidouble'a çevirip0.1 + 0.2tarzı bir toplam yazdır, decimal ile farkını gör. - 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."
