C#’ın fazla bilinmeyen bir kaç özelliği

1. Değişken isimlerinde @ karakteri ile rezerve isimler kullanılabilir
Değişkenin önüne @ işareti koymanız yeterli:

private string @string;

2. “default” ile generic tiplerde varsayılan değerin atamasını sağlayabilirsiniz.
T referans tipiyse null, int ise 0, boolean ise false atanacaktır.

T t = default(T);

3. Dosya yollarını “System.IO.Path.Combine()” ile birleştirebilirsiniz.

string fullPath = mainPath + "\\" + fileName;
//Yerine 
string fullPath = System.IO.Path.Combine(mainPath, fileName)

4.“Environment.NewLine” yeni satıra geçmek için gereken “escape karakteri”ni döndürür.

Uygulamanın çalıştığı ortamda yeni satır karakteri neyse Environment.NewLine bu karakteri döndürür. Böylelikle ortamdaki yeni satır karakteri “\n” miydi “\r\n” miydi diye kara kara düşünmemize gerek kalmaz!

5.“Coalescing operator” ile kolay null kontrolü
Aşağıdaki örnekte, test string’ine testStr1‘in değeri null değilse atanacak, şayet null ise testStr2 atanacaktır. Eğer testStr2 de null ise boş string ataması yapılacaktır. (Deneyerek görmeniz, bu cümleleri okuyup anlamanızdan çok daha kolay olacaktır gibi geliyor bana

string test = testStr1 ?? testStr2 ?? string.Empty

6. yield iterasyon oluşturmak için kullanılır.
Compiler yield anahtar sözcüğünü gördüğü anda bu keywordün bulunduğu bloğun bir iterator bloğu olduğunu algılamaktadır. Bu adımdan sonra foreach döngüsü içerisinde ilgili koleksiyonu dönen metod çağrıldıktan sonra metod içerisindeki bir yield return ifadesine gelinince değer geriye dönülmekte ve bu işlem yapılmadan önce Compiler, iterator metodun kaldığı yeri saklamaktadır. Süreç esnasında foreach döngüsünde iterator metoduna gelen her istekte iterator metot baştan başlamak yerine kaldığı yerden işletilmektedir.
yield anahtar sözcüğünü aşağıdaki gibi iki farklı şekilde kullanabilmekteyiz.

yield return [value]
yield break

“yield return [value]” kullanımı ile yukarıdaki örneklendirmemizde olduğu gibi çalışabilmekteyiz. Lakin “yield break” ifadesi ile iterator içerisindeki iterasyonun sona erdiği bilgisi ilgili foreach döngüsüne bildirilmektedir. Aşağıdaki kod parçacığı bu durumu örneklendirmektedir.

static public IEnumerable VerileriGetir()
{
    yield return "Pazartesi";
    yield return "Salı";
    yield return "Çarşamba";
    yield return "Perşembe";
    yield return "Cuma";
    yield return "Cumartesi";
    yield break;
    yield return "Pazar";
}

static void Main(string[] args)
{
    foreach (var Gun in VerileriGetir())
        Console.WriteLine(Gun);
 
    Console.Read();
}

“yield break” ifadesinden dolayı ilgili foreach iterasyonun sona erdiğini bilecek ve “Pazar” değerini yazdırmayacaktır.
Son olarak, yield keywordü kullanılan iterator bir metot, foreach için evaluate edilmediği sürece yield komutu ilgili metodu çalıştırmayacaktır.
Yani VerileriGetir() değerlerini bir değişkene atarsak sadece methodu referans göstermiş oluruz, Method içerisine sadece döngü esnasında girecektir.

static void Main(string[] args)
{
    IEnumerable Veriler = VerileriGetir();
 
    foreach (var item in Veriler)
        Console.WriteLine(item);
}

Bu örnekte “Veriler” değişkeninin içinde foreach döngüsüne gelmeden önce hiçbirşey olmayacaktır. Ne zaman ki döngüye girilecek, o zaman VerileriGetir metodu çalıştırılacaktır. Yani istemci tarafından ne zaman foreach döngüsüyle çağrılırsa bir anlamda yield lazy loading yapmış olacaktır.