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ızca true veya false 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: publicprivateprotected gibi anahtar kelimelerle metotun erişim seviyesi belirlenir.
  • Dönüş Tipi: Metotun döndüreceği veri tipi (intstringvoid 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;
    }
}

#