الاثنين، 6 يناير 2014

برمجة متقدمة سي شارب ماهو التفويض C# - Delegates

برمجة متقدمة سي شارب ماهو التفويض C# - Delegates

برمجة متقدمة سي شارب ماهو التفويض Delegates
التفويض delegate

ماهو التفويض C#  Delegates

التفويض Delegate عبارة عن كائن يقوم بمهمة المؤشرات في السي بلس بلس ولغة السي فهو نوع بيانات ذات القيمة المرجعية يشير الى دالة اي مرجع للدالة.بمعنى أخر  هو متدوب أو مفوض للدالة فبدلا من أن يقوم البرنامج مناداة الدالة فان المفوض أو التفويض delegate هو من يقوم من مناداة الدالة بطريقة غير مباشرة.يستخدم التفويض delegate مع الاحداث والدوال التي يتم استدعاءها عكسيا اي الى الوراء call-back  methods.

شروط تعريف التفويض delegate

1- لتعريف التفويض delegate يجب تحديد نوع البيانات التي سوف تعيدها الدالة المراد تعريف تفويض delegate لها وهنا نقصد نوع صحيح او نصي او void الى أخره.
2- لتعريف التفويض delegate يجب أيضا تحديد عدد الباراميترات ونوعها المراد تمريرها عبر الدالة أي بمعني يجب أن تكون باراميترات التفويض delegate مطابقة لباراميترات الدالة المراد تطبيق عليها التفويض delegate.

خذ على سبيل المثال التفويض delegate التالي.

public delegate int MyDelegate (string s);

الصيغة العامة لتعريف التفويض delegate

delegate <نوع البيانات> <اسم التفويض> <الباراميترات>

تهئية التفويض delegate

بمجرد ان تم انشاء التفويض delegate فيجب عندها يجب تهئية التفويض delegate باستخدام الكلمة المحجوزة new.
اي بمعنى انشاء مثيل للتفويض delegate.

public delegate void printString(string s);
...
printString ps1 = new printString(WriteToScreen);
printString ps2 = new printString(WriteToFile);

مثال على التفويض delegate

في المثال التالي انشاءنا التفويض delegate للدالة بالمرجع بحيث تأخد باراميتر لعدد صحيح وتعيد لنا قيمة لعدد صحيح.

using System;

delegate int NumberChanger(int n);
namespace DelegateAppl
{
   class TestDelegate
   {
      static int num = 10;
      public static int AddNum(int p)
      {
         num += p;
         return num;
      }

      public static int MultNum(int q)
      {
         num *= q;
         return num;
      }
      public static int getNum()
      {
         return num;
      }

      static void Main(string[] args)
      {
         //انشاء مثيلات التفويض
         NumberChanger nc1 = new NumberChanger(AddNum);
         NumberChanger nc2 = new NumberChanger(MultNum);
         //استدعاء الدوال عن طريق التفويض
         nc1(25);
         Console.WriteLine("Value of Num: {0}", getNum());
         nc2(5);
         Console.WriteLine("Value of Num: {0}", getNum());
         Console.ReadKey();
      }
   }
}

ناتج مثال التفويض delegate

Value of Num: 35
Value of Num: 175

التفويض البث او الارسال المتعدد multicasting delegate

يمكن جمع التفويض delegate مع المشغل + بحيث يصبح التفويض delegate المركب من تفويضين اثنيين .فقط يتم جمع التفويضات من نفس النوع.  وكذلك المشغل - يمكن فك التفويض delegate المركب.
والفائدة منها ان يمكن استدعاء قائمة من الدول عند استدعاء التفويض delegate المركب وهذا ما يسمي التفويض delegate البث او الارسال المتعدد 

مثال على التفويض delegate البث المتعدد 


using System;

delegate int NumberChanger(int n);
namespace DelegateAppl
{
   class TestDelegate
   {
      static int num = 10;
      public static int AddNum(int p)
      {
         num += p;
         return num;
      }

      public static int MultNum(int q)
      {
         num *= q;
         return num;
      }
      public static int getNum()
      {
         return num;
      }

      static void Main(string[] args)
      {
         //انشاء مثيلات التفويض
         NumberChanger nc;
         NumberChanger nc1 = new NumberChanger(AddNum);
         NumberChanger nc2 = new NumberChanger(MultNum);
         nc = nc1;
         nc += nc2;
         //استدعاء التفويض البث المتعدد
         nc(5);
         Console.WriteLine("Value of Num: {0}", getNum());
         Console.ReadKey();
      }
   }
}

ناتج التفويض delegate البث المتعدد

Value of Num: 75

مثال على استخدام التفويض delegate

using System;
using System.IO;

namespace DelegateAppl
{
   class PrintString
   {
      static FileStream fs;
      static StreamWriter sw;
      // الاعلان او التصريح عن التفويض
      public delegate void printString(string s);

      //دالة للطباعة عة شاشة الكونسل
      public static void WriteToScreen(string str)
      {
         Console.WriteLine("The String is: {0}", str);
      }
      //دالة لكتابة على الملفل
      public static void WriteToFile(string s)
      {
         fs = new FileStream("c:\\message.txt",
         FileMode.Append, FileAccess.Write);
         sw = new StreamWriter(fs);
         sw.WriteLine(s);
         sw.Flush();
         sw.Close();
         fs.Close();
      }
      // هذه الالة تستخد الباراميتر للتوفيض
      //استدعاء الدالة عند الحاجة
      public static void sendString(printString ps)
      {
         ps("Hello World");
      }
      static void Main(string[] args)
      {
         printString ps1 = new printString(WriteToScreen);
         printString ps2 = new printString(WriteToFile);
         sendString(ps1);
         sendString(ps2);
         Console.ReadKey();
      }
   }
}

ناتج مثال التفويض delegate

The String is: Hello World




Ahmed Ata Almahallawi
Freelancer
IT Help Desk,
SEO experience,PHP,C#,ASPX,SQL
Al alami st
gaza -jabaliaGaza Strip
Palestine
DOB: 05/10/1984
by +Ahmed Almahallawi 
6/1/2014


التسميات: