İlkay İlknur

just a developer...

C# 5.0 - Caller Info Attributes

Merhaba Arkadaşlar,

Şu ana kadar C# 5.0 ile ilgili makalelerimizde sizlerle C# 5.0 ile beraber gelecek olan Asenkron Programlama yeniliklerini inceledik. Her ne kadar C# 5.0'ın teması Asenkron Programlama olsa da C# 5.0 ile beraber gelecek olan bir programlama dili yeniliği daha bulunmakta.

Asenkron Programlama'nın yanında biraz üvey evlat muamelesi  :) görüyor olsa da bu yeniliğin adı Caller Info Attributes.

Geliştirdiğimiz uygulamalar içerisinde olmazsa olmaz dediğimiz Cross Cutting bölümlerden biri de Loglama bölümüdür. Geliştirdiğimiz uygulamaların büyüklüğüne, hedef kitlesine, konseptine bağlı olarak içerlerinde yapmış olduğumuz loglamalar daha da derinleşebilmekte veya belirli sınırlar dahilinde kalabilmektedir.

__FILE__ , __LINE__ Macrolarının C# Karşılığı ?

Eğer daha önce C, C++ gibi dillerle uğraştıysanız bu programalama dilleri içerisinde yaptığınız çağrımların, bulunduğu satır numarasını veya bulunduğu dosyanın pathi gibi bilgileri yukarıda görmüş olduğumuz gibi macroları kullanarak alabilmekteyiz. Peki bu macroların C# tarafında karşılığı var mı ?

Cevabımız hayır :) Yukarıdaki macroların yaptıklarını aslında şu anda Reflection kullanarak kendimiz de gerçekleştirebilmekteyiz. Ancak programlama dili tarafında C#'ın 4.0 sürümü de dahil olmak üzere istediğimiz bu fonksiyonaliteyi  otomatize eden, doğrudan arka planda kendisi sağlayan bir yapı bulunmamakta.

Tabi bizler de developer olarak işlerimizi hızlandırması açısından bu macroları C# içerisinde kullanabilmeyi istiyoruz. İşte C# 5.0 ile beraber gelen Caller Info Attributes özelliği ile bu fonksiyonaliteleri artık compiler kendisi otomatize etmekte ve developerların kullanımına sunmakta.

Peki kullanım aynı C ve C++'ta olduğu gibi __FILE__,__LINE__ macroları şeklinde mi olmakta ? Bu sorunun cevabı  da hayır :) Çünkü macrolar C# ve VB içerisinde desteklenmiyor ve desteklenmeyecekte. Bunun yerine Attribute mantığını kullanarak hızlı bir şekilde implementasyonlarımızı gerçekleştirebiliyoruz.

Caller Info Attributes özelliği kapsamında System.Runtime.CompilerServices namespace'i içerisinde  3  yeni attribute ile karşılaşmaktayız.

Bunlar,

[CallerFilePath] : Çağrım yapılan yerin bulunduğu dosyanın pathini verir.

[CallerLineNumber] : Çağrım yapılan yerin bulunduğu dosya içerisindeki satır numarasını verir

[CallerMemberName] : Çağrım yapan üyenin adını verir.

Bu 3 attribute'ün de target type'ı Parameter olarak set edilmiştir. Yani sadece metot imzalarındaki parametrelere bu attributeleri verebiliriz.

Peki buna göre kullanımı nasıl yapacağız ?

Aslında herşey oldukça basit. Attributeleri C# 4.0 ile beraber gelen Optional Parameters özelliği ile beraber kullanacağız.

Evet çok uzatmadan kod kısmına geçelim.

[sourcecode language="csharp"] static void Log(string message, [CallerFilePath]string path = null, [CallerLineNumber]int line = 0, [CallerMemberName]string memberName = null) { Console.WriteLine(String.Format(@"Message:{0}\n FilePath:{1}\n LineNumber:{2}\n MemberName:{3}", message, path, line, memberName)); } [/sourcecode]

Yukarıda gördüğümüz gibi çok basit bir şekilde Caller Info Attributeleri kullanarak istediğimiz değerleri elde edebiliyoruz. Bunu yaparkende Optional Parameters özelliğini kullanıyoruz. Böylece optional olan parametreyi metot çağrımı sırasında boş geçtiğimizde compiler arka planda ilgili parametreye attribute özelliğine göre ilgili değeri atıyor.

Şimdi isterseniz yukarıda yazmış olduğumuz Log metodunu basit bir console uygulamasından çağıralım ve sonucu görelim.

[sourcecode language="csharp"] static void Main(string[] args) { Log("Caller Info Attributes kullanıyoruz !"); } [/sourcecode]

Uygulamayı çalıştırdığımızda ise aşağıdaki gibi bir sonuçla karşılaşmaktayız.

Console uygulamasında Log metodunu çağırırken gördüğünüz gibi path,line ve memberName parametrelerini metoda geçirmedik. Böylece de compiler arka planda kendisi bu alanların karşılıklarını otomatik olarak atadı.

C# 5.0 ile beraber gelen Caller Info Attributes özelliği gördüğümüz gibi biz developerların özellikle loglamalar sırasında  sıklıkla kullanacağı özelliklerden biri olma konusunda kuvvetli bir aday. Özellikle işimizi oldukça kolaylaştırdığınız söylememiz herhalde yanlış olmaz. ;)

C# 5.0 ile ilgili yazılarımız şimdilik bu kadar. Gelişmeler, iyileştirmeler ve ekstra yenilikler oldukça blog üzerinden inceliyor olacağız.

Görüşmek Üzere,



Yorum Gönder


Yorumlar

  • profile

    İlkay İlknur

    • 4
    • 2
    • 2013

    dynamic p tanımını string'e çevirirsen düzelecektir.

  • profile

    gokturk

    • 2
    • 2
    • 2013

    static void Main(string[] args) { dynamic p = "Caller Info Attributes kullanıyoruz !"; Log(p); } Caller Info Attributes boş geliyor, Normal mi?