C# ile bir özelliği(property) kendine set ettirmek

Merhaba arkadaşlar, bu yazıda C# özelliklerde (property) sık yapılması mümkün olan hatalı bir durumu inceleyeceğiz.

Visual Studio 2012 (.NET 4.5) üzerinde konsol uygulaması (console application) üzerinde denememi yaptım.Aşağıda kodları inceleyelim.

c-property-kendine-set-1

Projemizi F5 ile çalıştırdığımızda:

c-property-kendine-set-2

 

Gördüğünüz gibi  çalışma zamanında (runtime) StackOverflow istisnası fırlattı.

Buradaki ilginç olan aslında;

public string Ad { get; set; }” bu tanımlama ile sıkıntı yaratmayan çalışma zamanı neden

public string Ad3 { get { return Ad3; } set { Ad3 = value; } }”  bu tanımlamaya tepki gösteriyor ? Halbuki derleme zamanında hata almıyoruz. Baktığımızda ikisi de aynı mantıkta çalışması gerekiyor. Yani varsayılan olarak yapması gerekenleri içine yazıyoruz. Sırf kendine set ettirmek istediğimiz için böyle bir hata veriyor. CLR, arka tarafta geçici bir değişken üretmesi gerekirken böyle bir durumla bizi karşı karşıya bırakıyor.

Projemizi debug ettiğimiz zaman VS 2012 içindeki Call Stack penceresi aşağıdaki satırları yansıtıp uygulamamızı kapatmaktadır.

 

cPropertyKendineSet.exe!cPropertyKendineSet.Kisi.Ad3.set(string value) Line 18 + 0xffffffec bytes	C#
 	cPropertyKendineSet.exe!cPropertyKendineSet.Kisi.Ad3.set(string value) Line 18 + 0xc bytes	C#
 	cPropertyKendineSet.exe!cPropertyKendineSet.Kisi.Ad3.set(string value) Line 18 + 0xc bytes	C#
 	cPropertyKendineSet.exe!cPropertyKendineSet.Kisi.Ad3.set(string value) Line 18 + 0xc bytes	C#
 	cPropertyKendineSet.exe!cPropertyKendineSet.Kisi.Ad3.set(string value) Line 18 + 0xc bytes	C#
 	cPropertyKendineSet.exe!cPropertyKendineSet.Kisi.Ad3.set(string value) Line 18 + 0xc bytes	C#
 	cPropertyKendineSet.exe!cPropertyKendineSet.Kisi.Ad3.set(string value) Line 18 + 0xc bytes	C#
 	cPropertyKendineSet.exe!cPropertyKendineSet.Kisi.Ad3.set(string value) Line 18 + 0xc bytes	C#
 	cPropertyKendineSet.exe!cPropertyKendineSet.Kisi.Ad3.set(string value) Line 18 + 0xc bytes	C#
 	cPropertyKendineSet.exe!cPropertyKendineSet.Kisi.Ad3.set(string value) Line 18 + 0xc bytes	C#
 	cPropertyKendineSet.exe!cPropertyKendineSet.Kisi.Ad3.set(string value) Line 18 + 0xc bytes	C#
 	cPropertyKendineSet.exe!cPropertyKendineSet.Kisi.Ad3.set(string value) Line 18 + 0xc bytes	C#
 	cPropertyKendineSet.exe!cPropertyKendineSet.Kisi.Ad3.set(string value) Line 18 + 0xc bytes	C#
 	cPropertyKendineSet.exe!cPropertyKendineSet.Kisi.Ad3.set(string value) Line 18 + 0xc bytes	C#
 	cPropertyKendineSet.exe!cPropertyKendineSet.Kisi.Ad3.set(string value) Line 18 + 0xc bytes	C#
 	cPropertyKendineSet.exe!cPropertyKendineSet.Kisi.Ad3.set(string value) Line 18 + 0xc bytes	C#
 	..................................
 	..................................
 	..................................
 	..................................
 	cPropertyKendineSet.exe!cPropertyKendineSet.Kisi.Ad3.set(string value) Line 18 + 0xc bytes	C#
 	The maximum number of stack frames supported by Visual Studio has been exceeded.

Örnek Kodlarımız:

 

    class Kisi
    {

        public string Ad { get; set; } // Doğru kullanım

        private string _ad2;
        public string Ad2 { get { return _ad2; } set { _ad2 = value; } } // Doğru kullanım


        public string Ad3 { get { return Ad3; } set { Ad3 = value; } } // Hatalı kullanım !


    }
    class Program
    {
        static void Main(string[] args)
        {
            Kisi kisi = new Kisi();

            kisi.Ad = "Ali";    // Sorunsuz çalışacaktır.
            kisi.Ad2 = "Veli";  // Sorunsuz çalışacaktır.

            kisi.Ad3 = "Selim"; // Hatalı Kullanım ! Bu özelliğe atama yapmaya çalıştığımızda "StackOverflow" istisnasını (exception) fırlatacaktır.

        }
    }

 

Fazla üzerinde durmak istemedim. Sadece böyle bir hatalı kullanımın ne gibi sonuçlara yer açacağını bilmenizi istedim. ILDasm gibi bir araç ile arka tarafta neler döndüğünü siz araştırabilirsiniz.

İyi çalışmalar.

 

 

Yayınlayan

Yusuf Doru

İstanbul'da yaşıyor. Web ve masaüstü ortamlarında çalışmalar yapıyor. Araştırıyor, geliştiriyor. Kendine ait kişisel blogu var. Her ne kadar .NET dillerine ilgisi olsa da, açık kaynaklı programlama dillerinde de kendini geliştirmeye devam ediyor.

Bir Cevap Yazın

E-posta hesabınız yayımlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir