.NET platformunda ve dolayısıyla Visual Basic'te nitelikler, kodun çeşitli öğelerini meta verilerle anot etmek için güçlü bir araç olarak tanıtılmıştır. Bu, programların ve araçların çalıştırma ve derleme aşamasında ek bilgiler almasını sağlayarak, metodların, sınıfların, özelliklerin davranışlarını yansıtma, serileştirme, test otomasyonu vb. mekanizmalarla ayarlamalarına olanak tanır.
Nitelik olmadan, metodların veya sınıfların davranışlarını yapılandırmak için ek mantığı sert bir şekilde kodlamak zorunda kalınırsınız ve evrensel kütüphaneler, sınıf veya metod ile ilgili dış bilgi olmadan genişletilebilir ve esnek olamaz. Ayrıca, kendi kodunu değişmeden ayarların iletilmesi gibi bir sorun ortaya çıkar.
Nitelikler, Attribute sınıfının özel türev sınıflarıdır. Bunlar metodlara, sınıflara, özelliklere, parametrelere veya döndürülen değerlere uygulanabilir. Çalışma aşamasında bu nitelikler yansıma (reflection) ile tespit edilebilir ve ilgili mantığın davranışını değiştirmek mümkündür.
Kendi niteliğinizi oluşturma ve kullanma örneği:
Imports System <AttributeUsage(AttributeTargets.Class Or AttributeTargets.Method, AllowMultiple:=False)> Public Class InfoAttribute Inherits Attribute Public Property Description As String Public Sub New(desc As String) Description = desc End Sub End Class <Info("Özel iş mantığı metodu.")> Public Sub Calculate() Console.WriteLine("Hesaplama gerçekleştirildi.") End Sub ' Yansıma ile niteliği okuma Dim method = GetType(Module1).GetMethod("Calculate") Dim attr = CType(Attribute.GetCustomAttribute(method, GetType(InfoAttribute)), InfoAttribute) If attr IsNot Nothing Then Console.WriteLine(attr.Description)
Temel özellikler:
Nitelikler, yansıma kullanmadan doğrudan bir metodun veya sınıfın davranışını değiştirebilir mi?
Hayır, nitelikler kendileri yalnızca meta verileri içerir. Bir nesnenin davranışını değiştirmek için, çağrılar yansıma yoluyla niteliğin varlığını kontrol etmeli ve ek işlemler yapmalıdır.
Aynı nitelik bir öğeye birden fazla kez atanabilir mi ve bunun için ne gereklidir?
Varsayılan olarak — hayır. Bunun için nitelik tanımında AllowMultiple:=True belirtilmelidir. Böylece bir niteliği bir öğeye birden fazla kez uygulamak mümkündür.
Nitelikler üst sınıftan alt sınıfa miras alınır mı?
Hayır, varsayılan olarak — miras alınmaz. Eğer miras almak gerekiyorsa, AttributeUsage içinde Inherited:=True parametresi belirtilmelidir.
Bir projede, metodlar için özelleştirilmiş nitelikler yaygın olarak yerleştirilmiştir, ancak hiç kimse bu nitelikleri yansıma aracılığıyla işleme almamıştır — böyle bir kod, desteklemeyi zorlaştırarak ve kaynak kodu okumayı karmaşıklaştırarak gereksiz bir yük haline gelir.
Artıları:
Eksileri:
Nitelik, kayıt metodlarını anot etmek için kullanılır ve ayrı bir alt sistem, yansıma aracılığıyla hangi metodların denetime tabi olduğunu otomatik olarak belirler, analitik ekler ve izleme sağlar. Davranış kullanıcı için şeffaftır.
Artıları:
Eksileri: