برمجة متقدمة سي شارب الصفات C# - Attributes
الصفات C# - Attributes
الصفة Attribute
عبارة عن وسم تصريحي يستخدم لايصال معلومات عن الفئات والتراكيب والدوال والمجاميع المرقمة والاسمبلي ...الخ.
فالسمات هي عبارة عن أوسمة ميتاداتا تزود المجمع بالتعليمات والمعلومات مثل الوصف والتعليقات والدوال الى اخره.سي شارب تزودنا بنوعان الاول معرف مسبق والثاني معرف من قبل المستخدم.ويتم حصر السمة بين علامتين [ ].
تحديد السمة الصيغة العامة
[attribute(positional_parameters, name_parameter = value, ...)]
element
أنواع السمات أو الصفات المعرفة مسبقا:-
- AttributeUsage
- Conditional
- Obsolete
النوع الاول سمة الاستخدام AttributeUsage
تصف كيف فئة المبرمجة يمكن أن تستخدم بحيث تصف العناصر التي يمكن استخدامها في الفئة المبرمجة من قبلنا.
[AttributeUsage( validon, AllowMultiple=allowmultiple, Inherited=inherited )]
حيث
- validon يحدد عناصر اللغة التي يمكن وضعها السمة. بل هو مزيج من قيمة المجاميع المرقمة ل AttributeTargets . والقيمة الافتراضية هي AttributeTargets.All.
- allowmultiple باراميتر (اختياري) يوفر قيمة للخاصية AllowMultiple من هذه السمة، قيمة منطقية. إذا كان هذا صحيحا، فإن السمة متعددة الاستخدامات. الافتراضي هو غير صحيح (تستخدم مرة واحدة).
- الباراميتر inherited (اختياري) يوفر قيمة للخاصية الموروثة من هذه السمة، قيمة منطقية. وإذا كان صحيحا، ورثت السمة التي كتبها الفئات المشتقة. القيمة الافتراضية هي غير صحيح (لا يورث).
مثال
[AttributeUsage(AttributeTargets.Class | AttributeTargets.Constructor | AttributeTargets.Feild | AttributeTargets.Method | AttributeTargets.Property, AllowMultiple = true)]
النوع الثاني السمة الشرطية Conditional
تمثل هذه السمة المحددة مسبقا دالة مشروطة الذي يعتمد تنفيذها على المعرف المحدد . على سبيل المثال عند استدعاء رسالة اثناء عملية الدبق او مقتنص الاخطاء Debug.
الصيغة العامة :-
مثال عام
تحميل الكود
الناتج
تستخدم هذا لاهمال الكود نفترض ان لديك دالتين الاول قديمة والثانية جديدة واردت ان لا يستخدم المستخدم الدالة القيديمة نستخدم الخاصية مهمل ونطبع له رسالة تخبره ان يستخدم الدالة الجديدة.
الصيغة العامة:-
الناتج:-
الصيغة العامة :-
[Conditional( conditionalSymbol )]
مثال
[Conditional("DEBUG")]
مثال عام
#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(); } }
تحميل الكود
الناتج
In Main function In Function 1 In Function 2
النوعة الثالث صفة مهمل Obsolete
الصيغة العامة:-
[Obsolete( message )] [Obsolete( message, iserror )
مثال عام:-
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(); } }
الناتج:-
Don't use OldMethod, use NewMethod instead
إنشاء صفة من قبل المستخدم
الخطوات التالية لانشاء صفة من قبل المستخدم.
- التصريح عن صفة من قبل المستخدم Custom attribute
- بناء الصفة المصرح عنها.
- تطبيق الصفة المستخدم عن العنصر المراد.
- الوصول الى الصفة عن طريق Reflection.
الصيغة العامة لتصريح عن الصفة
//صفة مبرمجة من قبل المستخدم لاصلاح الثغرات [AttributeUsage(AttributeTargets.Class | AttributeTargets.Constructor | AttributeTargets.Field | AttributeTargets.Method | AttributeTargets.Property, AllowMultiple = true)] public class DeBugInfo : System.Attribute
لبناء الصفة نتبع الخطوات التالية:-
- تعريف رقم الثغرة.
- تعريف اسم المطور.
- تاريخ أخر مرة تم الاطلاع الكود.
- اسم الرسالة لتخرين التعليم المبرمج.
مثال كامل على ذلك.
//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; } } }
تطبيق على الصفة:-
[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()); } }
Ahmed Ata Almahallawi
Freelancer
IT
IT Help Desk,
SEO experience,PHP,C#,ASPX
SEO experience,PHP,C#,ASPX
Al alami st
gaza -jabalia, Gaza Strip
Palestine
ahmed.almahallawi@gmail.com
DOB: 05/10/1984
by +Ahmed Almahallawi
by +Ahmed Almahallawi
22/12/2013
التسميات: advance-csharp
<< الصفحة الرئيسية