Ö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, doğrudan veya dolaylı olarak sınıfından türetilen geleneksel sınıflardır System.Attribute . 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'u 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)]
<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.Methoduygulanabileceğini belirten veya özniteliğinizin yalnızca bir yönteme uygulanabileceğini belirten belirtebilirsinizAttributeTargets.Class. 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 | AttributeTargets.Method)]
<AttributeUsage(AttributeTargets.Class Or AttributeTargets.Method)>
Public Class SomeOtherClass
Inherits Attribute
'...
End Class
Devralınan Özellik
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 varsayılan MyAttribute
değeri , değeri ise false
InheritedYourAttribute
:Inheritedtrue
// This defaults to Inherited = true.
public ref class MyAttribute : Attribute
{
//...
};
[AttributeUsage(AttributeTargets::Method, Inherited = false)]
public ref class YourAttribute : Attribute
{
//...
};
// 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 MyClass
bir yönteme uygulanır:
public ref class MyClass
{
public:
[MyAttribute]
[YourAttribute]
virtual void MyMethod()
{
//...
}
};
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ı temel sınıfından YourClass
MyClass
devralınır. yöntemi MyMethod
şunları gösterir ancak göstermezYourAttribute
MyAttribute
:
public ref class YourClass : MyClass
{
public:
// MyMethod will have MyAttribute but not YourAttribute.
virtual void MyMethod() override
{
//...
}
};
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 varsayılan MyAttribute
AllowMultiple değeri false
, değeri ise YourAttribute
: şeklindedir true
.
//This defaults to AllowMultiple = false.
public ref class MyAttribute : Attribute
{
};
[AttributeUsage(AttributeTargets::Method, AllowMultiple = true)]
public ref class YourAttribute : Attribute
{
};
//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 ref class MyClass
{
public:
// This produces an error.
// Duplicates are not allowed.
[MyAttribute]
[MyAttribute]
void MyMethod()
{
//...
}
// This is valid.
[YourAttribute]
[YourAttribute]
void YourMethod()
{
//...
}
};
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
Hem özelliği hem Inherited de AllowMultiple özelliği olarak true
ayarlanırsa, başka bir sınıftan devralınan bir sınıf bir özniteliği devralabilir ve aynı alt sınıfa aynı özniteliğin başka bir örneğini uygulanabilir. olarak ayarlanırsa AllowMultiplefalse
, üst sınıftaki özniteliklerin değerlerinin üzerine alt sınıfta aynı özniteliğin yeni örnekleri 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 ref class MyAttribute : Attribute
{
// . . .
};
[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 sınıfından System.Attribute devralmalıdır.
Microsoft Visual Basic'te tüm özel öznitelik sınıflarının özniteliği olmalıdır System.AttributeUsageAttribute .
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.
MyAttribute(bool myvalue)
{
this->myvalue = myvalue;
}
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.
Not
Visual Basic'te, bir öznitelik sınıfının oluşturucuları bağımsız ParamArray
değişken kullanmamalıdır.
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 ref class SomeClass
{
//...
};
// One required (positional) parameter is applied.
[MyAttribute(false)]
public ref class SomeOtherClass
{
//...
};
// 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 ve set
yöntemleriyle get
ilişkilendirin. Aşağıdaki kod örneği, özniteliğinizde bir özelliğin nasıl uygulanduğunu gösterir:
property bool MyProperty
{
bool get() {return this->myvalue;}
void set(bool value) {this->myvalue = value;}
}
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 ref class DeveloperAttribute : Attribute
{
// Private fields.
private:
String^ name;
String^ level;
bool reviewed;
public:
// This constructor defines two required parameters: name and level.
DeveloperAttribute(String^ name, String^ level)
{
this->name = name;
this->level = level;
this->reviewed = false;
}
// Define Name property.
// This is a read-only attribute.
virtual property String^ Name
{
String^ get() {return name;}
}
// Define Level property.
// This is a read-only attribute.
virtual property String^ Level
{
String^ get() {return level;}
}
// Define Reviewed property.
// This is a read/write attribute.
virtual property bool Reviewed
{
bool get() {return reviewed;}
void set(bool value) {reviewed = value;}
}
};
[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ı DeveloperAttribute
Developer
kullanarak 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)]
<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.