17 Ekim 2019 Perşembe

Birbirine Benzeyen 3 İfade: const, static ve readonly

     S.a. Arkadaşlar,
     Bugün herkesin bildiği ama aslında aralarında farklar bulunan 3 keywordü inceleyeceğiz: const, readonly ve static. Bu yazının çıkış noktası mülakatta bana sorulan readonly ile const arasındaki fark nedir sorusuydu. Buna ek olarak bugün const olarak tanımladığım değişkeni değiştirmek istediğimde (.net core - vs - debug mode) kodu tekrardan derlememi istedi, değişkeni daha sonra readonly yaptığımda buna gerek kalmadığını gördüm. Böylece bu konuda güzel bir toparlama yazısı yazmak istedim. Hazırsak başlayalım.

       const: Bir değişken tanımlaması sağlanır, fakat tanımlanan bu değişken daha sonra hiç bir şekilde değiştirilemez. Kesinlikle değişmeyeceğini bildiğiniz yerlerde kullanınız. En çok verilen örneklerden biridir. Mesela 7 yerine haftanın gün sayısı olarak kullanabiliriz. Bu sayede 7'nin ne anlama geldiğini daha iyi anlarız. Belki 7 örneğinde anlaması basit olabilir, fakat yine de kod içinde direk olarak rakam kullanmamakta fayda var. Farklı bir kullanım alanı da kod içinde "magic string" dediğimiz ifadeleri ayrı bir sınıfa çekip onları daha derli toplu olarak ifade edebiliriz.
   
      Ayrıca const ifadesi de static bir ifadedir, fakat static ifadeler sonradan değişebiliyor iken const'lar sabittir ve sadece tanımlandığı yerde bir kez değer ataması yapılır.

      const ifadeler sadece primative(int, double,short) değerler ile birlikte kullanılır. Referans bazlı tanımlarla birlikte kullanılamazlar. Aşağıdaki kodu inceleyebiliriz.
//Doğru kullanımı
public const int DAYS_OF_WEEK = 7;
public const string URL_BASE= "https://malikmasis.blogspot.com/"
//Yanlış kullanımı
String const STR = new String(new char[]{'s','t','r'});
     
     static: Metod, değişken veya sınıf tanımlanması için kullanılabilir, fakat dikkat edilmesi gereken şey static sınıf içine yalnızca static metod yazılır, static metod içine ise static değişkenler tanımlanmak zorundadır.
//doğru kullanımı
public class MyClass 
{
    public static string MyMethod() { ... }
}

public static class MyClass 
{
    public static string MyMethod() { ... }
}
//yanlış kullanımı
public static class MyClass 
{
    public string MyMethod() { ... }
}

     static değişkenlere veya metodlara erişirken obje oluşturmamıza gerek yoktur. Direkt olarak sınıf adı üzerinden erişebiliriz.
//doğru kullanımı
string str = MyClass.MyMethod();

//yanlış kullanımı
var myClass = new MyClass();
strig str = myClass.MyMethod();
   
     static tanımlanan öğeler her defasında oluşturmazlar, bir kere oluştururlar ve program sonunlancaya kadar yaşam döngüleri devam eder. Dikkatli kullanılmadığında belleği şişirmek tehlikeli vardır. Bu konuyla ilgili bu yazıma göz atabilirsiniz.

     readonly: değişken ile birlikte kullanılır. const ile farkı sadece tanımlandığı yerde ayrıca constructor içinde de tanımlanabilir. (injection işlemlerinde çok sık kullanılır). Constructor dışında ise tanımlanamazlar.
public class TestClass
{
    //doğru kullanımı
    public readonly string ConnectionString = "TestConnection";

    public TestClass()
    {
        ConnectionString = "DifferentConnection";
    }
    //yanlış kullanımı
    public void TestMethod ()
    {
        ConnectionString = "NewConnection";
    }
}
 
public class Logger
{
    //sık kullanımı
    public readonly ILogger _logger;

    public Logger(ILogger logger)
    {
        _logger= "logger";
    }
}
 
      Ayrıca readonly ifadeler static değillerdir. static için söylediğimiz ifadeler burada geçerli değildir. Aşağıdaki örnek static sınıf içine sadece static olan ifade tanımlanabileceğinden hata verecektir. Eğer static özellikler içeriyor olsaydı hata vermeyecekti.
public static class MyClass 
{
    public readonly string str= "derleme hatası";
    public const string STR = "derlenir";
}

     Konuyu toplaryacak olursak;
     * Asla değişmeyecek bir değişken tanımlayacaksanız const kullanın.
     * Değişip değişmeyeceğinden emin değilseniz, fakat başka yerde değişmesini istemiyorsanz readonly kullanın
     * Bir öğeye direkt olarak erişmek istiyorsanız static kullanın. (const da static'tir).

      Kaynaklar:
      https://exceptionnotfound.net/const-vs-static-vs-readonly-in-c-sharp-applications/



2 yorum: