Menu
Coddy logo textTech

Destekleyici Alanlar (Backing Fields)

Coddy'nin C# Journey'sinin Nesne Yönelimli Programlama bölümünün bir parçası — ders 17 / 70.

Otomatik uygulanan özellikler (auto-implemented properties) kullanışlıdır, ancak bazen bir özelliğin değerini nasıl sakladığı veya aldığı üzerinde daha fazla kontrole ihtiyaç duyarsınız. İşte burada yedekleme alanları (backing fields) devreye girer. Bir yedekleme alanı, bir özelliğin gerçek verilerini saklayan özel (private) bir alandır.

public class Product
{
    private decimal _price;  // Destekleyici alan
    
    public decimal Price
    {
        get { return _price; }
        set { _price = value; }
    }
}

Bu, otomatik özelliklere (auto-properties) kıyasla fazladan iş gibi görünebilir, ancak destekleyici alanlar (backing fields) mantık eklemenize olanak tanır. Örneğin, verileri depolamadan önce doğrulayabilirsiniz:

public class Product
{
    private decimal _price;
    
    public decimal Price
    {
        get => _price;
        set => _price = value < 0 ? 0 : value;
    }
}

Artık negatif fiyatlar otomatik olarak sıfır olur. Ayrıca okuma veya yazma sırasında verileri dönüştürebilir, değişiklikleri günlüğe kaydedebilir veya diğer eylemleri tetikleyebilirsiniz.

Backing field adlandırma kuralı, onu özellikten (property) ayırt etmek için genellikle bir alt çizgi öneki (_price) veya küçük harf (price) kullanır.

public decimal Price { get; set; } gibi otomatik uygulanan özellikleri kullandığınızda, derleyici aslında sizin için gizli bir yedek alan (backing field) oluşturur. Açık yedek alanlar (explicit backing fields), davranış üzerinde tam kontrol sağlayarak size aynı depolamayı sunar.

challenge icon

Görev

Kolay

Verilerin saklanırken ve alınırken doğrulanması ve dönüştürülmesi için yedek alanlar (backing fields) kullanan bir sıcaklık sensörü sistemi oluşturalım.

Kodunuzu düzenlemek için iki dosya oluşturacaksınız:

  • TemperatureSensor.cs: Sensors ad alanı (namespace) içinde bir TemperatureSensor sınıfı tanımlayın. Bu sensör sıcaklığı Santigrat (Celsius) cinsinden ölçer, ancak okumaların geçerli sınırlar içinde kaldığından emin olmamız gerekir. Aşağıdakileri uygulamak için yedek alanlar kullanın:
    • _location yedek alanına sahip bir Location özelliği (string). Konum ayarlanırken, değer null veya boşsa bunun yerine "Unknown" değerini saklayın.
    • _temperature yedek alanına sahip bir Temperature özelliği (double). Sıcaklık ayarlanırken, değeri -50 ile 150 arasında sınırlayın (eğer -50'den düşükse -50 saklayın; 150'den yüksekse 150 saklayın).
    • Sıcaklığı (celsius * 9 / 5) + 32 formülünü kullanarak Fahrenhayt cinsinden hesaplayan ve döndüren salt okunur bir TemperatureFahrenheit özelliği. Bu özellik doğrudan yedek alanı kullanmalıdır.
    • Konum ve başlangıç sıcaklık değerlerini kabul eden bir yapıcı metot (constructor).
  • Program.cs: Ana dosyanızda, giriş değerlerini kullanarak bir sensör oluşturun ve okumalarını görüntüleyin. Ardından sıcaklığı ikinci bir giriş değeriyle güncelleyin ve güncellenmiş okumaları gösterin.

Üç giriş alacaksınız:

  • Sensör konumu
  • Başlangıç sıcaklık okuması
  • Güncellenmiş sıcaklık okuması

Çıktıyı şu formatta yazdırın:

Sensor: {Location}
Temperature: {Temperature}C ({TemperatureFahrenheit}F)
Updated Temperature: {Temperature}C ({TemperatureFahrenheit}F)

Örneğin, girişler Lab Room, 25 ve 200 ise çıktı şu şekilde olmalıdır:

Sensor: Lab Room
Temperature: 25C (77F)
Updated Temperature: 150C (302F)

İkinci okuma olan 200 değerinin, maksimum geçerli sıcaklığı aştığı için nasıl 150 değerine sınırlandığına dikkat edin. Yedek alanlarınız size verilerin nasıl saklandığı üzerinde bu kontrolü sağlar!

Kopya kağıdı

Bir backing field (destekleyici alan), bir özelliğin (property) gerçek verilerini depolayan ve değerleri alma (get) ve ayarlama (set) işlemleri için özel mantık eklemenize olanak tanıyan özel (private) bir alandır.

Temel Backing Field Sözdizimi

public class Product
{
    private decimal _price;  // Backing field
    
    public decimal Price
    {
        get { return _price; }
        set { _price = value; }
    }
}

İfade Gövdeli (Expression-Bodied) Sözdizimi

public decimal Price
{
    get => _price;
    set => _price = value;
}

Doğrulama Mantığı Ekleme

Backing field'lar, verileri depolamadan önce doğrulamanıza veya dönüştürmenize olanak tanır:

private decimal _price;

public decimal Price
{
    get => _price;
    set => _price = value < 0 ? 0 : value;  // Negatif fiyatları önle
}

Adlandırma Kuralı

Backing field'lar, onları özellik adından ayırt etmek için genellikle bir alt çizgi öneki (_price) veya küçük harf (price) kullanır.

Otomatik Özellikler (Auto-Properties) ve Backing Field'lar Karşılaştırması

public decimal Price { get; set; } gibi otomatik olarak uygulanan özellikler, otomatik olarak gizli bir backing field oluşturur. Açıkça tanımlanmış backing field'lar, davranış üzerinde tam kontrol sahibi olmanızı sağlayarak aynı depolama alanını sunar.

Kendin dene

using System;
using Sensors;

class Program
{
    public static void Main(string[] args)
    {
        // Girdileri oku
        string location = Console.ReadLine();
        double initialTemp = Convert.ToDouble(Console.ReadLine());
        double updatedTemp = Convert.ToDouble(Console.ReadLine());

        // TODO: Konum ve başlangıç sıcaklığı ile bir TemperatureSensor oluşturun

        // TODO: Sensör konumunu ve başlangıç sıcaklık değerlerini yazdırın
        // Format: "Sensor: {Location}"
        // Format: "Temperature: {Temperature}C ({TemperatureFahrenheit}F)"

        // TODO: Sensörün sıcaklığını güncellenmiş değerle güncelleyin

        // TODO: Güncellenmiş sıcaklık değerlerini yazdırın
        // Format: "Updated Temperature: {Temperature}C ({TemperatureFahrenheit}F)"
    }
}
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