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.
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.
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.
- 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.
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ış
Ö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ış