Menu
Coddy logo textTech

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.

challenge icon

Görev

Kolay

Uygulamanı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: OrderSystem ad alanı (namespace) içinde bir Order sınıfı tanımlayın. Her siparişin bir örnek özelliği (instance property) olan OrderId (int) ve CustomerName (string) olmalıdır. Sınıf ayrıca, statik bir alan olan TotalOrders kullanarak 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 olan GetNextOrderId() 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: 2

Kopya 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}
    }
}
quiz iconKendini test et

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