Statik Alanlar ve Metotlar
Coddy'nin C# Journey'sinin Nesne Yönelimli Programlama bölümünün bir parçası — ders 12 / 70.
Şu ana kadar oluşturduğumuz her alan ve metot, bireysel nesnelere aittir. Ancak bazen, tüm örnekler arasında paylaşılan ve sınıfın kendisine ait olan verilere veya davranışlara ihtiyaç duyarsınız. İşte burada static anahtar kelimesi devreye girer.
Bir statik alan, bir sınıfın tüm nesneleri tarafından paylaşılır. Kaç tane örnek oluşturursanız oluşturun, yalnızca tek bir kopya vardır:
public class Player
{
public static int TotalPlayers = 0;
public string Name { get; set; }
public Player(string name)
{
Name = name;
TotalPlayers++;
}
}Her yeni Player oluşturulduğunda, TotalPlayers artar. Tüm oyuncular bu aynı sayacı paylaşır.
Bir statik metot sınıfa aittir ve bir nesne oluşturulmadan çağrılabilir:
public class Calculator
{
public static int Add(int a, int b)
{
return a + b;
}
}
// Bir örnek üzerinde değil, sınıf üzerinde çağrılır
int result = Calculator.Add(5, 3);Statik üyelere bir nesne referansı kullanarak değil, sınıf adını kullanarak eriştiğinize dikkat edin. Statik metotlar, herhangi bir özel nesneye ait olmadıkları için örnek alanlarına (instance fields) erişemezler veya this anahtar kelimesini kullanamazlar.
Farkında olmadan statik üyeleri zaten kullandınız. Console.WriteLine() statik bir metottur ve Math.PI statik bir alandır.
Görev
KolayUygulamanız genelinde verilen tüm siparişleri takip etmek için statik üyeleri kullanan bir sipariş takip sistemi oluşturalım.
Kodunuzu düzenlemek için iki dosya oluşturacaksınız:
Order.cs:OrderSystemad alanı (namespace) içinde birOrdersınıfı tanımlayın. Her siparişin bir örnek özelliği (instance property) olanOrderId(int) veCustomerName(string) olmalıdır. Sınıf ayrıca, statik bir alan olanTotalOrderskullanarak oluşturulan toplam sipariş sayısını takip etmeli ve bir sonraki müsait sipariş kimliğini (1'den başlayarak) döndüren statik bir yöntem olanGetNextOrderId()sağlamalıdır. Yapıcı metot (constructor) bir müşteri adı kabul etmeli, statik yöntemi kullanarak sipariş kimliğini otomatik olarak atamalı ve toplam sipariş sayısını artırmalıdır.Program.cs: Ana dosyanızda, girdilere dayalı siparişler oluşturun ve bunların ayrıntılarını toplam sipariş sayısıyla birlikte görüntüleyin.
İki ayrı sipariş için müşteri adlarını temsil eden iki girdi alacaksınız.
Her sipariş için ayrıntıları şu formatta yazdırın:
Order #{OrderId} - Customer: {CustomerName}Her iki siparişi de oluşturduktan sonra toplam sayıyı yazdırın:
Total Orders: {TotalOrders}Örneğin, girdiler Alice ve Bob ise, çıktı şöyle olmalıdır:
Order #1 - Customer: Alice
Order #2 - Customer: Bob
Total Orders: 2Kopya kağıdı
static anahtar kelimesi, tek tek örneklere (instance) değil, sınıfın kendisine ait olan üyeler oluşturur.
Statik alanlar (Static fields), bir sınıfın tüm nesneleri arasında paylaşılır. Kaç tane örnek oluşturulduğuna bakılmaksızın yalnızca bir kopya mevcuttur:
public class Player
{
public static int TotalPlayers = 0;
public string Name { get; set; }
public Player(string name)
{
Name = name;
TotalPlayers++;
}
}Statik metotlar (Static methods) sınıfa aittir ve bir nesne oluşturulmadan çağrılabilirler:
public class Calculator
{
public static int Add(int a, int b)
{
return a + b;
}
}
// Bir örnek üzerinde değil, sınıf üzerinde çağrılır
int result = Calculator.Add(5, 3);Statik üyelere bir nesne referansı ile değil, sınıf adı kullanılarak erişilir. Statik metotlar, herhangi bir belirli nesneye ait olmadıkları için örnek alanlarına (instance fields) erişemezler veya this anahtar kelimesini kullanamazlar.
Statik üyelerin yaygın örnekleri arasında Console.WriteLine() (statik metot) ve Math.PI (statik alan) bulunur.
Kendin dene
using System;
using OrderSystem;
class Program
{
public static void Main(string[] args)
{
// Müşteri adlarını oku
string customer1 = Console.ReadLine();
string customer2 = Console.ReadLine();
// TODO: Müşteri adlarıyla iki Order nesnesi oluşturun
// TODO: Her siparişin ayrıntılarını şu formatta yazdırın:
// Order #{OrderId} - Customer: {CustomerName}
// TODO: Toplam sipariş sayısını şu formatta yazdırın:
// Total Orders: {TotalOrders}
}
}
Bu ders kısa bir quiz içerir. Soruları yanıtlamak ve ilerlemeni kaydetmek için derse başla.
Nesne Yönelimli Programlama bölümündeki tüm dersler
1OOP Temelleri
Harici Dosyalarİsim Alanları ve YönergelerSınıf ve Nesnelere Giriş'this' Anahtar KelimesiMetotlar ve ParametrelerAlanlar ve ÖzelliklerYapıcı MetotlarNesne BaşlatıcılarÖzet - Basit Hesap Makinesi4Kalıtım
Temel Kalıtım (:) Sözdizimi'base' Anahtar KelimesiVirtual ve Override Anahtar KelimeleriSealed Sınıflar'object' Temel SınıfıÖzet - Çalışan Hiyerarşisi7İleri Düzey Özellikler
Operatör Aşırı Yüklemeİndeksleyiciler (this[])ToString() Geçersiz KılmaGenişletme MetotlarıÖzet - Özel Liste10Tasarım Kalıpları Bölüm 1
Tasarım Kalıplarına GirişThread-Safe SingletonFactory KalıbıObserver Kalıbı (Olaylar)Strategy Kalıbı2Özellikler ve Statik Üyeler
Otomatik Uygulanan ÖzelliklerSadece Okunur/Yazılır ÖzelliklerStatik Alanlar ve MetotlarStatik Sınıflarİfade Gövdeli Üyeler5Polimorfizm ve Arayüzler
Derleme vs Çalışma Zamanı PolimorfizmiArayüz vs Soyut SınıfÇoklu ArayüzlerBelirgin ArayüzlerUpcasting ve DowncastingÖzet - Şekil Hesaplayıcı8İleri Düzey OOP Kavramları
Kalıtım yerine KompozisyonGenerics (Sınıflar ve Metotlar)Delegates ve EventlerAttributes ve ReflectionIDisposable ve using İfadesiDependency Injection Temelleri11Tasarım Kalıpları Bölüm 2
Komut KalıbıAdaptör KalıbıDekoratör KalıbıŞablon Metot KalıbıDurum KalıbıKompozit Kalıbı3Sınıf Mimarisi
Örnek vs Statik Veri'readonly' ve 'const' Anahtar KelimeleriDestekleyici Alanlar (Backing Fields)Özet - Banka Hesabı Yöneticisi6Kapsülleme
Erişim BelirleyicilerKapsülleme için ÖzelliklerVeri Gizleme UygulamasıDeğişmezlik KalıplarıÖzet - Öğrenci Kayıtları