Birbirine Benzeyen 3 İfade: const, static ve readonly

Malik Masis
SDTR
Published in
3 min readOct 18, 2019

S.a. Arkadaşlar,
Bugün herkesin bildiği ama aslında aralarında farklar bulunan 3 keywordü inceleyeceğiz: const, static ve readonly. 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 (const, static bir ifade olduğunu unutmamak gerekir.). 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. 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 sonlanıncaya kadar yaşam döngüleri devam eder. Dikkatli kullanılmadığında belleği şişirme tehlikesi 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 değil, 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 ifadeler için söylediklerimiz deler burada geçerli değildir. Aşağıdaki örnekte static sınıf içine sadece static olan ifade tanımlanabileceğinden readonly tanımlaması 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"; // const static'tir.
}

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 istemiyorsanız 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/

Kullandıklarımızı daha bilinçli anlamak dileğiyle…

Originally published at https://malikmasis.blogspot.com.

--

--