Operator Overloading in VB.Net & C#

0 التعليقات

بسم الله الرحمن الرحيم

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

اللهم علمنا ما ينفعنا وانفعنا بما علمتنا إنك أنت العليم الحكيم
كما نعلم جمعيا فإن لغتي VB.Net و C# توفران مجموعة من العوامل الاساسية لتنفيذ العمليات الأساسية كالجمع والضرب على الأنواع الرئيسية مثل الأرقام والنصوص
فعند تنفيذ الكود التالي
VB.Net
 
C Sharp
فقيمة C الآن تساوي 46 ونفس الفكرة تنطبق على النصوص فبعد تنفيذ الكود التالي
VB.Net
C Sharp
فقيمة C الآن تساوي "Codingproc" إنه نفس "العامل"(+) الذي استخدمناه في المثال السابق إذا تم تطبيقه على أنواع رقمية فإنه يقوم بجمعها وإذا تم تطبيقه على أنواع نصية فإنه يقوم بوصلها.

لكن ماذا إذا أردت أن أن أطبقه على أنواع أخرى من إنشائي لنفترض انه لدي الكلاس
مجلد الذي يحتوي على اسماء عدد معين من الملفات ،وهذا هو الكود الخاص به:
 
VB.Net
C Sharp


منطقياً أو على أرض الواقع يمكنك دمج مجلدين معاً لينتج لديك مجلد يحتوي على الملفات الموجودة في المجلدين السابقين ،لنجرب ان نفعل ذلك في برنامجنا سيكون الكود الخاص بك مشابهاً للكود التالي 
VB.Net

C Sharp

 الآن إذا حاولت تنفيذ هذا الكود فسيظهر لديك خطاٌ مفاده انه لا يمكن تطبيق العامل (+) على الكلاس Folder، ولحل هذه المشكلة توفر لك لغتي VB.Net و C# الكلمة Operator التي تمكنك من تحديد طريقة إستجابة الكلاس او الستركتشر للعامل (مثل [+] في مثالنا) والتي لا تستخدم إلا مع المحددين (محددات الوصول) Public و Shared (الذي يعرف بـStatic في لغة C#)
اما عن طريقة استخدامها فهي مشابهة للـ Functions بشكل كبير لكن تختلف معها في أنه بدل إستخدام الكلمة Function نستخدم الكلمة Operator (هذا بالنسبة لمستخدمي لغة VB.Net).

يبدو ان الفكرة لم تضح لديك إنظر إلى الكود التالي وهو كود الكلاس Folder بعد تعديله ليصبح قابلاً للجمع
 
VB.Net
C Sharp



الآن إذا أعدنا تنفيذ كود الجمع الذي بالأعلى فسيطبع البرنامج


الآن ما هي العوامل التي يمكننا تحديد طريقة إستجابة الكلاس لها
VB.Net
العامل المعاملات
+, -, *, /, \, ^, &, Like, And, Mod, Or, Xor يأخذ عاملين الأول من نفس نوع الكلاس والآخر ليس هنالك نوع محدد له
<<, >> يأخذ عاملين الأول من نفس نوع الكلاس والآخر نوعه (Integer)
=, <> يأخذ عاملين الأول من نفس نوع الكلاس والآخر ليس هنالك نوع محدد له ويعيد (Boolean) وإذا حددت طريقة إستجابة الكلاس لواحد منهما يجب ان تحددها للآخر
<, > يأخذ عاملين الأول من نفس نوع الكلاس والآخر ليس هنالك نوع محدد له ويعيد (Boolean) وإذا حددت طريقة إستجابة الكلاس لواحد منهما يجب ان تحددها للآخر
<= ,>= يأخذ عاملين الأول من نفس نوع الكلاس والآخر ليس هنالك نوع محدد له ويعيد (Boolean) وإذا حددت طريقة إستجابة الكلاس لواحد منهما يجب ان تحددها للآخر
IsTrue, IsFalse يأخذ عامل واحد من نفس نوع الكلاس ويعيد (Boolean) وإذا حددت طريقة إستجابة الكلاس لواحد منهما يجب ان تحددها للآخر

C Sharp
العامل المعاملات
+, -, *, /, ^, &, %, | يأخذ عاملين الأول من نفس نوع الكلاس والآخر ليس هنالك نوع محدد له
<<, >> يأخذ عاملين الأول من نفس نوع الكلاس والآخر نوعه (Integer)
==, != يأخذ عاملين الأول من نفس نوع الكلاس والآخر ليس هنالك نوع محدد له ويعيد (Boolean) وإذا حددت طريقة إستجابة الكلاس لواحد منهما يجب ان تحددها للآخر
<, > يأخذ عاملين الأول من نفس نوع الكلاس والآخر ليس هنالك نوع محدد له ويعيد (Boolean) وإذا حددت طريقة إستجابة الكلاس لواحد منهما يجب ان تحددها للآخر
<= ,>= يأخذ عاملين الأول من نفس نوع الكلاس والآخر ليس هنالك نوع محدد له ويعيد (Boolean) وإذا حددت طريقة إستجابة الكلاس لواحد منهما يجب ان تحددها للآخر
true, false يأخذ عامل واحد من نفس نوع الكلاس ويعيد (Boolean) وإذا حددت طريقة إستجابة الكلاس لواحد منهما يجب ان تحددها للآخر
++, --, ~ يأخذ عامل واحد من نفس نوع الكلاس

 حينما تقوم بكتابة طريقة إستجابة كلاس لعامل ثنائي (أي يقبل معاملين(two arguments)) فلا يجب ان يكون المعاملين من نفس النوع فــفي الكلاس Folder في الأعلى العامل (+) يأخذ معاملين من نوع Folder وهذا ليس ضروري يمكننا كتابة العامل (+) للكلاس Folder مرة أخرى ليأخذ معاملين الأول نصي والثاني من نوع Folder ويضيف المعامل الأول إلى الملفات في المجلد ليصبح الكلاس

VB.Net
C Sharp



وليصبح كود الجمع 
VB.Net
C Sharp



وستكون نتيجة التنفيذ



لنجرب عامل آخر عامل المساواة على سبيل المثال ،عندما تقوم بمقارنة مجلدين في الواقع فما ستقوم به هو إنك سترى إن كان المجلدين يحتويان على نفس الملفات ،وإذا حاولت التعديل على الكلاس Folder فسيصبح قريبا للكود التالي
VB.Net
C Sharp



لنحاول الآن ان نقارن مجلدين يحتويان نفس الملفات

VB.Net
C Sharp

  الآن إذا حاولت تنفيذ هذا الكود فسيظهر لديك خطاٌ مفاده انه يجب عليك ان تحدد طريقة إستجابة الكلاس Folder للعامل <> في VB.Net و != في C# ،وسبق أن ذكرت هذا في الجدول في الأعلى
"وإذا حددت طريقة إستجابة الكلاس لواحد منهما يجب ان تحددها للآخر" لكن ضربت لك هذا المثال لأوضح لك الفكرة ،الآن لنعدل كود الكلاس Folder حتى يصبح قابلا للمقارنة.

VB.Net
C Sharp



ثم إذا نفذت كود المقارنة الذي بالأعلى فستكون النتيجة


 =====================================================

إن أصبت فمن الله ، وإن اخطئت فمني ومن الشيطان  اترككم في امان الله ورعايته 

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

تعابير اللامدا في VisualBasic.NET

0 التعليقات
بسم الله الرحمن الرحيم

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

اللهم علمنا ما ينفعنا وانفعنا بما علمتنا إنك أنت العليم الحكيم

 ====تمهيد====

ما هي تعابير لامدا ؟
هي دالة(Function) او إجراء(Sub) بدون إسم يمكن إستخدامها في أي موضع يمكنك فيه إستخدام الـ"مفوض" Delegates وتتكون من سطر أو أكثر كما سنذكر لاحقا.

لماذا سأستخدم تعابير لامدا بينما يمكنني إستخدام دالة عادية أو مفوض ؟
لإنها مناسبة أكثر للحالات التي ستستخدم فيها الدالة مرة واحدة مثلاً داخل تكرار لحساب ضريبة المبيعات وستجعل الكود يبدو بشكل منظم ☺.

*يكثر إستخدام تعابير لامدا عند إستخدام تقنية LINQ.


====كيفية كتابة تعابير لامدا====

في البداية سنتعرف كيفية كتابة تعابير لامدا التي تتكون من  سطر واحد فقط.

VB.Net



 يوضح المثال السابق كيفية كتابة تعبير لامدا من سطر واحد فقط من نوع (Function) ،في البداية بعد التعريف عن المتغير الذي سنسد إليه التعبير وهو في هذه الحالة (FirstLambda) تقوم بكتابة نوع التعبير إما دالة (Function) أو إجراء(Sub) ثم المعاملات وإذا قمت بتحديد نوع المعامل الأول يجب عليك تحديد باقي أنواع المعاملات ولتعرف مقصدي أنظر للمثال التالي

VB.Net



المثال السابق خاطئ لإنه قمت بتحديد نوع المعامل FParameter هو من نوع Integer أما المعامل الثاني فلم أحدد نوعه وهذا خاطئ ☺ والطريقة الصحيحة هي إما بتحديد نوع المتغيرين أو عدم تحديد نوع المتغيرين معاً ☻.

ثم تقوم بكتابة التعبير ،ولا يجوز إستخدام Return إن كان التعبير من سطر واحد ☻ ولا يجوز تحديد نوع القيمة التي يعيدها التعبير.

الآن لنرى كيفية كتابة تعابير لامدا تتكون من أكثر من سطر.

VB.Net

 هي نفس التعابير التي من سطر واحد لكن مع إستخدام Return ويمكنك إستخدام As لتحديد نوع القيمة التي يعيدها التعبير إن كان دالة.

في الأمثلة السابقة أسندت التعبير لمتغير مثلا لـCharRepetition في المثال السابق لاستخدامه أكثر من مرة ،ويمكنك أيضا أن تكتب التعبير وتنفذه في نفس الوقت ولتفهم الفكرة أنظر للمثال التالي 

VB.Net



ويمكنك تمرير تعابير لامدا كمعامل للدوال أو الإجراءات التي تتطلب مفوض والمثال التالي يوضح الفكرة
VB.Net

في المثال السابق قمت بتمرير تعبير لامدا للدالة Where والتي تقوم بتنفيذه على جميع العناصر،
ومررت تعبير لامدا للإجراء Array.ForEach
 شروط كتابة تعابير لامدا
1- تعبير لامدا لا إسم له.
2- لا يمكن أن يحتوي على محددات وصول أو معدلات مثل Protected ،Overloads.
3- التعابير التي من سطر واحد لا يمكن إستخدام As لتحديد نوع القيمة التي يعيدها التعبير لكن بدلا من ذلك  يتم تحديد نوع القيمة تلقائيا من هيئة التعبير ،مثلا التعبير Parameter.ToCahrArray نوع القيمة التي يعيدها هي مصفوفة حروف.
4-في التعابير التي تتكون من أكثر من سطر كلمة As لتحديد القيمة التي يعيدها التعبير إن كان من نوع دالة هي إختيارية ،إن لم تستخدم As سيتم تحديد النوع الذي يتوافق مع جميع القيم التي يعيدها التعبير ولتعرف مقصدي أنظر للمثال التالي

VB.Net

الدالة السابقة تعيد جذر العدد في حال كان الرقم موجب تعيد جذره وهو من نوع Double ،أما في حال كان الرقم سالب فليس له جذر تعيد 0 وهو من Integer ،فالنوع الذي تعيده الدالة في هذه الحالة هو Double لإنه يمكن تحويل النوع Integer لـ Double والعكس خاطئ.

وللتوضيح أكثر شاهد المثال التالي
VB.Net

الدالة السابقة تعيد جذر العدد في حال كان الرقم موجب تعيد جذره وهو من نوع Double ،أما في حال كان الرقم سالب فليس له جذر تعيد نص("Negative Number") ،في هذه الحالة نوع القيمة التي تعيدها الدالة هو Object لإنه لا يمكن تحويل أي من النوعين للآخر (String to Double , Double to String).

5- التعابير التي من نوع(Function) التي من سطر واحد يجب أن يعيد هذا السطر قيمة ،ولا يكون تعبيرا لتنفيذه فقط، لإنه في التعابير التي من سطر واحد فقط لا توجد كلمة Return وإنما يعيد التعبير القيمة الناتجة عن تنفيذ السطر، أنظر المثال التالي

VB.Net

الدالة السابقة تعيد Boolean وهو ناتج تنفيذ التعبير Str.ToUpper = Str

6- التعبيرات التي تتكون من سطر واحد فقط ،يجب ألا تحتوي على End Function أو End Sub
7- لا يمكنك استخدام Optional أو ParamArray مع المعاملات.

=====================================================
أود أن أنوه أن موضوع (تعابير اللامدا) هو موضوع كبير جداً ،إذا كنت تريد أن تعرف كيفية كتابة تعابير اللامدا فقط فحسبك هذا الموضوع سيحقق لك غايتك ،أما إن كنت تريد التعمق فعليك بالمراجع مثل MSDN وانتظرني بالموضوع القادم ،سنتعمق فيها أكثر إن شاء الله.
======================================================

إن أصبت فمن الله ، وإن اخطئت فمني ومن الشيطان  اترككم في امان الله ورعايته 



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

تعابير اللامدا ،تعابير اللامبدا ،المفوض ،Delegates ،Anonymous Methods ،extension Methods in LINQ

يمكنك النقل من المدونة كيف ما تشاء وبدون ذكر المصدر