Visual Basic'teki Öznitelikler

Visual Basic dili, programcının bildirilen varlıklar hakkındaki bilgileri temsil eden bildirimlerde değiştiriciler belirtmesini sağlar. Örneğin, bir sınıf yöntemini , , ProtectedFriend, Protected Friendveya Private değiştiricileriyle Publicyapıştırarak erişilebilirliğini belirtir.

Visual Basic, dil tarafından tanımlanan değiştiricilere ek olarak, programcıların öznitelik olarak adlandırılan yeni değiştiriciler oluşturmasına ve bunları yeni varlıklar bildirirken kullanmasına da olanak tanır. Öznitelik sınıflarının bildirimiyle tanımlanan bu yeni değiştiriciler daha sonra öznitelik blokları aracılığıyla varlıklara atanır.

Not. Öznitelikler çalışma zamanında .NET Framework'ün yansıma API'leri aracılığıyla alınabilir. Bu API'ler bu belirtim kapsamının dışındadır.

Örneğin, bir çerçeve, aşağıdaki örnekte gösterildiği gibi, program öğelerinden belgelere eşleme sağlamak için sınıflar ve yöntemler gibi program öğelerine yerleştirilebilen bir öznitelik tanımlayabilir Help :

<AttributeUsage(AttributeTargets.All)> _
Public Class HelpAttribute
    Inherits Attribute

    Public Sub New(urlValue As String)
        Me.UrlValue = urlValue
    End Sub

    Public Topic As String
    Private UrlValue As String

    Public ReadOnly Property Url() As String
        Get
            Return UrlValue
        End Get
    End Property
End Class

Örnek, bir konumsal parametresi () ve bir adlandırılmış bağımsız değişkeniTopic (UrlValue) olan , veya Help kısaca adlı bir öznitelik sınıfını HelpAttributetanımlar.

Sonraki örnekte özniteliğinin çeşitli kullanımları gösterilmektedir:

<Help("http://www.example.com/.../Class1.htm")> _
Public Class Class1
    <Help("http://www.example.com/.../Class1.htm", Topic:="F")> _
    Public Sub F()
    End Sub
End Class

Sonraki örnek bir Help özniteliği olup olmadığını Class1 denetler ve öznitelik mevcutsa ilişkili Topic ve Url değerleri yazar.

Module Test
    Sub Main()
        Dim type As Type = GetType(Class1)
        Dim arr() As Object = _
            type.GetCustomAttributes(GetType(HelpAttribute), True)

        If arr.Length = 0 Then
            Console.WriteLine("Class1 has no Help attribute.")
        Else
            Dim ha As HelpAttribute = CType(arr(0), HelpAttribute)
            Console.WriteLine("Url = " & ha.Url & ", Topic = " & ha.Topic)
        End If
    End Sub
End Module

Öznitelik Sınıfları

Öznitelik sınıfı, öğesinden System.Attribute türetilen ve olmayan MustInheritgenel olmayan bir sınıftır. Öznitelik sınıfı, özniteliğin ne üzerinde geçerli olduğunu, bir System.AttributeUsage bildirimde birden çok kez kullanılıp kullanılamayacağını ve devralınıp alınmadığını bildiren bir özniteliğine sahip olabilir. Aşağıdaki örnek, sınıf bildirimlerine ve arabirim bildirimlerine yerleştirilebilen adlı SimpleAttribute bir öznitelik sınıfı tanımlar:

<AttributeUsage(AttributeTargets.Class Or AttributeTargets.Interface)> _
Public Class SimpleAttribute
    Inherits System.Attribute
End Class

Sonraki örnekte özniteliğinin birkaç kullanım alanı gösterilmektedir Simple . Öznitelik sınıfı olarak adlandırılmış SimpleAttributeolsa da, bu özniteliğin kullanımları son eki atlayarak Attribute adı olarak Simplekısaltabilir:

<Simple> Class Class1
End Class

<Simple> Interface Interface1
End Interface

özniteliğinde bir yoksa, özniteliği herhangi bir System.AttributeUsagehedefe (eşdeğeri AttributeTargets.All) yerleştirilebilir. özniteliği, System.AttributeUsageAllowMultiplebelirtilen özniteliğin belirli bir bildirim için birden çok kez belirtilip belirtilemeyeceğini belirten değişken başlatıcıya sahiptir. AllowMultiple Bir öznitelik için iseTrue, çok kullanımlı bir öznitelik sınıfıdır ve bir bildirimde birden çok kez belirtilebilir. Bir öznitelik için bir öznitelik False için belirtilmemişseAllowMultiple, tek kullanımlık bir öznitelik sınıfıdır ve bir bildirimde en fazla bir kez belirtilebilir.

Aşağıdaki örnek adlı AuthorAttributeçok kullanımlı bir öznitelik sınıfını tanımlar:

<AttributeUsage(AttributeTargets.Class, AllowMultiple:=True)> _
Public Class AuthorAttribute
    Inherits System.Attribute

    Private _Value As String

    Public Sub New(value As String)
        Me._Value = value
    End Sub

    Public ReadOnly Property Value() As String
        Get
            Return _Value
        End Get
    End Property
End Class

Örnekte özniteliğinin iki kullanımlı bir sınıf bildirimi gösterilmektedir Author :

<Author("Maria Hammond"), Author("Ramesh Meyyappan")> _
Class Class1
End Class

özniteliği, System.AttributeUsageInheritedbir temel tür üzerinde belirtildiğinde özniteliğin bu temel türden türetilen türler tarafından da devralınıp devralınmadığını belirten bir ortak örnek değişkenine sahiptir. Inherited Ortak örnek değişkeni başlatılmazsa, varsayılan değeri False kullanılır. Özellikler ve olaylar tarafından tanımlanan yöntemler olsa da, özellikler ve olaylar öznitelikleri devralmaz. Arabirimler öznitelikleri devralmıyor.

Tek kullanımlık bir öznitelik türetilmiş bir tür üzerinde hem devralınmış hem de belirtilmişse, türetilmiş tür üzerinde belirtilen öznitelik devralınan özniteliği geçersiz kılar. Birden çok kullanımlı bir öznitelik türetilmiş bir tür üzerinde hem devralınmış hem de belirtilmişse, her iki öznitelik de türetilmiş türde belirtilir. Örneğin:

<AttributeUsage(AttributeTargets.Class, AllowMultiple:=True, _
                Inherited:=True) > _
Class MultiUseAttribute
    Inherits System.Attribute

    Public Sub New(value As Boolean)
    End Sub
End Class

<AttributeUsage(AttributeTargets.Class, Inherited:=True)> _
Class SingleUseAttribute
    Inherits Attribute

    Public Sub New(value As Boolean)
    End Sub
End Class

<SingleUse(True), MultiUse(True)> Class Base
End Class

' Derived has three attributes defined on it: SingleUse(False),
' MultiUse(True) and MultiUse(False)
<SingleUse(False), MultiUse(False)> _
Class Derived
    Inherits Base
End Class

özniteliğinin konumsal parametreleri, öznitelik sınıfının ortak oluşturucularının parametreleri tarafından tanımlanır. Konumsal parametreler olmalıdır ByVal ve belirtmeyebilir ByRef. Genel örnek değişkenleri ve özellikleri, öznitelik sınıfının genel okuma-yazma özellikleri veya örnek değişkenleri tarafından tanımlanır. Konumsal parametrelerde ve genel örnek değişkenlerinde ve özelliklerinde kullanılabilecek türler öznitelik türleriyle sınırlıdır. Tür, aşağıdakilerden biriyse bir öznitelik türüdür:

  • ve Decimaldışında Date herhangi bir ilkel tür.

  • türü Object.

  • türü System.Type.

  • Numaralandırılmış bir tür, bu türün ve iç içe yerleştirildiği türlerin (varsa) erişilebilirliği olması Public koşuluyla.

  • Bu listedeki önceki türlerden birinin tek boyutlu dizisi.

Öznitelik Blokları

Öznitelikler öznitelik bloklarında belirtilir. Her öznitelik bloğu açılı ayraçlarla ("<>") sınırlandırılır ve birden çok öznitelik, bir öznitelik bloğu içinde veya birden çok öznitelik bloğunda virgülle ayrılmış bir listede belirtilebilir. Özniteliklerin belirtilme sırası önemli değildir. Örneğin , ve <B> <A> öznitelik bloklarının <A, B><B, A><A> <B> tümü eşdeğerdir.

Attributes
    : AttributeBlock+
    ;

AttributeBlock
    : LineTerminator? '<' AttributeList LineTerminator? '>' LineTerminator?
    ;

AttributeList
    : Attribute ( Comma Attribute )*
    ;

Attribute
    : ( AttributeModifier ':' )? SimpleTypeName
    ( OpenParenthesis AttributeArguments? CloseParenthesis )?
    ;

AttributeModifier
    : 'Assembly' | 'Module'
    ;

Öznitelik, desteklemediği bir tür bildirimde belirtilmeyebilir ve tek kullanımlık öznitelikler bir öznitelik bloğunda birden çok kez belirtilmeyebilir. Aşağıdaki örnek, hem arabiriminde Interface1 hem de bildiriminde birden çok kez kullanmaya HelpString çalıştığından hatalara Class1neden olur.

<AttributeUsage(AttributeTargets.Class)> _
Public Class HelpStringAttribute
    Inherits System.Attribute

    Private InternalValue As String

    Public Sub New(value As String)
        Me.InternalValue = value
    End Sub

    Public ReadOnly Property Value() As String
        Get
            Return InternalValue
        End Get
    End Property
End Class

' Error: HelpString only applies to classes.
<HelpString("Description of Interface1")> _
Interface Interface1
    Sub Sub1()
End Interface

' Error: HelpString is single-use.
<HelpString("Description of Class1"), _
    HelpString("Another description of Class1")> _
Public Class Class1
End Class

Öznitelik isteğe bağlı bir öznitelik değiştirici, öznitelik adı, isteğe bağlı konumsal bağımsız değişkenler listesi ve değişken/özellik başlatıcılardan oluşur. Parametre veya başlatıcı yoksa, ayraç atlanabilir. Bir özniteliğin değiştiricisi varsa, kaynak dosyanın en üstündeki öznitelik bloğunda olmalıdır.

Kaynak dosya, dosyanın en üstünde, kaynak dosyayı içerecek derleme veya modül özniteliklerini belirten bir öznitelik bloğu içeriyorsa, öznitelik bloğundaki her özniteliğin hem veya Module değiştiricisi Assembly hem de iki nokta üst üste ekli olması gerekir.

Öznitelik Adları

Özniteliğin adı bir öznitelik sınıfını belirtir. Kurala göre, öznitelik sınıfları soneki Attributeile adlandırılır. Bir özniteliğin kullanımları bu son eki içerebilir veya atlar. Sonuç olarak, öznitelik tanımlayıcısına karşılık gelen bir öznitelik sınıfının adı, tanımlayıcının kendisi veya nitelenmiş tanımlayıcının ve Attributebirleştirmesi olur. Derleyici bir öznitelik adını çözümlediğinde, adın sonuna eklenir Attribute ve aramayı dener. Bu arama başarısız olursa, derleyici sonek olmadan aramayı dener. Örneğin, bir öznitelik sınıfının SimpleAttribute kullanımları soneki Attribute atlayarak adı olarak Simplekısaltabilir:

<Simple> Class Class1
End Class

<Simple> Interface Interface1
End Interface

Yukarıdaki örnek, aşağıdakine eşdeğerdir:

<SimpleAttribute> Class Class1
End Class

<SimpleAttribute> Interface Interface1
End Interface

Genel olarak, sonek Attribute ile adlı öznitelikler tercih edilir. Aşağıdaki örnekte ve T``Attributeadlı T iki öznitelik sınıfı gösterilmektedir.

<AttributeUsage(AttributeTargets.All)> _
Public Class T
    Inherits System.Attribute
End Class

<AttributeUsage(AttributeTargets.All)> _
Public Class TAttribute
    Inherits System.Attribute
End Class

' Refers to TAttribute.
<T> Class Class1 
End Class

' Refers to TAttribute.
<TAttribute> Class Class2 
End Class

Hem öznitelik bloğu <T> hem de öznitelik bloğu <TAttribute> adlı TAttributeöznitelik sınıfına başvurur. sınıfı TAttributeiçin bildirimini kaldırana kadar öznitelik olarak kullanmak T mümkün değildir.

Öznitelik Bağımsız Değişkenleri

Bir özniteliğin bağımsız değişkenleri iki biçim alabilir: konumsal bağımsız değişkenler ve örnek değişkeni/özellik başlatıcıları. Özniteliğine yönelik tüm konumsal bağımsız değişkenler, örnek değişkeni/özellik başlatıcılarından önce gelmelidir. Konumsal bağımsız değişken bir sabit ifade, tek boyutlu dizi oluşturma ifadesi veya ifadeden GetType oluşur. Örnek değişkeni/özellik başlatıcısı, anahtar sözcükleri eşleştirebilen, ardından iki nokta üst üste ve eşittir işareti bulunan ve sabit bir ifade veya ifade tarafından sonlandırılan bir GetType tanımlayıcıdan oluşur.

Öznitelik sınıfı T, konumsal bağımsız değişken listesi ve örnek değişkeni/özellik başlatıcı listesi PNolan bir öznitelik verildiğinde, bu adımlar bağımsız değişkenlerin geçerli olup olmadığını belirler:

  1. formunun New T(P)bir ifadesini derlemek için derleme zamanı işleme adımlarını izleyin. Bu, derleme zamanı hatasıyla sonuçlanır veya bağımsız değişken listesi için en uygun olan üzerindeki T bir oluşturucuyu belirler.

  2. 1. adımda belirlenen oluşturucunun öznitelik türü olmayan veya bildirim sitesinde erişilemeyen parametreleri varsa, derleme zamanı hatası oluşur.

  3. içindeki Nher örnek değişkeni/özellik başlatıcısı Arg için, örnek değişkeninin/özellik başlatıcısının Argtanımlayıcısı olmalıdırName. Name türü öznitelik türü olan, yazılabilir olmayanShared, Public örnek değişkeni veya parametresiz bir özellik T tanımlamalıdır. Böyle bir örnek değişkeni veya özelliği yoksa T derleme zamanı hatası oluşur.

Örneğin:

<AttributeUsage(AttributeTargets.All)> _
Public Class GeneralAttribute
    Inherits Attribute

    Public Sub New(x As Integer)
    End Sub

    Public Sub New(x As Double)
    End Sub

    Public y As Type

    Public Property z As Integer
        Get
        End Get

        Set
        End Set
    End Property
End Class

' Calls the first constructor.
<General(10, z:=30, y:=GetType(Integer))> _
Class C1
End Class

' Calls the second constructor.
<General(10.5, z:=10)> _
Class C2
End Class

Tür parametreleri öznitelik bağımsız değişkenlerinde hiçbir yerde kullanılamaz. Ancak, oluşturulan türler kullanılabilir:

<AttributeUsage(AttributeTargets.All)> _
Class A 
   Inherits System.Attribute 

   Public Sub New(t As Type)
   End Sub 
End Class

Class List(Of T) 
    ' Error: attribute argument cannot use type parameter
    <A(GetType(T))> Dim t1 As T 

    ' OK: closed type
    <A(GetType(List(Of Integer)))> Dim y As Integer
End Class
AttributeArguments
    : AttributePositionalArgumentList
    | AttributePositionalArgumentList Comma VariablePropertyInitializerList
    | VariablePropertyInitializerList
    ;

AttributePositionalArgumentList
    : AttributeArgumentExpression? ( Comma AttributeArgumentExpression? )*
    ;

VariablePropertyInitializerList
    : VariablePropertyInitializer ( Comma VariablePropertyInitializer )*
    ;

VariablePropertyInitializer
    : IdentifierOrKeyword ColonEquals AttributeArgumentExpression
    ;

AttributeArgumentExpression
    : ConstantExpression
    | GetTypeExpression
    | ArrayExpression
    ;