• 0
عمرو عماد

Attributes & Reflection & Delegates & Events

سؤال

السلام عليكم ورحمة الله وبركاته

كنت أقرأ اليوم في المفاهيم العامة الخاصة بالسي شارب .. وقد فشلت في فهم أربع مفاهيم والمكتوبة في العنوان

 

افهم الــ Events وكيف أستخدمه لكن لا أعلم ما الفرق بينه وبين الـ Delegates  .. ووجدت أن الــ Reflection يعتمد علي الــ Attributes التي لا أعلم ما الفائدة من إستخدامها .. 

 

سألت من قبل في هذا المنتدي الغالي عن الــ Attributes وجزا الله الأخ الذي جاوبني لكني لم أفهم ما الفائدة منها .

بالنسبة للــ Delegate لا أعلم ما الفائدة من عمل دالة تقوم بنداء دالة أخري لها نفس البرامترز أو أمرر لها دالتين لهما نفس البارمترز لتخرج الناتج مرة واحدة .. 

عندي تضاربات كثيرة بشأن الأربع مفاهيم فأتمني أن يكسر لي أخ كريم هذه التضاربات في أقرب وقت حتي أتم الدروس التي أنا بصددها وجزاكم الله خيرا للإطالة

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه

10 إجابة على هذا السؤال .

  • 0

ستفهم ال Delegates   ان قمت بحل هذا الواجب :
استعمل for من واحد حتى 60 ويجب ان تظهر القيم من واحد حتى 60 في تكستبوكس وتتغير كل ثانية 

بمعنى اخر عداد ثواني داخل تكستبوكس باستعمال فور 

 

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه
  • 0

مستعد أعمل أي واجب يساعدني في الفهم .. لكني أخي الكريم لم أفهم الواجب .. هل تقصد أن اعمل عداد ثواني .. يمكنني عمله بالتايمر .. وإن إستخدمت فور لوب فهذا يعني أن لن أستطيع التوقف كل ثانية .. فلابد لي ان استخدم دالة تعطل الحلقة لثانية ثم تكمل .. هذا ما فهمته أرجوا التوضيح ..

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه
  • 0

وعليكم السلام ورحمة الله وبركاته
الموضوع بسيط جداً بإذن الله
سأتحدث بإذن الله عن
Event, Delegate and Attributes
أما
Reflection
فلن أتحدث عنه حيث أن استخدامه نادر ويكون فى حدود معينة

 

أولاً: الحدث
ويعبر عن إجراء معين يتم ربطه بشرط معين بحيث إذا تحقق الشرط ينطلق الحدث ويتم تنفيذ الإجراء
لذلك تجد لكل حدث وظيفة Method يتم تنفيذها عندما ينطلق هذا الحدث ويطلق عليها اسم معالج الحدث
أو Event Handler

ومثال على ذلك حدث النقر للزر والذى يعبر عن الأكواد التى يتم تنفيذها عندما يتحقق شرط معين ألا وهو النقر بالفأرة على هذا الزر

 

من هنا تتضح إحدى فوائد الحدث وهى فائدة عظيمة جداً والمتمثلة فى إمكانية تنفيذ أكواد مستقبلية
بمعنى
لاحظ أن المبرمج الذى كتب كلاس الزر Button Class قد وضع فيه حدث اسمه Click

ثم يأتى المبرمج الذى يستخدم الزر فيقوم بإنشاء معالج الحدث له (عن طريق النقر المزدوج عليه) ثم يكتب الأوامر

وبذلك فإن المبرمج الذى كتب الزر استطاع أن يستدعى وظيفة لم يقم هو بكتابتها ولكن سيقوم بكتابتها المبرمج الذى سيستخدم الزر فيما بعد

ويمكنك أنت أيضاً برمجة كلاس معين وتضع فيه حدث وتترك المبرمج الذى يستخدم هذا الكلاس بمعالجة هذا الحدث فتكون أنت صانع الحدث وسوف تستدعى وظيفة لم تكتب بعد

هذه هى إحدى الفوائد الهامة للحدث

هناك فائدة ثانية وهى الميكنة الآلية:
عبارة عن ربط حدث بشرط معين ليتم معالجته من أماكن مختلفة بطرق مختلفة بناء على ظروف كل مكان

لشرح ذلك إليك المثال التالى:
بفرض أنك تقوم بعمل برنامج مبيعات يحتوى على شاشة لتسجيل العملاء وشاشة لفاتورة الشراء وأخرى لفاتورة البيع وثالثة لمرتجع الشراء ورابعة لمرتجع البيع

والآن نبدأ فى تشغيل البرنامج ونقوم بتسجيل خمسة عملاء ثم نفتح فاتورة البيع فيفترض أن يعرض الخمسة عملاء الذين قمنا بتسجيلهم سابقاً

السؤال الذى قد يتبادر للذهن لو أننا فتحنا فاتورة المبيعات ثم رجعنا لشاشة العملاء وأضفنا عميلاً جديداً، هل سيظهر تلقائياً فى فاتورة المبيعات؟

الإجابة هى لا، لن يظهر إلا إذا أغلقت فاتورة المبيعات وفتحتها من جديد حيث أن تحميل العملاء يتم فى بداية فتح النافذة

أو يمكنك عمل زر بجانب القائمة عندما يتم الضغط عليه يتم تحديث قائمة العملاء

هنا تظهر فائدة الحدث فلو أنك قمت بعمل حدث وليكن اسمه إضافة عميل ويرتبط بشرط معين وهو إضافة عميل من شاشة العملاء فينطلق هذا الحدث

ثم الخطوة الأهم وهى معالجة الحدث فى كل شاشة من شاشات الفواتير أى كتابة المعالج له فى كل شاشة على حدها
فإذا انطلق الحدث يقوم باستدعاء هذا المعالج فماذا تتوقع؟؟؟
تتوقع أنه بعد فتح شاشة المبيعات ترتبط بالحدث فإذا انطلق ، يتم تنفيذ الوظيفة المرتبطة به
فإذا ذهبت لشاشة العملاء وأضفت عميلا جديداً تجد القائمة تم تحديثها تلقائياً  بسبب وجود حدث
إذن أنت تقوم بضبط الحدث وإنشاء المعالج له ثم تنسى الأمر بعد ذلك فبذلك تكون صممت ميكنة آلية فى برنامجك

الموضوع الثانى هو:
Delegate
وهو عبارة عن كيان يستطيع استدعاء وظيفة لها شكل معين
أى أننا نقوم بإنشاء كائن وتحديد شكل الوظيفة التى يمكنه التعامل معها فنستطيع بعد ذلك استخدامه فى استدعاء هذه الوظيفة
وفى الحقيقة فإن الحدث لا يقوم باستدعاء المعالج بنفسه ولكنه يستعين بهذا الديليجيت
 

الموضوع الثالث هو
Attributes
عبارة عن تاج يوضع قبل الكائن (مثل الكلاس) والذى يتسبب فى تغيير كيفية التنفيذ
على سبيل المثال يمكن وضع تاج قبل الكلاس لجعله قابل للتسلسل فيمكن حفظه مثلا على هيئة ملف فيكون التاج مثل
 

Serializablepublic class MyClass{}

أعلم أن الكلام مختصر جداً ولكن الموضوع يحتاج بعض المجهود منك واستشعار أهمية هذه المواضيع
 

تم تعديل بواسطه ema2000_t
0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه
  • 0

مثلا ان كتبت هذا الكود :
 

for(int i=1;i<=60);i++){textbox.text=i.totext;anytimer//wiat second;}

في هذا الكود لن تظهر الارقام في التكست بوكس لأن الكومبايلر يكون داخل الفور ولا يخرج لكي يطبع القيمة في تكست بوكس 
وان نفذت الكود بعد دقيقة ستجد التكست بوكس تحول لقيمة ستين ولن تظهر القيم من واحد حتى 59 

اذا نحتاج الى دالة تخرج من الفور وتطبع القيمة في التكستبوك في كل دورة من الفور  من دون توقف الفور وهذا الدالة تسمى Delegate ويتم نداء هذه الدالة بواسطة دالة invoke 

*الكود (اقصد الفور) تعمل في بروسيس واحد وهذا البروسيس ينفذ سطر بعد سطر ودالة Delegate تنشئ بروسيس ثاني تعمل جنبا بجنب مع بروسيس الكود 
*ان كنت جيدا في البروسيسات والثريد ربما لن تحتاج ل 
Delegate

ارجو ان الفكرة توضحت

تم تعديل بواسطه zaraki_kenpache
0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه
  • 0

نسيت الكود  ههههه

public delegate void DLGT(int i);        public void Zaraki(int i)        {           TextBox1.Text=(i.ToStirng());        }for(int i;i<=60;i++){TextBox1.Invoke(new DLGT(Zaraki), new Object[] { i});System.Threading.Thread.Sleep(1000);//may be second}
0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه
  • 0

وأزيدكم أيضا أخواني الكرام بهذا الكود :

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)      {         //create delegate instances         NumberChanger nc;         NumberChanger nc1 = new NumberChanger(AddNum);         NumberChanger nc2 = new NumberChanger(MultNum);         nc = nc1;         nc += nc2;         //calling multicast         nc(5);         Console.WriteLine("Value of Num: {0}", getNum());         Console.ReadKey();      }   }}When the above code is compiled and executed, it produces the following result:Value of Num: 75

اعلم ما هو الديليجيت وكيف يتم تعريفه وإسناد إليه دوال كما في الكود الي بالأعلي ..

 

ولكن ما الفائدة من هذه الطريقة .. ما أريده عن الديليجين شئ فعال يجعلني أقوم بإستخدامه

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه
  • 0

وأزيدكم أيضا أخواني الكرام بهذا الكود :

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)      {         //create delegate instances         NumberChanger nc;         NumberChanger nc1 = new NumberChanger(AddNum);         NumberChanger nc2 = new NumberChanger(MultNum);         nc = nc1;         nc += nc2;         //calling multicast         nc(5);         Console.WriteLine("Value of Num: {0}", getNum());         Console.ReadKey();      }   }}When the above code is compiled and executed, it produces the following result:Value of Num: 75

اعلم ما هو الديليجيت وكيف يتم تعريفه وإسناد إليه دوال كما في الكود الي بالأعلي ..

 

ولكن ما الفائدة من هذه الطريقة .. ما أريده عن الديليجين شئ فعال يجعلني أقوم بإستخدامه

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه
  • 0

اسمع برمجت برنامج يقوم بطبع ال ip لجميع الحزم وكنت استمع للحزم داخل while غير منتهية 
واردت طباعة كل ip  في ليست بوكس ولم استطع الا ان وجد delegate وتم طباعة ip  في ليستبوكس من دون توقف ال while 
هذا ما عرفته من هذا الموضوع

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه
  • 0

انظر الى هذا الكود يظهر لك اهمية هذا الكود WindowsFormsApplication1.rar

 

فالعداد يعمل فقط بواسطة ثريد مع ديليكيت.اما الاخريات يظهر العدد الاخير من العداد 
وهذا هو الواجب اللذي طلبته منك

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه
  • 0

انظر الى هذا الكود يظهر لك اهمية هذا الكود WindowsFormsApplication1.rar

 

فالعداد يعمل فقط بواسطة ثريد مع ديليكيت.اما الاخريات يظهر العدد الاخير من العداد 
وهذا هو الواجب اللذي طلبته منك

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه

من فضلك سجل دخول لتتمكن من التعليق

ستتمكن من اضافه تعليقات بعد التسجيل



سجل دخولك الان

  • يستعرض القسم حالياً   0 members

    لا يوجد أعضاء مسجلين يشاهدون هذه الصفحة .