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.
Görev
KolayVerilerin 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:Sensorsad alanı (namespace) içinde birTemperatureSensorsı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:_locationyedek alanına sahip birLocationözelliği (string). Konum ayarlanırken, değer null veya boşsa bunun yerine"Unknown"değerini saklayın._temperatureyedek alanına sahip birTemperatureözelliği (double). Sıcaklık ayarlanırken, değeri-50ile150arası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) + 32formülünü kullanarak Fahrenhayt cinsinden hesaplayan ve döndüren salt okunur birTemperatureFahrenheitö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)"
}
}
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ı