C# Programlamaya Giriş

C#, Microsoft tarafından geliştirilen, modern, nesne yönelimli ve tip güvenli bir programlama dilidir. .NET platformu üzerinde çalışır ve oyun geliştirmeden (Unity), web uygulamalarına kadar geniş bir alanda kullanılır.

Neden C#?

Program.cs

using System;

namespace IlkProgram
{
    class Program
    {
        static void Main(string[] args)
        {
            // Ekrana yazdırma
            Console.WriteLine("Merhaba Dünya!");
            Console.WriteLine("FediaTech'e Hoşgeldiniz!");
            
            // Kullanıcıdan veri alma
            Console.Write("Adınız nedir🔹 ");
            string isim = Console.ReadLine();
            
            Console.WriteLine($"Hoşgeldin, {isim}!");
            
            // Konsolun kapanmasını önle
            Console.ReadKey();
        }
    }
}
                
🔹 İpucu: Visual Studio Community sürümünü ücretsiz indirerek profesyonel bir geliştirme ortamına sahip olabilirsiniz.

Değişkenler ve Veri Tipleri

C# statik tipli bir dildir, yani değişkenlerin türünü önceden belirtmeniz gerekir.

Temel Veri Tipleri

Tip Açıklama Örnek Aralık
int Tam sayı (32-bit) 42 -2.1 milyar ile +2.1 milyar
long Tam sayı (64-bit) 100000L Çok büyük sayılar
float Ondalık sayı 3.14f ±1.5 × 10^-45 ile ±3.4 × 10^38
double Ondalık sayı 3.14159 ±5.0 × 10^-324 ile ±1.7 × 10^308
decimal Parasal değerler 19.99m Yüksek hassasiyet
bool Mantıksal true true veya false
char Karakter 'A' Tek Unicode karakteri
string Metin "Merhaba" Karakter dizisi
Degiskenler.cs

// Değişken tanımlama
int yas = 25;
string ad = "Ahmet";
double maas = 15000.50;
bool ogrenciMi = true;
char notHarfi = 'A';

// Var anahtar kelimesi (Tip çıkarımı)
var sehir = "İstanbul"; // string olarak algılar
var yil = 2026;         // int olarak algılar

// Sabitler (Değiştirilemez)
const double PI = 3.14159;
// PI = 3.15; // HATA!

// String interpolasyon
Console.WriteLine($"Personel: {ad}, Yaş: {yas}, Maaş: {maas}");

// Tip dönüşümleri
string sayiStr = "100";
int sayi = int.Parse(sayiStr);
int sayi2 = Convert.ToInt32(sayiStr);

// Güvenli dönüşüm
if (int.TryParse("123", out int sonuc))
{
    Console.WriteLine($"Dönüştürülen sayı: {sonuc}");
}
                

Kontrol Yapıları

Program akışını yönlendirmek için if-else ve switch yapıları kullanılır.

Kosullar.cs

int saat = 14;

// If-Else Yapısı
if (saat < 12)
{
    Console.WriteLine("Günaydın!");
}
else if (saat < 18)
{
    Console.WriteLine("İyi günler!");
}
else
{
    Console.WriteLine("İyi akşamlar!");
}

// Ternary Operatörü
string mesaj = (saat < 12) 🔹 "Erken" : "Geç";

// Switch Yapısı (Modern C#)
int gun = 3;
string gunAdi = gun switch
{
    1 => "Pazartesi",
    2 => "Salı",
    3 => "Çarşamba",
    4 => "Perşembe",
    5 => "Cuma",
    6 => "Cumartesi",
    7 => "Pazar",
    _ => "Geçersiz"
};

Console.WriteLine($"Bugün: {gunAdi}");
                

Döngüler

İşlemleri tekrar etmek için For, While, Do-While ve Foreach döngüleri kullanılır.

Donguler.cs

// For Döngüsü
Console.WriteLine("--- 0'dan 4'e ---");
for (int i = 0; i < 5; i++)
{
    Console.WriteLine(i);
}

// While Döngüsü
Console.WriteLine("--- Geri Sayım ---");
int sayac = 3;
while (sayac > 0)
{
    Console.WriteLine(sayac);
    sayac--;
}

// Foreach (Koleksiyonlar için)
string[] sehirler = { "Ankara", "İstanbul", "İzmir" };

Console.WriteLine("--- Şehirler ---");
foreach (string sehir in sehirler)
{
    Console.WriteLine(sehir);
}
                

Metotlar (Fonksiyonlar)

Kod tekrarını önlemek ve modülerlik için metotlar kullanılır.

Metotlar.cs

class Hesaplayici
{
    // Geriye değer döndürmeyen metot (void)
    public void Selamla()
    {
        Console.WriteLine("Merhaba!");
    }

    // Parametre alan ve değer döndüren metot
    public int Topla(int a, int b)
    {
        return a + b;
    }

    // Opsiyonel parametre
    public void BilgiYaz(string mesaj, int tekrar = 1)
    {
        for (int i = 0; i < tekrar; i++)
        {
            Console.WriteLine(mesaj);
        }
    }
    
    // Metot aşırı yükleme (Overloading)
    public int Carp(int a, int b) => a * b;
    public double Carp(double a, double b) => a * b;
}

// Kullanım
var hesap = new Hesaplayici();
hesap.Selamla();
int toplam = hesap.Topla(10, 20);
hesap.BilgiYaz("Önemli!", 3);
                

Sınıflar ve Nesneler (OOP)

C#, nesne yönelimli bir dildir (OOP). Her şey nesneler ve sınıflar etrafında modellenir.

Siniflar.cs

// Sınıf Tanımlama
public class Araba
{
    // Özellikler (Properties)
    public string Marka { get; set; }
    public string Model { get; set; }
    public int Yil { get; set; }
    
    // Private alan (Encapsulation)
    private int _hiz;
    
    // Kurucu Metot (Constructor)
    public Araba(string marka, string model, int yil)
    {
        Marka = marka;
        Model = model;
        Yil = yil;
        _hiz = 0;
    }
    
    // Metot
    public void Hizlan(int artis)
    {
        _hiz += artis;
        Console.WriteLine($"{Marka} hızlandı. Şu anki hız: {_hiz} km/s");
    }
}

// Kullanım
Araba arabam = new Araba("Tesla", "Model Y", 2024);
Console.WriteLine($"Aracım: {arabam.Marka} {arabam.Model}");
arabam.Hizlan(50);
                

Kalıtım (Inheritance)

Bir sınıfın özelliklerini başka bir sınıfa aktarmak için kullanılır.

Kalitim.cs

// Ana Sınıf (Base Class)
public class Hayvan
{
    public string Ad { get; set; }
    
    public virtual void SesCikar()
    {
        Console.WriteLine("Ses çıkarıyor...");
    }
}

// Türetilmiş Sınıf (Derived Class)
public class Kedi : Hayvan
{
    public override void SesCikar()
    {
        Console.WriteLine("Miyav!");
    }
    
    public void Mirildan()
    {
        Console.WriteLine("Mırrr...");
    }
}

public class Kopek : Hayvan
{
    public override void SesCikar()
    {
        Console.WriteLine("Hav hav!");
    }
}

// Kullanım
Hayvan kedi = new Kedi { Ad = "Pamuk" };
Hayvan kopek = new Kopek { Ad = "Karabaş" };

kedi.SesCikar();  // Miyav!
kopek.SesCikar(); // Hav hav!
                

Koleksiyonlar (Lists & Arrays)

Veri gruplarını yönetmek için diziler ve listeler kullanılır. List<T> en popüler yapıdır.

Koleksiyonlar.cs

using System.Collections.Generic;

// List Tanımlama
List<string> isimler = new List<string>();

// Ekleme
isimler.Add("Ali");
isimler.Add("Veli");
isimler.AddRange(new string[] { "Ayşe", "Fatma" });

// Silme
isimler.Remove("Veli");

// Erişim
Console.WriteLine($"İlk kişi: {isimler[0]}");
Console.WriteLine($"Kişi sayısı: {isimler.Count}");

// Sıralama
isimler.Sort();

// Döngü
foreach (var isim in isimler)
{
    Console.WriteLine(isim);
}

// Dictionary (Anahtar-Değer)
Dictionary<int, string> plakalar = new Dictionary<int, string>();
plakalar.Add(34, "İstanbul");
plakalar.Add(06, "Ankara");

Console.WriteLine(plakalar[34]); // İstanbul
                

Hata Yönetimi (Try-Catch)

Çalışma zamanı hatalarını kontrollü bir şekilde yönetmek için kullanılır.

HataYonetimi.cs

try
{
    Console.Write("Bir sayı girin: ");
    int sayi = int.Parse(Console.ReadLine());
    
    int sonuc = 100 / sayi;
    Console.WriteLine($"Sonuç: {sonuc}");
}
catch (DivideByZeroException)
{
    Console.WriteLine("Hata: Sıfıra bölme yapılamaz!");
}
catch (FormatException)
{
    Console.WriteLine("Hata: Lütfen geçerli bir sayı girin.");
}
catch (Exception ex)
{
    Console.WriteLine($"Beklenmeyen bir hata: {ex.Message}");
}
finally
{
    Console.WriteLine("İşlem tamamlandı."); // Her durumda çalışır
}
                
🔹 Dikkat: Hataları kullanıcıya gösterirken teknik detayları gizleyin, anlaşılır mesajlar verin.

Dosya İşlemleri

Dosyadan okuma ve yazma işlemleri için System.IO kütüphanesi kullanılır.

DosyaIslemleri.cs

using System.IO;

string dosyaYolu = "notlar.txt";

// Dosya Yazma
string[] satirlar = { "Satır 1", "Satır 2", "Satır 3" };
File.WriteAllLines(dosyaYolu, satirlar);

// Metin Ekleme (Append)
File.AppendAllText(dosyaYolu, "\nEk satır");

// Dosya Okuma
if (File.Exists(dosyaYolu))
{
    string metin = File.ReadAllText(dosyaYolu);
    Console.WriteLine("Dosya İçeriği:");
    Console.WriteLine(metin);
}
else
{
    Console.WriteLine("Dosya bulunamadı.");
}

// Klasör İşlemleri
Directory.CreateDirectory("Yedekler");