Not
Bu sayfaya erişim yetkilendirme gerektiriyor. Oturum açmayı veya dizinleri değiştirmeyi deneyebilirsiniz.
Bu sayfaya erişim yetkilendirme gerektiriyor. Dizinleri değiştirmeyi deneyebilirsiniz.
Ö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ü boolBooleanBoolean byteByteByte charCharChar doubleDoubleDouble floatSingleSingle intIntegerInt32 longLongInt64 shortShortInt16 stringStringString Type.
Öznitelik kullanımı yerinde erişilebilen numaralandırma türleri.
C#
objectdilinde (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.