C # - Nitelikler
Bir attributeprogramınızdaki sınıflar, yöntemler, yapılar, numaralandırıcılar, derlemeler vb. gibi çeşitli öğelerin davranışları hakkındaki bilgileri çalışma zamanına iletmek için kullanılan bildirimsel bir etikettir. Bir öznitelik kullanarak bir programa bildirime dayalı bilgi ekleyebilirsiniz. Bildirimsel bir etiket, kullanıldığı öğenin üzerine yerleştirilmiş köşeli ([]) parantezlerle gösterilir.
Öznitelikler, derleyici talimatı gibi meta veriler ve bir programa yorumlar, açıklama, yöntemler ve sınıflar gibi diğer bilgileri eklemek için kullanılır. .Net Framework iki tür öznitelik sağlar: önceden tanımlanmış öznitelikler ve özel oluşturulmuş öznitelikler.
Bir Öznitelik Belirtme
Bir özniteliği belirtmek için sözdizimi aşağıdaki gibidir -
[attribute(positional_parameters, name_parameter = value, ...)]
element
Özelliğin adı ve değerleri, özniteliğin uygulandığı öğeden önce köşeli parantez içinde belirtilir. Konum parametreleri temel bilgileri belirtir ve ad parametreleri isteğe bağlı bilgileri belirtir.
Önceden Tanımlanmış Özellikler
.Net Framework üç önceden tanımlanmış öznitelik sağlar -
- AttributeUsage
- Conditional
- Obsolete
Öznitelik Kullanım
Önceden tanımlanmış öznitelik AttributeUsageözel bir özellik sınıfının nasıl kullanılabileceğini açıklar. Özelliğin uygulanabileceği öğe türlerini belirtir.
Bu özniteliği belirtmek için sözdizimi aşağıdaki gibidir -
[AttributeUsage (
validon,
AllowMultiple = allowmultiple,
Inherited = inherited
)]
Nerede,
Validon parametresi, özniteliğin yerleştirilebileceği dil öğelerini belirtir. Bir numaralandırıcı AttributeTargets değerinin birleşimidir . Varsayılan değer, AttributeTargets.All şeklindedir .
Allowmultiple (isteğe bağlı) parametresi , bu özniteliğin AllowMultiple özelliği için bir Boolean değeri sağlar. Bu doğruysa, özellik çok amaçlıdır. Varsayılan yanlıştır (tek kullanımlık).
Miras alınan parametre (isteğe bağlı), bu özniteliğin Devralınan özelliği için bir Boolean değeri sağlar. Doğruysa, öznitelik türetilmiş sınıflar tarafından miras alınır. Varsayılan değer yanlıştır (miras alınmaz).
Örneğin,
[AttributeUsage(
AttributeTargets.Class |
AttributeTargets.Constructor |
AttributeTargets.Field |
AttributeTargets.Method |
AttributeTargets.Property,
AllowMultiple = true)]
Koşullu
Bu önceden tanımlanmış öznitelik, yürütülmesi belirli bir ön işleme tanımlayıcısına bağlı olan bir koşullu yöntemi işaretler.
Belirtilen değere bağlı olarak yöntem çağrılarının koşullu derlemesine neden olur. Debug veya Trace. Örneğin, bir kodda hata ayıklarken değişkenlerin değerlerini görüntüler.
Bu özniteliği belirtmek için sözdizimi aşağıdaki gibidir -
[Conditional(
conditionalSymbol
)]
Örneğin,
[Conditional("DEBUG")]
Aşağıdaki örnek, özniteliği gösterir -
#define DEBUG
using System;
using System.Diagnostics;
public class Myclass {
[Conditional("DEBUG")]
public static void Message(string msg) {
Console.WriteLine(msg);
}
}
class Test {
static void function1() {
Myclass.Message("In Function 1.");
function2();
}
static void function2() {
Myclass.Message("In Function 2.");
}
public static void Main() {
Myclass.Message("In Main function.");
function1();
Console.ReadKey();
}
}
Yukarıdaki kod derlendiğinde ve yürütüldüğünde, aşağıdaki sonucu verir -
In Main function
In Function 1
In Function 2
Eski
Bu önceden tanımlanmış öznitelik, kullanılmaması gereken bir program varlığını işaretler. Derleyiciye belirli bir hedef öğeyi atmasını bildirmenizi sağlar. Örneğin, bir sınıfta yeni bir yöntem kullanıldığında ve hala eski yöntemi sınıfta tutmak istiyorsanız, eski yöntem yerine yeni yöntemin kullanılması gereken bir mesaj görüntüleyerek onu eski olarak işaretleyebilirsiniz.
Bu özniteliği belirtmek için sözdizimi aşağıdaki gibidir -
[Obsolete (
message
)]
[Obsolete (
message,
iserror
)]
Nerede,
Parametre mesajı , öğenin neden eski olduğunu ve bunun yerine ne kullanılacağını açıklayan bir dizedir.
İserror parametresi bir Boole değeridir. Değeri doğruysa, derleyici öğenin kullanımını bir hata olarak değerlendirmelidir. Varsayılan değer yanlıştır (derleyici bir uyarı oluşturur).
Aşağıdaki program bunu göstermektedir -
using System;
public class MyClass {
[Obsolete("Don't use OldMethod, use NewMethod instead", true)]
static void OldMethod() {
Console.WriteLine("It is the old method");
}
static void NewMethod() {
Console.WriteLine("It is the new method");
}
public static void Main() {
OldMethod();
}
}
Programı derlemeye çalıştığınızda, derleyici şunu belirten bir hata mesajı verir -
Don't use OldMethod, use NewMethod instead
Özel Nitelikler Oluşturma
.Net Framework, bildirime dayalı bilgileri depolamak için kullanılabilen ve çalışma zamanında alınabilen özel özniteliklerin oluşturulmasına izin verir. Bu bilgiler, tasarım kriterlerine ve uygulama ihtiyacına bağlı olarak herhangi bir hedef unsurla ilgili olabilir.
Özel özniteliklerin oluşturulması ve kullanılması dört adımdan oluşur -
- Özel bir öznitelik bildirmek
- Özel özniteliğin oluşturulması
- Özel özniteliği bir hedef program öğesine uygulayın
- Yansıtma Yoluyla Niteliklere Erişim
Son adım, çeşitli gösterimleri bulmak için meta verileri okumak için basit bir program yazmayı içerir. Meta veriler, diğer verileri açıklamak için kullanılan veriler veya bilgilerle ilgili verilerdir. Bu program, çalışma zamanında özniteliklere erişmek için yansımalar kullanmalıdır. Bunu bir sonraki bölümde tartışacağız.
Özel Bir Öznitelik Bildirme
Yeni bir özel öznitelik türetilmelidir System.Attributesınıf. Örneğin,
//a custom attribute BugFix to be assigned to a class and its members
[AttributeUsage(
AttributeTargets.Class |
AttributeTargets.Constructor |
AttributeTargets.Field |
AttributeTargets.Method |
AttributeTargets.Property,
AllowMultiple = true)]
public class DeBugInfo : System.Attribute
Yukarıdaki kodda, DeBugInfo adlı özel bir öznitelik bildirdik .
Özel Nitelik Oluşturma
Herhangi bir programın hata ayıklamasıyla elde edilen bilgileri depolayan DeBugInfo adlı özel bir öznitelik oluşturalım. Aşağıdaki bilgileri saklasın -
- Hatanın kod numarası
- Hatayı tanımlayan geliştiricinin adı
- Kodun son inceleme tarihi
- Geliştiricinin açıklamalarını saklamak için bir dizi mesaj
Debuginfo sınıf ilk üç bilgi ve mesajı saklamak için bir ortak özelliği depolamak için üç özel özellikleri vardır. Dolayısıyla, hata numarası, geliştiricinin adı ve inceleme tarihi, DeBugInfo sınıfının konumsal parametreleridir ve mesaj isteğe bağlı veya adlandırılmış bir parametredir.
Her öznitelik en az bir kurucuya sahip olmalıdır. Konumsal parametreler yapıcıdan geçirilmelidir. Aşağıdaki kod, DeBugInfo sınıfını gösterir -
//a custom attribute BugFix to be assigned to a class and its members
[AttributeUsage(
AttributeTargets.Class |
AttributeTargets.Constructor |
AttributeTargets.Field |
AttributeTargets.Method |
AttributeTargets.Property,
AllowMultiple = true)]
public class DeBugInfo : System.Attribute {
private int bugNo;
private string developer;
private string lastReview;
public string message;
public DeBugInfo(int bg, string dev, string d) {
this.bugNo = bg;
this.developer = dev;
this.lastReview = d;
}
public int BugNo {
get {
return bugNo;
}
}
public string Developer {
get {
return developer;
}
}
public string LastReview {
get {
return lastReview;
}
}
public string Message {
get {
return message;
}
set {
message = value;
}
}
}
Özel Özniteliği Uygulama
Özellik, hedefinin hemen önüne yerleştirilerek uygulanır -
[DeBugInfo(45, "Zara Ali", "12/8/2012", Message = "Return type mismatch")]
[DeBugInfo(49, "Nuha Ali", "10/10/2012", Message = "Unused variable")]
class Rectangle {
//member variables
protected double length;
protected double width;
public Rectangle(double l, double w) {
length = l;
width = w;
}
[DeBugInfo(55, "Zara Ali", "19/10/2012", Message = "Return type mismatch")]
public double GetArea() {
return length * width;
}
[DeBugInfo(56, "Zara Ali", "19/10/2012")]
public void Display() {
Console.WriteLine("Length: {0}", length);
Console.WriteLine("Width: {0}", width);
Console.WriteLine("Area: {0}", GetArea());
}
}
Sonraki bölümde, bir Reflection sınıfı nesnesi kullanarak öznitelik bilgilerini alacağız.