C# Properties
Property’ler kaynak kodun basit bir syntax kullanarak metot çağırmasına izin verir. CLR iki çeşit property sunar: parametresiz property, basit property olarak adlandırılan, ve her dilde adı farklı olan parametreli property. Örneğin C#’ta parametreli property’lere Indexer denir. Visual Basic’te default property denir. Property’ler field alanlarını veri yazma ve okuma işlemlerine esneklik kazandıran birer metotlardır. Dolayısıyla Encapsülation’i daha kolay kılmaktadır. Ayrıca property’lerde field olarak kullanılabilir. Property’lerin tanımı aşağıdaki imza gibi yapılır.
Access-Identifier <type> < Property Name >
{
Get
{
Return
<var> ;
}
Set
{
If(Is Valid(Value))
<var > = Value;
}
}
Yukarıdaki örnekte “var” değişkeni field’i temsil eder. O yüzden C#’ta Prop ile Property kavramlarını karıştırmamak lazım. Property işlemlerini bir field üzeriden yaparken, Prop’te bir field tanımlamaya gerek yoktur. Compiler kendisi bir property adında bir private field oluşturur. Bu tarz property’lere Auto-Implemented property denir. Bu da C# dilinin sağladığı avantajlardan birisi. Aşağıda iki farklı kullanımı gösterelim.
Property kullanımı:
public class Tren
{
private int vagonSayisi; // genellikle field küçük harfle yazılır.
public int VagonSayisi // fieldi kapsülleyen Prop Büyük harfle yazılır.
{
get
{
return this.vagonSayisi;
}
set
{
this.vagonSayisi = value;
}
}
}
Auto-İpmlemented Property Kullanımı:
public class Tren
{
// Burada direk get set işlemi ile MaxHizi üzerinden işlem yapabilmekteyiz.
// Compiler arka tarafta zaten bir field oluşturuyor.
public int MaxHizi { get; set; }
}
Property Çeşitleri
C#’ta kullanım amaçlarına göre tanımlanabilecek 5 farklı property çeşidi vardır.
- Read-Write Property
- Read-Only Property
- Static Property
- Indexer Property
- Init-Only Property
Read-Write Property
Read-write property adı üstünde hem yazılıp hemde okunabilen property’dir. Yani hem get hemde set işlemi yapabilen property’dir.
public class Tren
{
public int MaxHizi { get; set; } // Burada get ve set işlemi yapılabiliyor.
}
Read-Only Property
Sadece okunabilen bir property’dir. Herhangi bir veri set edilmez. Genelde bu property’lere constructor metodlarında değer ataması yapılır.
public class Tren
{
public Tren(int genislik)
{
this.Genislik = genislik;
}
public int Genislik { get; }
}
Tren tren = new Tre(3);
Console.Writeline(tren.Genislik); // 3 değerini yazacaktır
tren.Genislik=5; // Hata verecektir sadece readonly
Static Property
Statik property sadece sınıfın static olan elemanlarına erişebilir. Statik property object ten ziyade sınıfıa bağlıdır. Bütün statik sınıf ile ilgili kurallar statik property içinde geçerlidir.
public class Tren
{
public static int koltukSayisi;
public static int KoltukSayisi
{
get
{
return koltukSayisi;
}
set
{
koltukSayisi = value;
}
}
}
Indexer Property
Indexer’lar bir sınıfın veya struct’in içindeki collection’a dizi gibi erişilmesini sağlayan özel property’lerdir. Indexer’lar aynı property’ler gibi tanımlanır. Fakat geri dönüş tipinden sonra this kelimesi ve [] parantezler vardır.
<return type> this[<parameter type> index]
{
get{
// return the value from the specified index of an internal collection
}
set{
// set values at the specified index in an internal collection
}
}
Bir sınıfın kendine ait koleksiyonundaki verileri get ve set etmek için kullanılar Indexer property örneği.
class StringDataStore
{
private string[] strArr = new string[10]; // internal data storage
public string this[int index]
{
get
{
if (index < 0 || index >= strArr.Length)
throw new IndexOutOfRangeException("Index out of range");
return strArr[index];
}
set
{
if (index < 0 || index >= strArr.Length)
throw new IndexOutOfRangeException("Index out of range");
strArr[index] = value;
}
}
}
Init-Only Property
Init only propery’lerde sadece object initializer esnasında değer taması yapılabilmesini sağlar.
public class Tren
{
public string Isim { get; init; } = "Kara Tren";
}
Tren tren = new()
{
Isim = "Doğu Exspresi",
};
Property’ler, bir sınıfın dışındaki kod tarafından kullanılarak nesnenin durumunu okuma ve yazma işlemlerini basitleştirebilir. Ayrıca, özellikle bir nesnenin durumunun değiştirilmesi veya okunmasıyla ilgili özel işlemler gerçekleştirilmesi gerektiğinde kullanışlıdır. Property’ler, C# ve .NET platformunda sıkça kullanılan ve önemli bir bileşendir.
Yararlanılan kaynaklar:
Microsoft CLR via C# Fourth Edition kitabı.