Dil

Özel öznitelikleri yazma

Özel öznitelikler tasarlamak için birçok yeni kavram öğrenmeniz gerekmez. Nesne odaklı programlama hakkında bilgi sahibiyseniz ve sınıfları nasıl tasarlayabileceğinizi biliyorsanız, gereken bilgilerin çoğuna zaten sahipsiniz demektir. Özel öznitelikler, System.Attribute sınıfından doğrudan veya dolaylı olarak türetilen geleneksel sınıflardır. Geleneksel sınıflarda olduğu gibi özel öznitelikler de verileri depolayan ve alan yöntemler içerir.

Özel öznitelik sınıflarını düzgün tasarlamaya yönelik birincil adımlar şunlardır:

Bu bölümde bu adımların her biri açıklanır ve özel bir öznitelik örneğiyle sonuçlanmıştır.

AttributeUsageAttribute'ını Uygulama

Özel öznitelik bildirimi, öznitelik sınıfınızın bazı temel özelliklerini tanımlayan özniteliğiyle System.AttributeUsageAttribute başlar. Örneğin, özniteliğinizin diğer sınıflar tarafından devralınıp devralınamayacağını veya özniteliğin hangi öğelere uygulanabileceğini belirtebilirsiniz. Aşağıdaki kod parçası, öğesinin nasıl kullanılacağını AttributeUsageAttributegösterir:

[AttributeUsage(AttributeTargets.All, Inherited = false, AllowMultiple = true)]
<AttributeUsage(AttributeTargets.All, Inherited:=False, AllowMultiple:=True)>
Public Class SomeClass
    Inherits Attribute
    '...
End Class

AttributeUsageAttribute özel özniteliklerin oluşturulması için önemli olan üç üyeye sahiptir: AttributeTargets, Inherited ve AllowMultiple.

AttributeTargets Üyesi

Yukarıdaki örnekte, AttributeTargets.All bu özniteliğin tüm program öğelerine uygulanabileceğini belirten belirtilir. Alternatif olarak, özniteliğinizin yalnızca bir sınıfa AttributeTargets.Classuygulanabileceğini belirten veya özniteliğinizin yalnızca bir yönteme uygulanabileceğini belirten belirtebilirsinizAttributeTargets.Method. Tüm program öğeleri bu şekilde özel bir öznitelik tarafından açıklama için işaretlenebilir.

Birden çok AttributeTargets değer de geçirebilirsiniz. Aşağıdaki kod parçası, herhangi bir sınıfa veya yönteme özel bir özniteliğin uygulanabileceğini belirtir:

[AttributeUsage(AttributeTargets.Class | AttributeTargets.Method)]
<AttributeUsage(AttributeTargets.Class Or AttributeTargets.Method)>
Public Class SomeOtherClass
    Inherits Attribute
    '...
End Class

Miras Kalan Gayrimenkul

AttributeUsageAttribute.Inherited özelliği, özniteliğinizin, özniteliğinizin uygulandığı sınıflardan türetilen sınıflar tarafından devralınıp devralınamayacağını gösterir. Bu özellik bir true (varsayılan) veya false bayrak alır. Aşağıdaki örnekte, MyAttribute varsayılan bir Inherited değeri olarak true alırken, YourAttribute bir Inherited değeri olarak false alır.

// This defaults to Inherited = true.
public class MyAttribute : Attribute
{
    //...
}

[AttributeUsage(AttributeTargets.Method, Inherited = false)]
public class YourAttribute : Attribute
{
    //...
}
' This defaults to Inherited = true.
Public Class MyAttribute
    Inherits Attribute
    '...
End Class

<AttributeUsage(AttributeTargets.Method, Inherited:=False)>
Public Class YourAttribute
    Inherits Attribute
    '...
End Class

İki öznitelik daha sonra temel sınıfındaki MyClassbir yönteme uygulanır:

public class MyClass
{
    [MyAttribute]
    [YourAttribute]
    public virtual void MyMethod()
    {
        //...
    }
}
Public Class MeClass
    <MyAttribute>
    <YourAttribute>
    Public Overridable Sub MyMethod()
        '...
    End Sub
End Class

Son olarak, sınıf YourClass temel sınıf MyClass 'den türetilmiştir. yöntemi MyMethod şunları gösterir MyAttribute, ancak göstermez YourAttribute:

public class YourClass : MyClass
{
    // MyMethod will have MyAttribute but not YourAttribute.
    public override void MyMethod()
    {
        //...
    }
}
Public Class YourClass
    Inherits MeClass
    ' MyMethod will have MyAttribute but not YourAttribute.
    Public Overrides Sub MyMethod()
        '...
    End Sub

End Class

AllowMultiple Özelliği

özelliği, AttributeUsageAttribute.AllowMultiple bir öğede özniteliğinizin birden çok örneğinin bulunup bulunmadığını gösterir. olarak ayarlanırsa true, birden çok örneğe izin verilir. (varsayılan) olarak ayarlanırsa false yalnızca bir örneğe izin verilir.

Aşağıdaki örnekte, MyAttribute varsayılan AllowMultiple değeri false iken, YourAttribute değeri true şeklindedir.

//This defaults to AllowMultiple = false.
public class MyAttribute : Attribute
{
}

[AttributeUsage(AttributeTargets.Method, AllowMultiple = true)]
public class YourAttribute : Attribute
{
}
' This defaults to AllowMultiple = false.
Public Class MyAttribute
    Inherits Attribute
End Class

<AttributeUsage(AttributeTargets.Method, AllowMultiple:=true)>
Public Class YourAttribute
    Inherits Attribute
End Class

Bu özniteliklerin birden çok örneği uygulandığında, MyAttribute derleyici hatası oluşturur. Aşağıdaki kod örneğinde geçerli kullanımı YourAttribute ve geçersiz kullanımı gösterilmektedir MyAttribute:

public class MyClass
{
    // This produces an error.
    // Duplicates are not allowed.
    [MyAttribute]
    [MyAttribute]
    public void MyMethod()
    {
        //...
    }

    // This is valid.
    [YourAttribute]
    [YourAttribute]
    public void YourMethod()
    {
        //...
    }
}
Public Class MyClass
    ' This produces an error.
    ' Duplicates are not allowed.
    <MyAttribute>
    <MyAttribute>
    Public Sub MyMethod()
        '...
    End Sub

    ' This is valid.
    <YourAttribute>
    <YourAttribute>
    Public Sub YourMethod()
        '...
    End Sub
End Class

Eğer hem AllowMultiple özelliği hem de Inherited özelliği true olarak ayarlanırsa, başka bir sınıftan türetilmiş bir sınıf, bir özniteliği devralabilir ve aynı çocuk sınıfta aynı özniteliğin başka bir örneğine sahip olabilir. AllowMultiple false olarak ayarlanırsa, üst sınıftaki herhangi bir özniteliğin değeri, alt sınıfta aynı özniteliğin yeni örnekleri tarafından üzerine yazılır.

Öznitelik Sınıfını Bildirme

uygulamasını uyguladıktan AttributeUsageAttributesonra, özniteliğinizin özelliklerini tanımlamaya başlayın. Öznitelik sınıfının bildirimi, aşağıdaki kodda gösterildiği gibi geleneksel bir sınıfın bildirimine benzer:

[AttributeUsage(AttributeTargets.Method)]
public class MyAttribute : Attribute
{
    // . . .
}
<AttributeUsage(AttributeTargets.Method)>
Public Class MyAttribute
    Inherits Attribute
    ' . . .
End Class

Bu öznitelik tanımı aşağıdaki noktaları gösterir:

  • Öznitelik sınıfları genel sınıflar olarak bildirilmelidir.

  • Kural gereği, öznitelik sınıfının adı Öznitelik sözcüğüyle biter. Gerekli olmasa da, okunabilirlik için bu kural önerilir. Öznitelik uygulandığında, Öznitelik sözcüğünün eklenmesi isteğe bağlıdır.

  • Tüm öznitelik sınıfları doğrudan veya dolaylı olarak System.Attribute sınıfından devralmalıdır.

  • Microsoft Visual Basic'da tüm özel öznitelik sınıflarının System.AttributeUsageAttribute özniteliği olmalıdır.

Oluşturucuları Bildirme

Geleneksel sınıflarda olduğu gibi öznitelikler de oluşturucularla başlatılır. Aşağıdaki kod parçası tipik bir öznitelik oluşturucuyu gösterir. Bu ortak oluşturucu bir parametre alır ve bir üye değişkenini değerine eşit olarak ayarlar.

public MyAttribute(bool myvalue)
{
    this.myvalue = myvalue;
}
Public Sub New(myvalue As Boolean)
    Me.myvalue = myvalue
End Sub

Oluşturucuyu, farklı değer bileşimlerini barındıracak şekilde aşırı yükleyebilirsiniz. Özel öznitelik sınıfınız için de bir özellik tanımlarsanız, özniteliği başlatırken adlandırılmış ve konumsal parametrelerin bir bileşimini kullanabilirsiniz. Genellikle, gerekli tüm parametreleri konumsal ve tüm isteğe bağlı parametreleri adlandırılmış olarak tanımlarsınız. Bu durumda, öznitelik gerekli parametre olmadan başlatılamaz. Diğer tüm parametreler isteğe bağlıdır.

Uyarı

Visual Basic'da, bir öznitelik sınıfının oluşturucuları ParamArray bağımsız değişkeni kullanmamalıdır.

Çalışma zamanının öznitelik değerlerini doğrudan meta verilerden okuyabilmesi gerektiğinden, bir özniteliğin oluşturucu parametreleri ve ortak özellikleri sınırlı bir tür kümesiyle sınırlıdır. Geçerli öznitelik parametre türleri şunlardır:

  • Basit türler (C# anahtar sözcüğü / Visual Basic anahtar sözcük / .NET çalışma zamanı türü):

    C# Visual Basic .NET çalışma zamanı türü
    bool Boolean Boolean
    byte Byte Byte
    char Char Char
    double Double Double
    float Single Single
    int Integer Int32
    long Long Int64
    short Short Int16
    string String String
  • Type.

  • Öznitelik kullanımı yerinde erişilebilen numaralandırma türleri.

  • C# object dilinde (değer geçerli öznitelik bağımsız değişken türlerinden biri olduğunda veya bunların tek boyutlu dizilerinden biri olduğunda).

  • Önceki türlerden herhangi birinin tek boyutlu dizileri.

Bu listenin dışındaki bir türü kabul eden bir oluşturucu tanımlarsanız, öznitelik başarıyla derlanır, ancak uygulamayı denediğinizde derleyici hatası oluşur. Öznitelik uygulanırken hangi ifadelere izin verildiğinden daha fazla bilgi için bkz. Öznitelikleri uygulama.

Uyarı

sbyte, ushort, uint, ulong, decimal, nint, ve nuint türleri literal sabitleri desteklese de geçerli öznitelik parametre türleri değildir.

Aşağıdaki kod örneği, önceki oluşturucuyu kullanan bir özniteliğin isteğe bağlı ve gerekli parametreler kullanılarak nasıl uygulanabileceğini gösterir. Özniteliğin bir gerekli Boole değeri ve bir isteğe bağlı dize özelliği olduğunu varsayar.

// One required (positional) and one optional (named) parameter are applied.
[MyAttribute(false, OptionalParameter = "optional data")]
public class SomeClass
{
    //...
}
// One required (positional) parameter is applied.
[MyAttribute(false)]
public class SomeOtherClass
{
    //...
}
' One required (positional) and one optional (named) parameter are applied.
<MyAttribute(false, OptionalParameter:="optional data")>
Public Class SomeClass
    '...
End Class

' One required (positional) parameter is applied.
<MyAttribute(false)>
Public Class SomeOtherClass
    '...
End Class

Özellikleri Bildirme

Adlandırılmış bir parametre tanımlamak veya özniteliğiniz tarafından depolanan değerleri döndürmek için kolay bir yol sağlamak istiyorsanız, bir özellik bildirin. Öznitelik özellikleri, döndürülecek veri türünün açıklamasıyla ortak varlıklar olarak bildirilmelidir. Özelliğinizin değerini tutacak değişkeni tanımlayın ve get ile set yöntemlerini ilişkilendirin. Aşağıdaki kod örneği, özniteliğinizde bir özelliğin nasıl uygulanduğunu gösterir:

public bool MyProperty
{
    get {return this.myvalue;}
    set {this.myvalue = value;}
}
Public Property MyProperty As Boolean
    Get
        Return Me.myvalue
    End Get
    Set
        Me.myvalue = Value
    End Set
End Property

Özel Öznitelik Örneği

Bu bölüm önceki bilgileri içerir ve kodun bir bölümünün yazarı hakkındaki bilgileri belgeleyen bir özniteliğin nasıl tasarlandığını gösterir. Bu örnekteki öznitelik, programcının adını ve düzeyini ve kodun gözden geçirilip geçirilmemiş olduğunu depolar. Kaydedilecek gerçek değerleri depolamak için üç özel değişken kullanır. Her değişken, değerleri alan ve ayarlayan bir ortak özellik ile temsil edilir. Son olarak, oluşturucu iki gerekli parametreyle tanımlanır:

[AttributeUsage(AttributeTargets.All)]
public class DeveloperAttribute : Attribute
{
    // Private fields.
    private string name;
    private string level;
    private bool reviewed;

    // This constructor defines two required parameters: name and level.

    public DeveloperAttribute(string name, string level)
    {
        this.name = name;
        this.level = level;
        this.reviewed = false;
    }

    // Define Name property.
    // This is a read-only attribute.

    public virtual string Name
    {
        get {return name;}
    }

    // Define Level property.
    // This is a read-only attribute.

    public virtual string Level
    {
        get {return level;}
    }

    // Define Reviewed property.
    // This is a read/write attribute.

    public virtual bool Reviewed
    {
        get {return reviewed;}
        set {reviewed = value;}
    }
}
<AttributeUsage(AttributeTargets.All)>
Public Class DeveloperAttribute
    Inherits Attribute
    ' Private fields.
    Private myname As String
    Private mylevel As String
    Private myreviewed As Boolean

    ' This constructor defines two required parameters: name and level.

    Public Sub New(name As String, level As String)
        Me.myname = name
        Me.mylevel = level
        Me.myreviewed = False
    End Sub

    ' Define Name property.
    ' This is a read-only attribute.

    Public Overridable ReadOnly Property Name() As String
        Get
            Return myname
        End Get
    End Property

    ' Define Level property.
    ' This is a read-only attribute.

    Public Overridable ReadOnly Property Level() As String
        Get
            Return mylevel
        End Get
    End Property

    ' Define Reviewed property.
    ' This is a read/write attribute.

    Public Overridable Property Reviewed() As Boolean
        Get
            Return myreviewed
        End Get
        Set
            myreviewed = value
        End Set
    End Property
End Class

Bu özniteliği tam adı kullanarak veya kısaltılmış adı DeveloperAttributeDeveloperkullanarak aşağıdaki yollardan biriyle uygulayabilirsiniz:

[Developer("Joan Smith", "1")]

-or-

[Developer("Joan Smith", "1", Reviewed = true)]
<Developer("Joan Smith", "1")>

-or-

<Developer("Joan Smith", "1", Reviewed := true)>

İlk örnekte yalnızca gerekli adlandırılmış parametrelerle uygulanan öznitelik gösterilmektedir. İkinci örnekte hem gerekli hem de isteğe bağlı parametrelerle uygulanan öznitelik gösterilmektedir.

Ayrıca bakınız