Makale Özeti

Attributeler hedeflenen class lar ve/veya class üyeleri için (field,type,method,property,...) ek bilgi sağlayabileceğiniz ve düzenleyici rol üstlenen etiketlerdir.

Makale

Attributes

Attribute

Attributeler hedeflenen class lar ve/veya class üyeleri için (field,type,method,property,...) ek bilgi sağlayabileceğiniz ve düzenleyici rol üstlenen etiketlerdir. Etki ettikleri nesnelerin anlamlarını ve davranışlarını belirlerler. Attributeler .NET assembly si içinde metadata olarak saklanmaktadırlar. Bu yüzden tasarım ve/veya çalışma anında ulaşılabilir durumdadırlar. Attribute ler .NET platformunda ,çoğu arka planda iş görsede, önemli bir yer işgal ederler. Attribute lerin nasıl kullanıldığını görmek için bir örnek verelim.

<WebMethod(Description:="Ziyaretçi sayısını tutar.")> _
Public Function Sayac(strURL As String) As Integer

Bu yapı web servisleriyle uğraşanlara çok tanıdık gelecektir. İlk satırdaki <> arasındaki ifadeye dikkat edelim. İşte size sık kullanılan bir attribute! System.Web.Services namespaceinden gelen WebMethod attributeü. O zaman hemen iki kural çıkaralım.

*Attribute ler <> işaretleri arasında belirtilirler.
*Attribute ler gökten zembille inen etiketler değil, belirli sınıflardır. Aslında her attribute System.Attribute sınıfından türetilmiştir.

Örneğimize geri dönelim. Normal şartlar altında web servisleri geliştirirken; bir sınıfın public metotları, o sınıfın örnekleri tarafından yerel olarak çağrılabilirler. Web servisinin dışa açık bir parçası olarak kullanılamazlar. Ama WebMethod attributeü bu fonksiyonun dışa yönelik bir fonksiyon olduğunu ve internet üzerinden erişebileceğini belirtir. Dikkat; attribute, fonksiyonun davranışını belirledi. Yazının başındaki cümleyi tekrarlayalım; attributeler hedefledikleri üyeler için düzenleyici rol üstlenen etiketlerdir.

Yine örneğimizde attribute Description adında bir propertye sahip. Burada da iki şeyin altını çizelim;

*Atributeler çeşitli propertylere sahip olabilirler.
*Atribute lerin sözdizimlerinde bazı küçük farklılıklar vardır. Örneğin atama yapmak için := sembolleri kullanılır.

İyi güzel de peki bu attributeler neden .NET platformunda önemlidirler? Ya da neden dil ile bütünleştirilmeden kullanılıyorlar? Attributelerin işlevleri pekala alışık olduğumuz komutlarla gerçekleştirilemez miydi?

Aslında bu sorulara cevap olacak temel bilgi yine yazının başında; attributeler, derlenmiş kod yerine, assembly içinde metadata olarak saklanırlar.

Böylelikle attributeler tasarım aşamasında (örneğin Visual Studio .NET kullanılırken) , derlenirken (derlenme esnasında varsayılan derleme ayarlarının değiştirilmesinde) ve çalışma anında (CLR tarafından kodun varsayılan icra edilme mekanizmasının değiştirilmesinde) rol alabilirler.

Visual Studio .NET de kendi içinde attibuteleri kullanır. Visual Studio .NET de kontroller, tasarım anında, çalışma anından farklı davranışlar sergilemektedir. Örneğin bir buttona tasarım anında tıklayınca önceden belirlenmiş varsayılan olay (button için click() olayı) için yordam oluşturur. Fakat aynı butona çalışma anında tıklayınca altındaki kod icra edilir. Arkada bu işi gören aslında <DefaultEvent> attributeüdür. Bir kontrolün belli bir olayı için bu attribute belirlendiğinde bu bilgi assembly de metadata olarak tutulur.Böylelikle Visual Studio bu bilgileri rahatlıkla yorumlayabilir ve tasarım anında bir kontrole çift tıklanınca hangi olay için yordam oluşturacağına karar verebilir.

Kullanım özellikleri

-Bir üyeye birden fazla attrbiute aynı anda, virgülle ayrılarak etki ettirilebilir.

<BenimAttribute(), WebMethod( )> Public Function Sayac(strURL As String) As Integer

-Yaygın kullanımda attribute isminden sonra gelen "attribute" eki düşürülür. <WebMethod> aslında <WebMethodAttribute> sınıfına denk gelir. Bu sınıf da System.Web.Services.dll dosyasından gelir.

Son olarak bir küçük bir uygulamada attributelerin nasıl kullanıldığını görelim;

Bu uygulamamızda stringlerle çalışırken karşılaşılan bir problemi <VBFixedString> attributeünü kullanarak çözeceğiz.
Uygulama için yeni bir windows application oluşturun. Formun üstüne bir button koyduktan sonra şu kodları ekleyin:


Structure BenimTipim
        Public OnEk As String
        Public BenimString As String
        Public SonEk As String
End Structure

Private Sub Button1_Click( _
            ByVal sender As System.Object, _
            ByVal e As System.EventArgs) _
            Handles Button1.Click
        Dim Kayit As BenimTipim
        FileOpen(1, "c:\TESTFILE.TXT", _
        OpenMode.Binary)

        Kayit.OnEk = "X"
        Kayit.BenimString = "AAAAA"
        Kayit.SonEk = "X"
        FilePut(1, Kayit)
        FileClose(1)
End Sub

Uygulamayı çalıştırdığımızda beklediğimiz sonuca ulaşamayız. Bu sorunu aşağıdaki değişikliği yaparak çözebiliriz.

Structure BenimTipim
       <VBFixedString(1)> Public OnEk As String
       <VBFixedString(5)> Public BenimString As String
       <VBFixedString(1)> Public SonEk As String
End Structure

Gördüğümüz gibi bazı durumlarda attributeler ile pratik çözümler üretmek mümkün oluyor.

Yorumlarınızı bekliyorum