Ana içeriğe atla

Readonly ve Const Değişken arasındaki fark nedir ?

Bu yazımda günlük kullanımda genellikle karıştırılan tipler olan readonly ve const değişkenleri inceliyor olacağız.

Öncelikle bu tipleri temel anlamda inceleyelim.

Readonly : Gerçek zamanlı olarak uygulamamız çalışırken güncellenebilir. Fakat bu güncellenme işlemi sadece contructor da yapılabilir. Constructor metodumuzda readonly değişkeni dilediğimiz kadar güncelleyebiliriz.


Const : Sadece uygulama derleme öncesi bir değer ataması yapabilir. Sonrasında uygulama çalışması esnasında bir güncelleme yapamayız.



Kullanım Alanları 

Const : 

Genel kullanım aşağıdaki şekildedir : 

public class Urun{

const string urunBirimi = "Adet";
const bool garantiDurumu =true;

/*
.
.diğer tanımlamalarımız burada
.
*/

//constructor
public Urun(){



}//Constructor Kapanış

}//Class Kapanış





Aşağıdaki şekilde kullanımı yapamayız : 


public class Urun{


/*Burada bir hata alıyor olacağız. Atama işlemi program çalıştırılmadan önce yapılmalıdır şeklinde.*/
const string urunBirimi ;

const bool garantiDurumu =true;

/*
.
.diğer tanımlamalarımız burada
.
*/

//constructor
public Urun(){

/*burada da uygulama çalışması esnasında atama yapamadığımız için bir hata alıyor olacağız.*/
this.urunBirimi = "Kilogram";

}//Constructor Kapanış

}//Class Kapanış


Özet:
Özet olarak yalnızca uygulama bazında genel tanımlamalarımız için const değişken tiplerini kullanırız.




Readonly : 

Genel kullanım aşağıdaki şekildedir : 

public class Urun{

/*varsayılan değeri olarak Adet belirleniyor */
readonly string urunBirimi = "Adet";
readonly bool garantiDurumu =true;

/*
.
.diğer tanımlamalarımız burada
.
*/

//constructor
public Urun(string _urunBirimi, bool _garantiDurumu){

/*Constructor içerisinde ilgili class ı oluştururken değer ataması yapabilir class ın hareket durumları ve tanımlama birimini belirleyebilirsiniz. */
this.urunBirimi = _urunBirimi;
this. garantiDurumu =  _garantiDurumu;

}//Constructor Kapanış

}//Class Kapanış





Aşağıdaki şekilde kullanımı yapamayız : 


public class Urun{

readonly string urunBirimi ;

readonly bool garantiDurumu =true;
readonly urunAdi;

/*
.
.diğer tanımlamalarımız burada
.
*/

//constructor
public Urun() {

//constructor içerisinde tanımlama yapabiliyoruz..
this.urunBirimi = "Kilogram";

}//Constructor Kapanış


public UrunEkle(string urunAdi,string urunBirimi, string garantiDurumu){
this. urunAdi = urunAdi;


/*Aşağıdaki iki atama işleminde hata alıyor olacağız. Çünkü readonly değişkenler constructor dışında değiştirilemezler.*/
this.urunBirimi = urunBirimi;
this.garantiDurumu  = garantiDurumu;

}


}//Class Kapanış


Özet:
Özet olarak uygulamamız içerisinde class nesne örneklerinin oluşturulmaları esnasında nesnelerin kimliklerini ve hareket kabiliyetlerini belirlemek istiyor ve sonrasında uygulama akışında ilgili değişkenlerin değiştirilmemesini istiyor isek readonly değişkenleri kullanabiliriz.

Readonly ve Const Arasındaki Temel Farklar

 - Const tipine sadece tanımlama sırasında değer atanır, readonly tiplerine tanımlanırken ve constructor metodları içerisinde değer ataması yapılabilir.

 - Const tipleri metodlar içerisinde tanımlanabilir, fakat readonly tiplerini metodlar içeirsinde tanımlayamayız.

 - Const tipini statik anahtar kelimesi ile statik metod ve tanımlama olarak kullanamayız fakat readonly tipleri statik olarakta kullanabiliriz.

 - Const tipleri sadece derleme aşamasında tanımlanan sabitlerdir, readonly tipleri uygulama çalışma zamanında tanımlanan sabitlerdir.



Örnek : (Dependency Injection,  Readonly Değişken Kullanımı)

Biraz daha üst seviye bir örnek vermek gerekir ise Dependency Injection Design Pattern ını implemente ederken, soyut tipleri sadece constructor da değiştirmemiz ve uygulamanın geri kalanında ilgili değişkenlerin değiştirilmemesi gerekir. Bunun için readonly değişkenleri kullanabiliriz.


public interface IDBUrun{

void Ekle(string urunAdi);

void Guncelle(string urunAdi, string urunDurumu);

void Sil(string urunAdi);

}//Class Kapanış



public class DBUrun : IDBUrun {

void Ekle(string urunAdi){

//ürün ekleme kodları
}

void Guncelle(string urunAdi, string urunDurumu){

//ürün Güncelleme kodları
}

void Sil(string urunAdi){

////ürün silme kodları
}



}//Class Kapanış



public class Urun{

private readonly IDBUrun dbUrunIslem = null;


//constructor
public Urun(IDBUrun _IDBUrun){

//dependency injection ile constructor da ilgili soyut class ımızı implemente ediyoruz.
this.dbUrunIslem = _IDBUrun;

}


void UrunEkle(string urunAdi){

//dependency injection ile elde ettiğimiz class ımızın ekle metodunu kullanıyoruz.
this. dbUrunIslem.Ekle(urunAdi);

}


}//Class Kapanış














Bu blogdaki popüler yayınlar

Cannot resolve the collation conflict between "Turkish_CI_AS" and "SQL_Latin1_General_CP1_CI_AS" in the equal to operation.

iki ayrı veri tabanı içindeki tablolar ile işlem yapılmak istendiğinde eğer dil sorunu çıkıyor ise sorgumuzun sonuna 'COLLATE TURKISH_CI_AS' sözcüğünü ekleyerek sorunu çözebiliriz.Örnek : SELECT * FROM veritabani1.dbo.URUN u1 INNER JOIN veritabani2.dbo.URUNLER u2 ON u1.kod = u2.kod COLLATE TURKISH_CI_AS umarım faydalı olmuştur.

IEnumerable ile List Arasındaki Farklar

Sık kullandığımız iki tip olan IEnumerable ve List tipleri ile ilgili sürekli kullanılmasına rağmen farkının çok bilinmediğini düşünerek bu konuda kısa bir yazı yazmak istedim. Bakalım aralarında farklar nelermiş. IEnumerable bir interface iken, List yine IEnumerable sınıftan türeyen somut ( concrete) bir sınıftır. Arasındaki Farklar :  IEnumerable  - List e göre iteration çok daha hızlıdır. Performans için kullanılabilir.  - Read Only bir tip olduğu için Add, Remove gibi işlemler yapılamaz, IEnumerable ile sadece iteration, sort, filter gibi işlemler yapılabilir.  - Soyut bir class olduğu için istenen tipe somutlaştırılabilir.  - yield tipi ile birlikte kullanılabilir.(Promise veri döndürme,state-machine liste kullanımı)  - Linq sorguları veri tabanı sorgularınızın cevaplarınızı IEnumerable olarak döndürür, bu size siz ilgili IEnumerable list i iterate edene kadar ilgili sorguyu çalıştırmama performansı verir, böylece ilgili listeyi kullanmaya ihtiyacınız olmadığı bir durumda yada k

Logo (LOJECTS.exe ve LOBJECTS.dll) Register İşlemleri

LOBJECTS.dll register işlemi : başlat-> çalıştır -> cmd yazıp konsole ekranına geçiyoruz REGİSTER İÇİN : regsvr32 logoDosyaYolu\LOBJECTS.dll yazıyoruz ve dll imizi register ediyoruz UNREGISTER İÇİN : regsvr32 -u logoDosyaYolu\LOBJECTS.dll ile de unregister edebiliriz. LOBJECTS.exe register işlemi : başlat-> çalıştır -> cmd yazıp konsole ekranına geçiyoruz REGİSTER İÇİN : logoDosyaYolu\LOBJECTS.exe -REGSERVER yazıyoruz ve LOBJECTS.exe mizi register ediyoruz. UNREGISTER İÇİN : logoDosyaYolu\LOBJECTS.exe -UNREGSERVER yazıyoruz ve LOBJECTS.exe mizi unregister ediyoruz. Umarım yararlı olmuştur.