الأحد، 22 ديسمبر 2013

برمجة متقدمة سي شارب الصفات C# - Attributes

 الصفات C# - Attributes

برمجة متقدمة سي شارب الصفات C# - Attributes

برمجة متقدمة سي شارب الصفات C# - Attributes


الصفة Attribute 

عبارة عن وسم تصريحي يستخدم لايصال معلومات عن الفئات  والتراكيب  والدوال والمجاميع المرقمة والاسمبلي ...الخ.
فالسمات هي عبارة عن أوسمة ميتاداتا تزود المجمع بالتعليمات والمعلومات مثل الوصف والتعليقات والدوال الى اخره.سي شارب تزودنا بنوعان الاول معرف مسبق والثاني معرف من قبل المستخدم.ويتم حصر السمة بين علامتين [ ].

تحديد السمة الصيغة العامة



[attribute(positional_parameters, name_parameter = value, ...)]
element

أنواع السمات أو الصفات المعرفة مسبقا:-

  1. AttributeUsage
  2. Conditional
  3. Obsolete

 النوع الاول سمة الاستخدام AttributeUsage  

تصف كيف فئة المبرمجة يمكن أن تستخدم بحيث تصف العناصر التي يمكن استخدامها في الفئة المبرمجة من قبلنا.

[AttributeUsage(
   validon,
   AllowMultiple=allowmultiple,
   Inherited=inherited
)]

حيث 
  1. validon  يحدد عناصر اللغة التي يمكن وضعها السمة. بل هو مزيج من قيمة المجاميع المرقمة ل AttributeTargets . والقيمة الافتراضية هي AttributeTargets.All.
  2. allowmultiple باراميتر (اختياري) يوفر قيمة للخاصية AllowMultiple من هذه السمة، قيمة منطقية. إذا كان هذا صحيحا، فإن السمة متعددة الاستخدامات. الافتراضي هو غير صحيح (تستخدم مرة واحدة).
  3. الباراميتر 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

إنشاء صفة من قبل المستخدم

الخطوات التالية  لانشاء صفة من قبل المستخدم.
  1. التصريح عن صفة من قبل المستخدم Custom attribute 
  2. بناء الصفة المصرح عنها.
  3. تطبيق الصفة المستخدم عن العنصر المراد.
  4. الوصول الى الصفة عن طريق Reflection.
الصيغة العامة لتصريح عن الصفة 


//صفة مبرمجة من قبل المستخدم لاصلاح الثغرات
[AttributeUsage(AttributeTargets.Class |
AttributeTargets.Constructor |
AttributeTargets.Field |
AttributeTargets.Method |
AttributeTargets.Property,
AllowMultiple = true)]

public class DeBugInfo : System.Attribute


لبناء الصفة نتبع الخطوات التالية:-


  1. تعريف رقم الثغرة.
  2. تعريف اسم المطور.
  3. تاريخ أخر مرة تم الاطلاع الكود.
  4. اسم الرسالة لتخرين التعليم المبرمج.

مثال كامل على ذلك.



//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
Al alami st
gaza -jabaliaGaza Strip
Palestine
ahmed.almahallawi@gmail.com
DOB: 05/10/1984
by +Ahmed Almahallawi 
22/12/2013


التسميات: