Bu döküman, C# programlama diline yeni başlayanlar için temel özellikler, veri tipleri, fonksiyonlar ve daha fazlasını ayrıntılı bir şekilde açıklayan kapsamlı bir rehberdir. C#, güçlü, nesne yönelimli ve modern bir programlama dilidir ve bu döküman size temel kavramları öğrenme yolunda sağlam bir başlangıç sunar.
1. C#’ın Temel Özellikleri #
C#, Microsoft tarafından geliştirilen, genel amaçlı, nesne yönelimli bir programlama dilidir. .NET platformu üzerinde çalışır ve web, masaüstü, mobil uygulamalar, oyun geliştirme gibi birçok alanda kullanılır. İşte C#’ın temel özelliklerine detaylı bir bakış:
- Nesne Yönelimli Programlama (OOP): C#, sınıflar, nesneler, kalıtım, kapsülleme ve çok biçimlilik gibi OOP prensiplerini destekler. Bu, kodun modüler, yeniden kullanılabilir ve bakımı kolay olmasını sağlar.
- Tip Güvenliği: C#, statik tipli bir dildir; yani değişkenlerin tipleri derleme zamanında kontrol edilir. Bu, hataları erken tespit etmeye yardımcı olur ve daha güvenilir kod yazılmasını sağlar.
- Platform Bağımsızlığı: .NET Core (şimdi .NET olarak biliniyor) sayesinde C# uygulamaları Windows, macOS ve Linux gibi farklı işletim sistemlerinde çalışabilir.
- Otomatik Bellek Yönetimi (Garbage Collection): C#, bellek yönetimini otomatik olarak gerçekleştirir. Kullanılmayan nesneler, Garbage Collector tarafından bellekten temizlenir, böylece bellek sızıntıları önlenir.
- Geniş Kütüphane Desteği: .NET framework’ü, dosya işlemleri, veritabanı bağlantıları, ağ programlama ve daha birçok alanda zengin API’ler sunar.
- C#’ın Modern Özellikleri: LINQ (Language Integrated Query), asenkron programlama (
async/await
), ve lambda ifadeleri gibi modern özellikler, C#’ı güçlü ve esnek kılar.
2. Veri Tipleri #
C#’ta veri tipleri, iki ana kategoriye ayrılır: Değer Tipleri ve Referans Tipleri. Her bir veri tipi, belirli bir veri türünü temsil eder ve bellekte farklı şekillerde saklanır.
Değer Tipleri #
- Tam Sayılar:
int
: 32-bit işaretli tamsayı (-2,147,483,648 ile 2,147,483,647 arası). Genel amaçlı sayısal işlemler için kullanılır.long
: 64-bit işaretli tamsayı. Daha büyük sayılar için uygundur.byte
: 8-bit işaretsiz tamsayı (0 ile 255 arası). Küçük pozitif sayılar için kullanılır.short
: 16-bit işaretli tamsayı. Daha az bellek gerektiren durumlarda tercih edilir.
- Ondalıklı Sayılar:
float
: 32-bit kayan nokta sayısı. Ondalık sayılar için kullanılır, ancak hassasiyeti sınırlıdır (örn: 3.14f).double
: 64-bit kayan nokta sayısı. Daha yüksek hassasiyet sunar ve genellikle bilimsel hesaplamalarda tercih edilir.decimal
: 128-bit ondalık sayı. Finansal hesaplamalar gibi yüksek hassasiyet gerektiren durumlarda kullanılır.
- Diğer Değer Tipleri:
bool
: Mantıksal değerler için kullanılır ve yalnızcatrue
veyafalse
değerlerini alır.char
: Tek bir Unicode karakteri temsil eder (örn: ‘A’, ‘5’, ‘@’).struct
: Kullanıcı tanımlı değer tipi. Hafif veri yapıları oluşturmak için kullanılır.
Referans Tipleri #
Referans tipleri, verinin bellekteki adresini tutar ve bellekte yığında (heap) saklanır. Değer tiplerine kıyasla daha fazla bellek kullanabilirler, ancak dinamik veri yapıları için uygundurlar. Yaygın referans tipleri:
string
: Unicode karakter dizilerini temsil eder. Değiştirilemez (immutable) bir veri tipidir (örn: “Merhaba Dünya”).object
: C#’ta tüm tiplerin temel sınıfıdır. Herhangi bir veri tipini temsil edebilir.class
: Kullanıcı tanımlı sınıflar, karmaşık veri yapıları ve davranışlar oluşturmak için kullanılır.array
: Aynı tipteki verilerin bir koleksiyonunu saklar (örn:int[] sayilar = {1, 2, 3};
).null
: Referans tiplerine atanabilen bir değerdir ve “hiçbir nesneye işaret etmiyor” anlamına gelir.
Örnek Kod #
Aşağıdaki kod, farklı veri tiplerinin kullanımını gösterir:
int tamSayi = 42; double ondalikSayi = 3.14159; string metin = "C# öğreniyorum!"; bool dogruMu = true; char harf = 'A';
3. Değişken Tanımlama ve Kapsam #
C#’ta değişkenler, kullanılmadan önce tanımlanmalıdır. Değişken tanımlarken veri tipi açıkça belirtilir veya var
anahtar kelimesi ile tip çıkarımı yapılabilir.
- Değişken Tanımlama:
int yas = 25; string ad = "Ahmet"; var fiyat = 99.99; // double olarak çıkarılır
- Kapsam (Scope): Değişkenin erişilebilir olduğu bölgeyi ifade eder. Örneğin:
- Bir metot içinde tanımlanan değişkenler yalnızca o metot içinde erişilebilir.
- Sınıf düzeyinde tanımlanan değişkenler, sınıfın tüm metotlarında kullanılabilir.
class Ornek { int sinifDegiskeni = 10; // Sınıf kapsamında void Metot() { int yerelDegisken = 5; // Metot kapsamında Console.WriteLine(sinifDegiskeni); // Erişilebilir } }
4. Fonksiyonlar (Metotlar) #
Fonksiyonlar (C#’ta metotlar olarak bilinir), belirli bir görevi gerçekleştiren kod bloklarıdır. Metotlar, kodun yeniden kullanılabilirliğini artırır ve programı modüler hale getirir.
Metot Tanımlama #
Bir metot, aşağıdaki yapıya sahiptir:
[erişim belirleyici] [dönüş tipi] MetotAdi([parametreler]) { // Metot gövdesi }
- Erişim Belirleyici:
public
,private
,protected
gibi anahtar kelimelerle metotun erişim seviyesi belirlenir. - Dönüş Tipi: Metotun döndüreceği veri tipi (
int
,string
,void
gibi). - Parametreler: Metotun aldığı giriş değerleri.
Örnek Metot
#
Aşağıdaki metot, iki sayıyı toplar ve sonucu döndürür:
public class Hesaplayici { public int Topla(int a, int b) { return a + b; } }
Metot Türleri #
Void Metotlar: Herhangi bir değer döndürmez, yalnızca bir işlem yapar.
public void MesajYaz(string mesaj) { Console.WriteLine(mesaj); }
Parametreli Metotlar: Giriş parametreleri alarak işlem yapar.
public double KareAl(double sayi)
{
return sayi * sayi;
}
Varsayılan Parametreli Metotlar: Parametreler için varsayılan değerler atanabilir.
public void SelamVer(string isim = "Misafir")
{
Console.WriteLine($"Merhaba, {isim}!");
}
Out ve Ref Parametreler: Parametrelerin metot içinde değiştirilmesini sağlar.
ref
: Parametre, metot çağrılmadan önce başlatılmalıdır.out
: Parametre, metot içinde başlatılmalıdır.
public void DegeriArtir(ref int sayi) { sayi += 10; } public void SayiUret(out int sayi) { sayi = 100; }
5. Kontrol Yapıları #
Kontrol yapıları, programın akışını yönlendirmek için kullanılır. Koşullu ifadeler ve döngüler, C#’ta sıkça kullanılan kontrol yapılarıdır.
Koşullu İfadeler #
if-else: Koşullara bağlı olarak farklı kod bloklarını çalıştırır. int sayi = 10; if (sayi > 0) { Console.WriteLine("Sayı pozitiftir."); } else if (sayi < 0) { Console.WriteLine("Sayı negatiftir."); } else { Console.WriteLine("Sayı sıfırdır."); }
switch-case: Bir değişkenin farklı değerlerine göre işlem yapar. int gun = 3; switch (gun) { case 1: Console.WriteLine("Pazartesi"); break; case 2: Console.WriteLine("Salı"); break; default: Console.WriteLine("Geçersiz gün"); break; }
Döngüler #
for: Belirli bir sayıda tekrar için kullanılır. for (int i = 1; i <= 5; i++) { Console.WriteLine($"Sayı: {i}"); } while: Koşul doğru olduğu sürece çalışır. int sayac = 0; while (sayac < 3) { Console.WriteLine("Merhaba!"); sayac++; } foreach: Koleksiyonlar (diziler, listeler) üzerinde döngü yapar. string[] meyveler = { "Elma", "Armut", "Muz" }; foreach (string meyve in meyveler) { Console.WriteLine(meyve); }
6. Diziler ve Koleksiyonlar #
C#’ta veri koleksiyonlarını saklamak için diziler ve dinamik koleksiyonlar kullanılır.
Diziler: Sabit boyutlu, aynı tipte veri saklar.
int[] sayilar = new int[3] { 1, 2, 3 }; Console.WriteLine(sayilar[0]); // 1
Listeler: Dinamik boyutlu koleksiyonlar. System.Collections.Generic
ad alanından gelir.
List<string> isimler = new List<string>(); isimler.Add("Ali"); isimler.Add("Ayşe"); Console.WriteLine(isimler[1]); // Ayşe
Diğer Koleksiyonlar:
Dictionary
: Anahtar-değer çiftleri saklar.
Queue
: İlk giren ilk çıkar (FIFO) mantığıyla çalışır.
Stack
: Son giren ilk çıkar (LIFO) mantığıyla çalışır.
7. Nesne Yönelimli Programlama (OOP) Temelleri #
C#, nesne yönelimli programlamayı destekler ve bu özellik, karmaşık uygulamalar geliştirmek için güçlü bir temel sağlar.
Sınıf ve Nesne: Sınıflar, bir nesnenin şablonudur; nesneler ise sınıfların örnekleridir.
public class Kisi { public string Ad { get; set; } public int Yas { get; set; } public void Tanimla() { Console.WriteLine($"Ad: {Ad}, Yaş: {Yas}"); } } Kisi kisi = new Kisi { Ad = "Ayşe", Yas = 25 }; kisi.Tanimla();
Kalıtım: Bir sınıf, başka bir sınıftan özellik ve metot miras alabilir.
public class Hayvan { public void SesCikar() { Console.WriteLine("Ses!"); } } public class Kopek : Hayvan { public void Havla() { Console.WriteLine("Hav hav!"); } }
Kapsülleme: Verilere kontrollü erişim sağlar. private
alanlar ve public
özellikler (properties) kullanılır.
Çok Biçimlilik: Aynı metot farklı sınıflarda farklı davranışlar sergileyebilir (örneğin, override
ile).
8. Hata Yönetimi #
C#’ta hatalar, try-catch
bloklarıyla yakalanır ve yönetilir. Bu, programın çökmesini önler ve kullanıcıya anlamlı hata mesajları sunar.
try { int sayi = int.Parse("abc"); // Hatalı giriş } catch (FormatException ex) { Console.WriteLine($"Hata: Sayı formatı yanlış. {ex.Message}"); } catch (Exception ex) { Console.WriteLine($"Genel hata: {ex.Message}"); } finally { Console.WriteLine("İşlem tamamlandı."); }
9. Örnek Program #
Aşağıdaki program, C#’ın temel özelliklerini birleştiren bir örnektir:
using System; using System.Collections.Generic; class Program { static void Main(string[] args) { Console.WriteLine("Adınızı girin:"); string ad = Console.ReadLine(); SelamVer(ad); int sayi1 = 5, sayi2 = 10; int toplam = Topla(sayi1, sayi2); Console.WriteLine($"{sayi1} + {sayi2} = {toplam}"); List<string> hobiler = new List<string> { "Kitap okumak", "Yürüyüş", "Müzik" }; Console.WriteLine("Hobileriniz:"); foreach (string hobi in hobiler) { Console.WriteLine(hobi); } } static void SelamVer(string isim) { Console.WriteLine($"Merhaba, {isim}!"); } static int Topla(int a, int b) { return a + b; } }