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ızcatrueveyafalsedeğ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,protectedgibi anahtar kelimelerle metotun erişim seviyesi belirlenir. - Dönüş Tipi: Metotun döndüreceği veri tipi (
int,string,voidgibi). - 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]); // 1Listeler: 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şeDiğ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;
}
}