C# Sınıf (Class), Object, Property ve Metotlar
C#’ta class, object, property ve metot kavramlarını öğrenin. Nesne yönelimli programlamanın temel yapı taşları örneklerle açıklanıyor.
Nesne Yönelimli Programlama (OOP) yaklaşımında class (sınıf), belirli bir kavramın verilerini (özellikler) ve davranışlarını (metotlar) aynı çatı altında toplayan bir şablondur. Bu şablondan oluşturulan örneklere object (nesne) denir. Veriye erişim için property’ler, davranışların tanımı için method’lar kullanılır.
Class (Sınıf) Nedir?
Sınıf, yazılımda bir kavramı ya da varlığı modellemek için kullanılan şablondur. İçinde özellikler (property), alanlar (field) ve metotlar (method) tanımlanır. Örneğin bir Ürün sınıfı, ürünün adı ve fiyatı gibi verileri saklarken, aynı zamanda “bilgiyi yazdır” gibi davranışları da barındırabilir.
public class Product
{
private decimal _price;
public string Name { get; set; } = string.Empty;
public decimal Price
{
get => _price;
set => _price = value < 0 ? 0 : value; // negatif fiyat engellendi
}
public void PrintInfo()
{
Console.WriteLine($"{Name} - {Price:0.00} TL");
}
}
Object (Nesne) Oluşturma
Sınıftan gerçek bir örnek (object) oluşturmak için new anahtar kelimesi kullanılır.
Bu işlem bellekte sınıfın tanımına uygun bir nesne yaratır.
Nesneye özellikler atanabilir ve metotları çağrılabilir.
var defter = new Product();
defter.Name = "Defter";
defter.Price = 45m;
defter.PrintInfo();
// Çıktı:
Defter - 45.00 TL
Nesneler ayrıca object initializer ile kısaca başlatılabilir:
var kalem = new Product { Name = "Kalem", Price = 12.5m };
kalem.PrintInfo();
Property Türleri
Property’ler, sınıfın içindeki verilere kontrollü erişim sağlar. Doğrudan alanlara (field) erişmek yerine property kullanmak, doğrulama ve iş kuralları eklemeye imkan tanır.
Otomatik özellikler (auto-property): Ekstra mantık gerekmiyorsa en pratik yöntemdir.
public class Customer
{
public int Id { get; set; }
public string FullName { get; set; } = string.Empty;
}
Field destekli property: İçeride özel bir alan üzerinden kontrol sağlanır.
public class Temperature
{
private double _celsius;
public double Celsius
{
get => _celsius;
set => _celsius = value;
}
public double Fahrenheit => (_celsius * 9 / 5) + 32; // yalnızca get
}
Init-only property (C# 9+): Sadece nesne oluşturulurken atanabilir, sonradan değiştirilemez.
public class User
{
public string Username { get; init; } = string.Empty;
public string Email { get; init; } = string.Empty;
}
var u = new User { Username = "ahmet", Email = "a@example.com" };
// u.Username = "mehmet"; // hata: init-only property
Metotlar (Methods)
Metotlar, nesnelerin yapabileceği işlemleri tanımlar. Parametre alabilir, dönüş değeri verebilirler. Aynı isimde fakat farklı imzalarla birden fazla metot tanımlanabilir (overloading).
public class MathUtil
{
public static int Sum(int a, int b) => a + b;
public static int Sum(int a, int b, int c) => a + b + c; // overload
}
int x = MathUtil.Sum(2, 3); // 5
int y = MathUtil.Sum(1, 2, 3); // 6
Instance metotlar bir nesne üzerinden çağrılırken, static metotlar doğrudan sınıf üzerinden çağrılır.
Erişim Belirleyiciler
C#’ta sınıfların ve üyelerinin görünürlüğü public, private, protected, internal gibi erişim belirleyiciler ile kontrol edilir:
Erişim belirleyiciler, bir sınıfın veya üyesinin (özellik, metot, alan) programın hangi bölümlerinden görülebileceğini ve kullanılabileceğini tanımlar.
Örneğin, private üyeler sadece tanımlandıkları sınıfın içinde erişilebilir; bu sayede dışarıdan doğrudan müdahale engellenir ve veri güvenliği sağlanır.
public üyeler her yerden erişilebilir, böylece sınıfın dış dünyaya açtığı kontrollü arayüzleri temsil eder.
protected üyeler sadece kendi sınıfında ve o sınıftan türeyen alt sınıflarda erişilebilir, bu da kalıtım senaryolarında esneklik sağlar.
internal üyeler aynı derleme (assembly) içinde erişilebilir, başka projelerden erişim engellenir.
Bu mekanizma, yazılımda “hangi bilginin dışarı açılacağı, hangisinin kapsül içinde kalacağı” sorusuna cevap verir;
yani sınıflar arası bağımlılıkları azaltmak, kapsülleme (encapsulation) ilkesini uygulamak ve güvenli, anlaşılır bir mimari kurmak için erişim belirleyiciler kullanılır.
- public: Her yerden erişilebilir.
- private: Yalnızca tanımlandığı sınıf içinde erişilebilir.
- protected: Kendi sınıfı ve ondan türeyen alt sınıflardan erişilebilir.
- internal: Aynı derleme (assembly) içindeki tüm sınıflar erişebilir.
public class Account
{
private decimal _balance; // sadece sınıf içinden erişilir
public decimal Balance { get; private set; } // dışarıya sadece okunur
protected string Owner { get; set; } = string.Empty; // alt sınıflar kullanabilir
internal string? Tag { get; set; } // aynı projede erişilebilir
public void Deposit(decimal amount)
{
if (amount <= 0) return;
Balance += amount;
}
}
Örnek: Basit Kütüphane Sistemi
Aşağıdaki örnekte bir Book sınıfı ve onu yöneten LibraryService sınıfı tanımlanmıştır. Bu yapı ile nesnelerin nasıl üretildiği, saklandığı ve işlendiği gösterilmektedir.
public class Book
{
public int Id { get; init; }
public string Title { get; set; } = string.Empty;
public string Author { get; set; } = string.Empty;
public void Print() => Console.WriteLine($"{Id} - {Title} ({Author})");
}
public class LibraryService
{
private readonly List<Book> _books = new();
public void Add(Book b) => _books.Add(b);
public Book? FindById(int id) => _books.FirstOrDefault(b => b.Id == id);
public void PrintAll()
{
if (_books.Count == 0)
{
Console.WriteLine("Kütüphane boş.");
return;
}
foreach (var b in _books) b.Print();
}
}
// Kullanım
var lib = new LibraryService();
lib.Add(new Book { Id = 1, Title = "Temiz Kod", Author = "Robert C. Martin" });
lib.Add(new Book { Id = 2, Title = "CLR via C#", Author = "Jeffrey Richter" });
lib.PrintAll();
TL;DR
- Class: Veri + davranışı tanımlayan şablondur.
- Object: Sınıftan üretilen somut örnektir.
- Property: Veriye kontrollü erişim sağlar (encapsulation).
- Method: Nesnenin yapabildiği işlemleri tanımlar (instance veya static olabilir).
- Erişim belirleyiciler: public, private, protected, internal ile görünürlük kontrol edilir.
Örnek: Şirket Bilgileri ve Doğrulama
Bu örnekte Company sınıfı, kullanıcıdan alınan bilgileri saklamakla kalmaz, aynı zamanda bir Validate() metodu ile doğrulama yapar.
Doğrulama sonucu özel bir ValidationResult enum’u ile döndürülür.
Böylece hangi durumda hata olduğunu daha anlaşılır şekilde kontrol etmek mümkün olur.
public enum ValidationResult
{
Success,
NameMissing,
PhoneMissing,
PhoneInvalid,
AddressMissing
}
public class Company
{
public string Name { get; set; } = string.Empty;
public string Phone { get; set; } = string.Empty;
public string Address { get; set; } = string.Empty;
public string Sector { get; set; } = string.Empty;
public void PrintInfo()
{
Console.WriteLine("=== Şirket Bilgileri ===");
Console.WriteLine($"Adı : {Name}");
Console.WriteLine($"Telefon : {Phone}");
Console.WriteLine($"Adres : {Address}");
Console.WriteLine($"Sektör : {Sector}");
}
public ValidationResult Validate()
{
if (string.IsNullOrWhiteSpace(Name))
return ValidationResult.NameMissing;
if (string.IsNullOrWhiteSpace(Phone))
return ValidationResult.PhoneMissing;
if (!Phone.All(char.IsDigit))
return ValidationResult.PhoneInvalid;
if (string.IsNullOrWhiteSpace(Address))
return ValidationResult.AddressMissing;
return ValidationResult.Success;
}
}
class Program
{
static void Main()
{
var company = new Company();
Console.Write("Şirket adını giriniz: ");
company.Name = Console.ReadLine();
Console.Write("Telefonu giriniz: ");
company.Phone = Console.ReadLine();
Console.Write("Adresi giriniz: ");
company.Address = Console.ReadLine();
Console.Write("Sektörünü giriniz: ");
company.Sector = Console.ReadLine();
var result = company.Validate();
if (result == ValidationResult.Success)
{
Console.WriteLine();
company.PrintInfo();
}
else
{
Console.WriteLine($"Hata: {result}");
}
}
}
Bu örnekte sınıfa eklenen Validate() metodu, girilen bilgilerin doğruluğunu kontrol eder ve sonucu bir enum ile döndürür.
Böylece metot sadece true/false gibi basit bir sonuç vermek yerine, hatanın nedenini açıkça belirtir.
Örneğin şirket adının girilmemesi, telefonun boş olması veya telefon bilgisinin sayılardan oluşmaması gibi durumlarda farklı değerler döndürülür.
Bu yaklaşım, hata yönetimini daha okunabilir ve bakımı kolay hale getirir.
NameMissing: Şirket adı boş bırakılmıştır.PhoneMissing: Telefon bilgisi girilmemiştir.PhoneInvalid: Telefon bilgisi sadece rakamlardan oluşmamaktadır.AddressMissing: Adres boş bırakılmıştır.Success: Tüm kontroller geçilmiş ve bilgiler doğrudur.