Uygulamarımızı geliştirirken heralde en çok yaptığımız işlemlerin başında hata ayıklama (Debug) işlemleri geliyor. Gerek uygulamamızın hata verdiği durumlarda gerekse uygulamamızdan beklenmedik değerler aldığımızda hatta programlamaya yeni başlayanlar kodların nasıl çalıştığını daha iyi anlayabilmek adına debug işlemleri programcı için büyük kolaylıklar getirmektedir.


Bu makalemizde debug işlemleri yaparken gözden kaçan, aslında yeri geldiğinde işlerimizi büyük oranda kolaylaştıran bazı özelliklere değinip, yeri geldiğinde de debug işlemlerimizi özelleştirmemize yardımcı olacak .Net Framework’ün bize sağladığı imkanlar üzerinde duracağız.Bu özellikler sayesinde debug işlemlerimizin gücünü biraz daha arttırmış olacağız. İlk olarak debug işlemleri sırasında bir dizinin değerlerini görüntülemek istediğimizde aşağıdaki (resim-1) gibi bir görüntü ile karşılaşırız.




(resim-1)


Oysaki biz dizi elemalarının Type bilgisini (namespace.class_name) görmek yerine daha anlamlı bir veri görmek isteriz. Aslında biliyoruz ki bu bilgi ilgili nesnenin ToString metodunun çağrılması sonucu elde edilmiştir. Bu durumda nesnemizin kodları üzerindeki küçük bir değişiklikle aşağıdaki gibi daha anlamlı ve debug işlemi sırasında zaman kazandıracak bir görüntüyü sağlayabiliriz.
public override string ToString() { return Name; }
Artık debug işlemi sırasında dizi elemanlarımız görüntülenmek istendiğinde ilgili nesnenin ToString() metodu çağrılacak ve sonuçta bizim istediğimiz (override işlemi sonucunda) çıktı debug ekranında (resim-2)belirecektir.






(resim-2)
Görüldüğü gibi küçük işlemler ile daha kolay ve anlaşılır debug işlemleri yapabilmekteyiz. Şimdi de debug işlemleri sırasında işlerimizi kolaylaşatıracak .net framework içindeki bazı niteliklere (Attribute) değinelim.Örneklerimizin açıklamasında kullanacağımız - anlaşılır olabilmesi için - basit bir sınıf örneği olarak Ogrenci class'ını yazalım.


[DebuggerDisplay("Ad ={Name},No = {No}")]
public class Ogrenci {
private string _name;
public string Name
{
[DebuggerStepThrough]
get { return _name; }


[DebuggerStepThrough]
set { _name = value; }
}
private int _no;
public int No
{
get { return _no; }
set { _no = value; }
}
private int _x;
[DebuggerBrowsable(DebuggerBrowsableState.Never)]
public int X
{
get { return _x; }
set { _x = value; }
}
}
İlk olarak debug işlemi esnasında büyük nesnelerimizin özelliklerini incelemek istediğimizde, nesne üzerine gelip ilgili değerleri arayıp bulur ve inceleriz. Ama aslında biz sadece 2 ya da 3 özelliğin değerini incelemek istediğimizde onca özellik arasından gidip o değerleri bulmak hem sıkıcı hem de zaman alıcı iştir. Tam da bu gibi durumlar için DebuggerDisplay niteliği (Attribute) biçilmiş kaftandır. Debug işlemi sırasında nesne üzerine geldiğinizde sadece istediğiniz özelliklerin gösterilmesini sağlar.


Örneğimizde Ogrenci sınıfımıza DebuggerDisplay niteliği uygulanarak debug işlemi sırasında nesne üzerine geldiğimizde sadece Name ve No özelliklerinin (property) istediğimiz bir string formatında görüntülenmesi sağlanmış, sınıfımızın diğer bir üye elemanı olan X özelliği ise devre dışı bırakılmıştır.Tabi ki görüntülenmek istendiğinde nesnenin detayına bakılarak değeri öğrenilebilir. Bu niteliği uygulamadığımız sınıfdan bir nesne debug sırasında aşağıdaki (resim-3) deki gibi görünecektir.






(resim-3)


Diğer bir niteliğimiz ise DebuggerStepThrough; bu nitelik sayesinde debug işlemi esnasında F11 ile dallanma yapmak istediğimizde eğer bizim için önemsiz bir kod bölümü varsa bu kısma dallanma yapmak istemeyeceğimizi belirtebiliriz. Örneğin


Ogrenci o = new Ogrenci();
o.Name = "ali";
o.No = 22;


gibi bir kodu debug ettiğimizi düşünürsek o.Name="ali"; satırında iken F11 ’e bastığımızda Name özelliğinin set metoduna dallanacağını biliyoruz. Fakat DebuggerStepThrough niteliği set için uygulandığından bu dallanma gerçekleşmeyecek o.No=22; kod satırından itibaren debug işlemi devam edecektir. Gerçekten hoş bir nitelik değil mi sizce de.


Diğer niteliğimiz DebuggerBrowsable niteliği.Isminden de açıkça belli olduğu üzere bu niteliğin uygulanmış olduğu nesnenin özelliği debug ekranında görüntülenmeyecektir. Örneğimize bakacak olursak X özelliğinin debug işlemi sırasında görüntülenmesini istemediğimiz için DebuggerBrowsable niteliğine DebuggerBrowsableState.Never değerini veriyoruz.( Verilebilcek diğer değerler için MSDN'den detaylı bilgi alabilirsiniz.)Çıktımız aşağıdaki resimdeki (resim-4) gibi olacaktır.