C#’ın Pek Bilinmeyen 10 Özelliği

By -

C#’ı yalayıp yuttum ben! Daha ne öğreneyim!?!!

Kullandığımız programlama dili ne olursa olsun, dile ne kadar aşina olursak olalım daima bir işi daha iyi yapmanın yeni yollarını keşfediyoruz.

"Biri cahil mi dedi?"

“Biri cahil mi dedi?”

“Tamam, ben her şeyi öğrendim” diyecek kadar cahil cesaretine ulaşmadığımız sürece de keşifler bitmek bilmeyecek.

Peki sürekli kullandığımız C#’ta neleri gözden kaçırıyoruz? İşimizi daha da kolaylaştıracak, okunabilirliği arttıracak, bize ilgi ve şefkat gösterecek ne gibi özellikler var?

Madde madde bakalım neleri bilmiyoruz:

1. Değişken isimlerinde @ karakteri ile rezerve isimler kullanılabilir

Zorunlu bir durumdan dolayı bir değişkenin ismini “string” koymanız mı gerekiyor? (Böyle bir şey niye başıma gelsin ki?)

Merak etmeyin yolu var! Değişkenin önüne @ işareti koymanız yeterli:

private string @string;

Tebrikler! Artık nur topu gibi string tipinde bir string‘iniz var.

2. “default” ile generic tiplerde varsayılan değerin atamasını sağlayabilirsiniz

T t = default(T);

T referans tipiyse null, int ise 0, boolean ise false atanacaktır.

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

Aşağıdaki kod tanıdık geldi mi?

string fullPath = mainPath + "\\" + fileName;

Artık buna ihtiyacınız yok!

string fullPath = System.IO.Path.Combine(mainPath, fileName)

Böyle daha güzel.

4. Lokal namespace dışında tanımlanan bir sınıfa ismiyle erişemiyor musunuz? Korkmayın “global::” bu günler için!

using System;

class Test
{
    public void test()
    {
        Console.WriteLine("Test 1");
    }
}

namespace TestNamespace
{
    class Test
    {
        public void test()
        {
            Console.WriteLine("Test 2");
        }
    }

    class Program
    {
        protected static global::Test testObj1 = new global::Test();

        static void Main(string[] args)
        {
            testObj1.test(); //Test 1 yazar
            Test testObj2 = new Test();
            testObj2.test(); //Test 2 yazar
        }
    }
}

5. “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!

6. “as” ile casting esnasında Exception fırlatılmasının önüne geçebilirsiniz!

“as” keyword’ü ile casting esnasında Exception fırlatabilme ihtimali olan satırlarda “null” döndürülmesini sağlayabilirsiniz!

//Casting esnasında hata oluşursa testObj'a null atanacaktır
TestClass testObj = notTestObj as TestClass;

7. “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

8. String’lerinizi tek hamlede kontrol edin: “String.IsNullOrEmpty()” ile kolayca boş değer ve null kontrolü!

Ne gerek var buna:

if(strVal != null && strVal != "")
{
    ...
}

Şu varken:

if(String.IsNullOrEmpty(strVal) == false)
{
    ...
}

9. “yield” ile iterasyon esnasında enumerator objelerin değerlerini atayabilirsiniz

İteras… enumerator ob… ne!??

Örnekle göstersek daha mantıklı olacak sanırım:

using System;
using System.Collections;
public class List
{
    public static IEnumerable Power(int number, int exponent)
    {
        int counter = 0;
        int result = 1;
        while (counter++ < exponent)
        {
            result = result * number;
            yield return result;
        }
    }

    static void Main()
    {
        foreach (int i in Power(2, 8))
        {
            Console.Write("{0} ", i);
        }
    }
}

//Çıktı: 2 4 8 16 32 64 128 256

10. Generic sınıflara “where” ile sınırlama getirmek

Generic sınıflara “new” ile sınırlama getirerek generic sınıflara parametresiz, public constructor’a sahip olma koşulu koyabilirsiniz:

public class TooGenericToHandle<T> where T : IVeryGeneric, new()
{
    //Generic sınıfa gelecek olan sınıf IVeryGeneric'i implement etmeli 
    //ve parametresiz constructor'a sahip olmalı koşulunu verdik
}

E güzelmiş, işime yarar bunlar!

E harika! Hazır bilgiler tazeyken merak ettiklerinizi test etmekte fayda var.

İyi kodlamalar!