دورة LINQ

ملفّات مشابهة
المحاضرة الثانية

Microsoft Word - C#2

Microsoft Word - Excel VBA

Microsoft Word - Oracle1

Microsoft Word - Access VBA

) NSB-AppStudio برمجة تطبيقات األجهزة الذكية باستخدام برنامج ( ) برمجة تطبيقات األجهزة الذكية باستخدام برنامج ( NSB-AppStudio الدرس األول ) 1 ( الدرس

جامعة حضرموت

ABU DHABI EDUCATION COUNCIL Abu Dhabi Education Zone AL Mountaha Secondary School g-12 science section Mathematics Student Name:.. Section: How Long i

السالم عليكم و رحمة هللا شرح ربط قاعدة بيانات Access بال.. C# مذا ستستفيد من هذا الموضوع!! -معرفة طريقة صنع قاعدة بيانات بالAccess -ربط قاعدة البيانات

الدرس : 1 مبادئ ف المنطق مكونات المقرر الرسم عناصر التوج هات التربو ة العبارات العمل ات على العبارات المكممات االستدالالت الر اض ة: االستدالل بالخلف ا

مختبر البرمجة والتحليل العددي قسم علوم الجو جمل التحكم والشرط والتكرار المرحلة الثانية PROGRAM CONTROL, CONDITION AND LOOP STATEMENTS الجمل الشرطية :-

Determinants

الشريحة 1

مكثف الثالثة الوحدة البوابات املنطقية 1 هاتف : مدارس األكاد م ة العرب ة الحد ثة إعداد المعلم أحمد الصالح

Slide 1

Microsoft Word - SolutionOOPFinal2011.doc

Microsoft Word - new.doc

Banner – Hold Information SOAHOLD

الحل المفضل لموضوع الر اض ات شعبة تقن ر اض بكالور ا 2015 الحل المفص ل للموضوع األو ل التمر ن األو ل: 1 كتابة و على الشكل األس. إعداد: مصطفاي عبد العز

وزارة الترب ة بنك األسئلة لمادة علم النفس و الح اة التوج ه الفن العام لالجتماع ات الصف الحادي عشر أدب 0211 / 0212 األولى الدراس ة الفترة *************

الفصل الثاني

Schedule Planner User Guide Target Audience: Students This tool can help you better plan your course schedule by generating a visual representation of

استنادا الى احكام البند )ثالثا ( من المادة )08( من الدستور واحكام البند )2( من المادة )4( من امر سلطة االئتالؾ المؤقته )المنحلة( رقم )65( لسنة 2884 )ق

How To Make Connection Between Oracle DB Server 9i & Oracle Developer 6i

اختر عنوان مناسب

برمجة NXT والخوارزميات تتبع الخط سلسلة دروس الروبوت التعل م قسم برمجة NXT والخوارزم ات تتبع الخط )حساس الضوء واأللوان( 1

عربي Sign-Code Website Guide فيما يلي دلي ا ل لطلب اسم مستخدم جديد لConnect Sell من خ لل موقع.Sign-Code يسمح لك الموقع بالدخول اإلداري على اسم المستخد

التاريخ: االمتحان النهائي لمساق برمجة متقدمة תכנות מתקדם موعد أ الزمن: ساعتان فقط الخميس 2017/7/27 )10 عالمات( السؤال األول for او )while الالزمة لما

كيفية تفعيل خدمة IIS ونشر موقع ويب على الشبكة احمللي السالم عليكم اصدقائي الكرام في هذا الكتاب سنتناول ما هي خدمة المعلومات وكيفية التفعيل ونشر الموقع

الأول في السي شارب((c#للمبتدائين

دليل الحسابات دل ل الحسابات هو عبارة عن نافذة تحوي شجرة حسابات افتراض ة تضم هذه الشجرة األنواع الثالثة لتصن ف الحسابات وه حسابات ( المتاجرة األرباح وا

( IP Address ) العنوان الشبكي

8 مادة إثرائية وفقا للمنهاج الجديد األساسي الثامن للصف الفصل الدراسي األول إعداد املعلم/ة: أ. مريم مطر أ. جواد أبو سلمية حقوق الطبع حمفوظة لدى املكتبة

WHAT’S NEW

اردوينو – الدرس الثامن – تغيير درجة الالوان لـ RGB LED

OtterBox Global Warranty Final _multi_final.xlsx

نظرية الملاحظة

Principles of C++ (Precedence)

جامعة العقيد الحاج لخضر - باتنة - 1 كلية العلوم االقتصادية والتجارية وعلوم التسيير قسم التعليم األساسي مادة II دروس وتطبيقات الرياضيات لطلبة السنة األ

السالم عليكم ورحمة هللا وبركاتة كتاب تعلم برمجة االلعاب بأستخدام محرك االلعاب Unity 3D الكتاب مقدم من االستاذ : عماد عارف التوي موقع : Home OF Games ا

دليل المستخدم لبوابة اتحاد المالك التفاعلية

الوحدة التاسعة

ورقة عمل الدرس الثاني تطبيقي اخلاص على هاتفي... برنامج App Inventor اعداد املعلمة : اماني ممدوح املصري مدرسة امحد شوقي الثانوية للبنات اختار اإلجابة ا

الدوال في اكسل الدوال: هي صيغ معرفة مسبقا تقوم بإجراء عمليات حسابية بإستخدم قيم محددة ووسائط مسماة في ترتيب بنية معينة بناء الدالة: إغالق. يبدأ بناء ا

Allomani Warehouse User Guide

جاهعة الوسيلة هركز الشبكات و أنظوة اإلعالم و االتصال والتعلين الوتلفز و التعلين عن بعد مودل Moodle التعل م نظام استخدام "دل ل االلكترون للطلبة" نظام ا

الصفة المشبَّهة باسم الفاعل

The Global Language of Business دليل ارشادي الستخدام صفحة خدمات الشركات األعضاء Members Area 1

جامعة عجلون الوطن ة Ajloun National University كلية إدارة األعمال الخطة الدراسية لنيل درجة في الماجستير تخصص إدارة اإلعمال

الدليل التدريبي لتسجيل منتج البوابة االلكترونية للمطابقة )سابر( الدليل التدريبي لتسجيل منتج 0

Oligopoly

دولة فلسطين و ازرة التربية والتعليم العالي المبحث: تكنولوجيا المعلومات / النظري بسم هللا الرحمن الرحيم مدة االمتحان : ساعتان نموذج تجريبي مجموع العالم

متطلبات النظام متطلبات جهاز الكمبيوتر الشخصي معالج Pentium 1 Intel غيغا هرتز أو أسرع نظام التشغيل Windows 2000 أوXP Windows مع Service Pack 2 أو Vista

المملكة العربية السعودية م ق س ..../1998

دليل تدريبي : الحلول لما بعد اختراق الحسابات إعداد : محمد المسقطي Mohammed Al-Maskati بمساعدة : علي السباعي Ali Sibai

( اختبارات الفروق لعينتين مستقلتين Samples) 2) Independent مان- ويتني( U (Mann-Whitney ب( نحتاج الى ھذا القانون الغراض المقارنة بين مجموعتين او عينتين

R.A.K Chamber of Commerce & Industry Studies & Commercial Cooperation Directorate Economic Studies Section 0802 /80/80 غرفة تجارة وصناعة رأس الخيمة إد

حساب ختام موازنة السلطة المركز ة للسنة المال ة 2013 م قسم) 21 (:وزارة التعل م العال والبحث العلم فرع ( 3 ) :مستشف الكو ت الجامع

المكونات

كل ة االقتصاد وعلوم الس اس ة االسئلة االسترشاد ة لطلبة التعل م عن بعد لمادة نظر ة التنظ م قسم:االدارة. لسنة: أوال:أختر االجابة الصح حة: مكن

Microsoft Word - moneybookers

أ متطلبات التأش رة قص رة المدة عز زنا العم ل برجاء التأكد من النقاط التال ة: - تم تقد م الطلب للحصول على التأش رة ف مكتب ف إف إس جلوبال مكتب تأش رات م

Microsoft Word - AR_ _UM TLCD - KBRC01A.doc

عرض تقديمي في PowerPoint

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

Microsoft Word - Sample Weights.doc

بسم اهلل الرمحن الرحيم الوحدة الثانية الفيجول بيسك Microsoft VISUAL BASIC احلمد اهلل الذي أكرمين و منحين الفرصة لتوفري لكم هذا امللخص املنقى للوحدة ال

بسم هللا الرحمن الرحيم المادة: مقدمة في بحوث العمليات )100 بحث ) الفصل الدراسي األول للعام الدراسي 1439/1438 ه االختبار الفصلي الثاني اسم الطالب: الرق

AlZuhour Private School مدرسة الزهور الخاصة Term 1 Plan Subject Arabic Grade 2 Term 1 Contents ( كتاب الطالب ) الوحدة األولى :) صح تك بين يد

R.A.K Chamber of Commerce & Industry Studies & Commercial Cooperation Directorate Economic Studies Section 5510 /50/11 غرفة تجارة وصناعة رأس الخيمة إد

عرض تقديمي في PowerPoint

REPUBLIQUE ALGERIENNE DEMOCRATIQUE ET POPULAIRE وزارة التعليم العالي والبحث العلمي Ministère de l enseignement supérieur et de la recherche scientifiq

Department of Computer Information Systems

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

PowerPoint Presentation

الدليل التدريبي لطلب شهادة مطابقة إرسالية )للمنتجات المستوردة( البوابة االلكترونية للمطابقة )سابر( الدليل التدريبي لطلب شهادة مطابقة إرسالية )للمنتجات

جامعة جدارا Jadara University كلية: الدراسات التربوية

Microsoft Word - CO_RT10

Microsoft Word - 1-NURSE CALL SYSTEM

Slide 1

كل ة الترب ة األساس ة مكتب الترب ة العمل ة بطاقة تقو م الطالب المعلم تخصص اللغة االجنلل ي ة 02 / 02 المجنطقة التعل م ة:... العام الدراس : م... : المرح

التعصيب و الحجب

riyadh-geeks-mobile-first

المحاضرة العاشرة الجديده لالساليب الكميه في االداره الفصل الثاني لعام 1439 ه للدكتور ملفي الرشيدي يجب الرجوع للمحاضره المسجله لفهم الماده وامثلتها تحل

عرض تقديمي في PowerPoint

عرض تقديمي في PowerPoint

Microsoft Word - e.doc

قوانين اإلستعارة هذه هي قوانين اإلستعارة التي تسري في المكتبات الشعبية في كل من بيورهولم, نوردمالينغ, روبيرت فورش, اوميو, فيندلن و فيينسس. بطاقة المكت

اجيبي علي الاسئلة التالية بالكامل:

اختبار تحليل التباين األحادي و اختبار كرودكال والس الالمعلمي يبين السؤال التالي ست مجموعات من دول العالم توضح نسبة التحضر في كل منها حسب الموجود في ال

1 درس :

النسخ:

دورة LINQ Language-Integrated Query بقلم: محمد سامر أبو سلو mosamersa@yahoo.com samerselo2005@hotmail.com هذا الكتاب عتبر دورة تعر ف ة بتقن ة Linq نشرح ف ها التقن ات الجد دة ف ف جول ستود و 2008 والمتعلقة بهذه التقن ة مع شرح لص ؽة كتابة االستعالمات باستخدامها وذلك عبر مزوداتها المختلفة مع العد د من األمثلة التوض ح ة

2

فهرس الموضوعات العنوان مقدمة مزودات Linq - LINQ Providers بن ة استعالمات Linq معامالت استعالم Linq مواض ع متعلقة بتقن ة Linq البد من اإلطالع عل ها... االستدالل المحل على النوع Local Type Inference... األنواع المجهولة Anonymous Types Lambda Expressions...... تعاب ر لمدا ف العمق Object Initializers... ترق ة مشار ع 2005 لتعمل على 2008 ثم إضافة دعم Linq لتلك المشار ع Linq وأساس ات استعالمات Linq To Object Linq To DataSet مثال عمل على Linq To DataSet مع استخدام Lambda Expressions مقدمة ف Linq to XML بعض استخدامات Linq TO XML تعرؾ على Linq to SQL و O/R Designer Linq To Sql Master/Detail مثال سر ع عن ك ف ة إنشاء فئات Linq To SQL دو ا أمثلة على استعالمات Linq االستعالمات المترجمة Compiled Queries رقم الصفحة 4 5 6 7 10 10 12 16 20 28 30 32 36 38 42 45 48 50 53 56 59 3

دورة LINQ بسم اهلل الرمحن الرحيم يقذية تض ؾ Linq إمكان ات استعالم ة بإمكان ات بس طة وقو ة لف جول با ز ك عندما تتعامل مع العد د من أنواع الب انات المختلفة فباإلضافة إلى إرسال االستعالم إلى قاعدة ب انات ك تتم معالجته أو العمل مع ص ؽة مختلفة لالستعالم لكل نوع من أنواع الب انات الت تقوم بالبحث عنها. تقدم Linq االستعالمات كجزء من لؽة ف جول با ز ك مستخدمة ص ؽة موحدة بؽض النظر عن نوع الب انات الذي تستخدمه. وه تمكنك من االستعالم عن الب انات من قاعدة ب انات SQL Server أو Xml أو المجموعات والمصفوفات ف الذاكرة أو ADO.net Datasets األمر الذي جعلها قادرة على االستعالم من أي قاعدة ب انات مكن ربطها مع DataSet أو أي مصدر ب انات محل أو بع د دعم Linq ح ث مكنك عمل ذلك كله باستخدام عناصر لؽة ف جول با ز ك الشائعة ألن استعالماتك أصبحت مكتوبة بلؽة ف جول با ز ك ونتائج االستعالم تعاد كؤؼراض أنواع ب انات قو ة داعمة IntelliSense مما جعل كتابتك للكود أسرع واكتشافك لألخطاء ف االستعالمات عند ترجمة المشروع بدال من وقت التنف ذ كما أن استعالمات Linq مكن أن تكون مصدرا الستعالمات إضاف ة لمز د من الدقة ف البحث. كما مكن ربطها مع التحكمات ممكنا المستخدم من استعراض وتعد ل نتائج استعالمك بسهولة. وهذا مثال عن استعالم بس ط ع د قائمة شركات الزبائن الموجود ن ف إ طال ا Dim itacus = From cus In NwDs.Customers _ Where cus.country = "Italy" _ Select cus.contactname, cus.companyname دعنا ال نقلق اآلن بخصوص ص ؽة االستعالم على كل حال إن كنت متمكنا من كتابة استعالمات س كول س رفر لن تجد صعوبة ف فهم ص ؽتها بما أن الص ؽة مشابهة مع بعض االختالفات طبعا واالستعالم السابق ماثل استعالم س كول س رفر التال SELECT COMPANYNAME FROM CUSTOMERS WHERE COUNTRY='Italy' كما مكن أن كون استعالم Linq أكثر تعق د فالكود التال ع د قائمة بالزبائن و ع د تجم عهم حسب الموقع Dim customers As List(Of Customer) = GetCustomerList() Dim customersbycountry = From cust In customers _ Order By cust.country, cust.city _ Group By CountryName = cust.country _ Into RegionalCustomers = Group, Count() _ Order By CountryName For Each country In customersbycountry Console.WriteLine(country.CountryName & _ " (" & country.count & ")" & vbcrlf) For Each customer In country.regionalcustomers Console.WriteLine(vbTab & customer.companyname & _ " (" & customer.city & ")") Next Next ح ث مكننا استخدام استعالم Linq ف برنامجنا بعدة أشكال فالمثال األول مثال مكننا عرض نت جته ف DataGrid مباشرة Me.DataGridView1.DataSource = itacus.tolist 4

أو مكننا إدخاله ضمن حلقة الشركات ف ListBox For Each مثال واستخدام النتائج فف المثال التال نستخدم االستعالم الوارد بالمثال األول إلظهار قائمة Me.ListBox1.Items.Clear() For Each cust In itacus Me.ListBox1.Items.Add(cust.CompanyName) Next LINQ Providers - يزودات Linq Linq ؤخذ المزود قوم مزود Linq بتنظ م استعالمات Linq ف ف جول با ز ك بحسب مصدر الب انات الذي تستخدمه فعندما تكتب استعالم ذلك االستعالم و ترجمه إلى أوامر ستط ع مصدر الب انات تنف ذها و قوم أ ضا بتحو ل الب انات من األؼراض المصدر ة ل شكل نتائج االستعالم وأخ را قوم بتحو ل األؼراض إلى ب انات عندما ترسل التحد ثات للمصدر. و ضم ف جول با ز ك مزودات Linq التال ة: Linq to Objects مكنك هذا المزود من االستعالم ف المجموعات والمصفوفات ف الذاكرة إذا كانت ؼرضك دعم الواجهة IEnumerable(T) بح ث مكنك المزود من االستعالم عنها و مكنك تمك ن هذا المزود باست راد IEnumerable أو الواجهة المجال System.Linq والذي كون مستوردا بشكل افتراض ف مشار ع ف جول با ز ك SQL Server والتحد ث إل ها و جعل من السهل ربط أؼراض Linq to SQL مكنك هذا المزود من االستعالم من قواعد ب انات التطب ق مع الجداول واألؼراض ف قواعد الب انات. و سهل ف جول با ز ك العمل مع Linq to SQL بتقد م Object Relational O/R ف التطب ق رتبط مع األؼراض ف قاعدة الب انات و قدم ال Object Model والذي مكنك من إنشاء Designer DataContext الذي د ر االتصال مع قاعدة Designer إمكان ة التعامل مع اإلجراءات والوظائؾ المخزنة وإجراءات الؽرض الب انات و خزن الحالة من أجل تصادم الب انات التفاإل Xml الموجودة ف الذاكرة أو مكنك Xml والتعد ل عل ها بح ث مكنك تعد ل محتو ات Linq to Xml مكنك من االستعالم من تحم ل ملؾ Xml أو حفظه Linq للتطب قات الت تستخدم ADO.net Datasets والتعد ل عل ها وإضافة قوة Linq to Dataset مكنك من االستعالم من Datasets تسهل وتوسع إمكان ات االستعالم والتجم ع والتحد ث ف ال Dataset ف تطب قك 5

بنية اسحعاليبت Linq شار عادة إلى استعالم Linq بتعب ر االستعالم وهو تؤلؾ من تول فة من تراك ب االستعالم الت تحدد مصدر الب انات ومتؽ رات التكرار الخاصة باالستعالم كما مكنه أن تضمن تعل مات من أجل الفرز أو التصف ة أو التجم ع أو الضم أو الحساب ل تم تطب قها على الب انات المصدر ة وص ؽتها تكون مشابهة لص ؽة ال SQL ولهذا ستجد أن معظم الص ؽة مؤلوفة. بدأ االستعالم بقسم From الذي حدد مصدر الب انات والمتؽ رات الت تش ر إلى كل عنصر من الب انات المصدر ة بشكل مستقل وه تدعى بمتؽ رات المجال أو متؽ رات التكرار وقسم From مطلوب من أجل االستعالم إال ف استعالمات التجم ع Aggregate ح ث كون قسم From ف ها اخت اري وبعد تعر ؾ مجال ومصدر االستعالم ف قسم From أو ف قسم Aggregate مكنك تضم ن أي ترك ب من أقسام االستعالم. فمثال االستعالم التال حدد مصدر مجموعة من ب انات الزبائن بالمتؽ ر Customers ومتؽ ر التكرار cust Dim queryresults = From cust In customers _ Select cust.companyname وهذا المثال شكل استعالم مقبول بذات نفسه ومع ذلك صبح االستعالم أقوى عندما تض ؾ أقسام استعالم أخرى لتحد د النتائج فمثال مكنك إضافة قسم Where لتصف ة النتائج إلى ق مة أو أكثر وتكون تعاب ر االستعالم عبارة عن سطر واحد من الكود بح ث مكنك إضافة أقسام استعالم جد دة لنها ة االستعالم كما مكنك فصل االستعالم إلى عدة أسطر لتحس ن قراءة كودك باستخدام المحرؾ _ و مثل الكود التال استعالما ستخدم قسم Where Dim queryresults = From cust In customers _ Where cust.country = "USA" و مثل قسم select قسم قوي آخر ف االستعالم ح ث مكنك من إعادة الحقول المختارة فقط من مصدر الب انات وتع د استعالمات Linq مجموعة تعداد ة من األؼراض القو ة النوع كما مكنها إعادة أنواع مجهولة أو أنواع معروفة. و مكن استخدام قسم select للعودة بحقل واحد فقط من مصدر الب انات وعندما تفعل هذا كون نوع المجموعة المعادة هو نوع ب انات ذلك الحقل. وعندما ع د قسم Select مجموعة من الحقول من مصدر الب انات تكون المجموعة المعادة من النوع المجهول و مكنك مطابقة الحقول المعادة من االستعالم مع حقول من نوع معروؾ محدد و ظهر الكود التال تعب ر استعالم ع د مجموعة نوعها مجهول تضم أرقاما مع ب انات من الحقل المحدد من مصدر الب انات Dim queryresults = From cust In customers _ Where cust.country = "USA" _ Select cust.companyname, cust.country مكن استخدام استعالمات Linq لدمج عدة مصادر من الب انات ف نت جة واحدة ح ث مكن عمل هذا باستخدام قسم From واحد أو أكثر أو باستخدام أقسام Join أو Group Join و ظهر الكود التال تعب ر استعالم ضم ب انات Customer و Order و ع د مجموعة من نوع مجهول تحتوي ب انات من Customer و Order Dim queryresults = From cust In customers, ord In orders _ Where cust.customerid = ord.customerid _ Select cust, ord مكنك استخدام قسم Group Join لبناء استعالمات شجر ة تحتوي مجموعة من أؼراض Customer وكل ؼرض Customer متلك خاص ة تحتوي مجموعة تتضمن جم ع أؼراض order لذلك الزبون. و ظهر المثال التال تعب ر استعالم دمج ب انات Customer و Order كنت جة شجر ة و ع د مجموعة من نوع مجهول و ع د االستعالم نوعا تضمن الخاص ة CustomerOrders تحتوي على مجموعة تحتوي على مجموعة من ب انات Order وب انات Customer وتتضمن أ ضا الخاص ة OrderTotal تحتوي على مجموع إجمال الطلبات لذلك الزبون Dim queryresults = From cust In customers _ Group Join ord In orders On _ cust.customerid Equals ord.customerid _ Into CustomerOrders = Group, _ OrderTotal = Sum(ord.Total) _ Select cust.companyname, cust.customerid, _ CustomerOrders, OrderTotal 6

يعبيالت اسحعالو Visual Basic LINQ Query Operators - Linq تتضمن الفئات ف المجال System.Linq والمجاالت الت تدعم Linq طرائق مكنك استدعاإها إلنشاء االستعالمات وتول ها بحسب حاجة التطب ق و تضمن ف جول با ز ك كلمات مفتاح ة ألقسام االستعالم الشائعة From Clause جب أن بدأ االستعالم بقسم From أو Aggregate و حدد قسم From المجموعة المصدر أو متؽ ر التكرار لالستعالم ' Returns the company name for all customers for whom ' State is equal to "WA". Dim names = From cust In customers _ Where cust.state = "WA" _ Select cust.companyname ' Returns the company name and ID value for each ' customer as a collection of a new anonymous type. Dim customerlist = From cust In customers _ Select cust.companyname, cust.id Select Clause اخت اري حدد مجموعة من متؽ رات التكرار لالستعالم و إن لم كن قسم Select موجودا ف االستعالم فتتؤلؾ متؽ رات التكرار لالستعالم من تلك المحددة ف قسم From أو Aggregate ' Returns all product names for which the Category of ' the product is "Beverages". Dim names = From product In products _ Where product.category = "Beverages" _ Select product.name Where Clause اخت اري و حدد شرط التصف ة لالستعالم ' Returns a list of books sorted by price in ' ascending order. Dim titlesascendingprice = From b In Books _ Order By b.price Dim Intrst = From i In DsDesposits.InterestRates_ Join d In DsDesposits.Deposits_ On i.interestid Equals d.interestid_ Select i.interestid, i.interestrate, i.depositpreiod Order By Clause اخت اري و حدد ترت ب الفرز لألعمدة ف االستعالم Join Clause اخت اري و دمج مجموعت ن ضمن مجموعة واحدة Group by Clause اخت اري و قوم بتجم ع عناصر نت جة االستعالم و مكن استعماله لتطب ق إجراءات تجم ع لكل مجموعة ' Returns a list of orders grouped by the order date ' and sorted in ascending order by the order date. Dim orders = From order In orderlist _ Order By order.orderdate _ Group By OrderDate = order.orderdate _ Into OrdersByDate = Group 7

' Returns a combined collection of customers and ' customer orders. Dim customerlist = From cust In customers _ Group Join ord In orders On _ cust.customerid Equals ord.customerid _ Into CustomerOrders = Group, _ OrderTotal = Sum(ord.Total) _ Select cust.companyname, cust.customerid, _ CustomerOrders, OrderTotal Group Join Clause اخت اري و جمع مجموعت ن ضمن مجموعة شجر ة واحدة Aggregate Clause جب بدء االستعالم دوما إما بقسم From أو قسم Aggregate وقسم Aggregate طبق واحدة أو أكثر من وظائؾ التجم ع على المجموعة فمثال مكن استخدام قسم Aggregate لحساب مجموع جم ع العناصر المعادة باالستعالم ' Returns the sum of all order totals. Dim ordertotal = Aggregate order In Orders _ Into Sum(order.Total) كما مكنك استخدام قسم Aggregate لتعد ل االستعالم فمثال مكن استخدام قسم Aggregate إلجراء عمل ة حساب ة على مجموعة استعالم ' Returns the customer company name and largest ' order total for each customer. Dim customermax = From cust In customers _ Aggregate order In cust.orders _ Into MaxOrder = Max(order.Total) _ Select cust.companyname, MaxOrder Let Clause اخت اري و قوم بحساب ق مة و ضعها ف متؽ ر جد د ' Returns a list of products with a calculation of ' a ten percent discount. Dim discountedproducts = From prod In products _ Let Discount = prod.unitprice * 0.1 _ Where Discount >= 50 _ Select prod.productname, prod.unitprice, Discount ' Returns a list of cities with no duplicate entries. Dim cities = From item In Customers _ Select customer.city_ Distinct Distinct Clause اخت اري وهو ضبط الق م المعادة من االستعالم بح ث ال جلب ق ما مكررة ' Returns a list of customers. The first 10 customers ' are ignored and the remaining customers are ' returned. Dim customerlist = From cust In customers _ Skip 10 Skip Clause اخت اري تجاوز عددا مع نا من العناصر ف المجموعة و ع د الباق 8

' Returns a list of customers. The query ignores all ' customers until the first customer for whom ' IsSubscriber returns false. That customer and all ' remaining customers are returned. Dim customerlist = From cust In customers _ Skip While IsSubscriber(cust) Skip While Clause اخت اري تجاوز عناصر المجموعة طالما ق مة الشرط True ثم ع د باق العناصر ' Returns the first 10 customers. Dim customerlist = From cust In customers _ Take 10 Take Clause اخت اري و ع د عددا من العناصر المتجاورة ف بدا ة المجموعة Take While Clause اخت اري قوم بتضم ن عناصر المجموعة طالما ق مة الشرط True و تجاهل بق ة العناصر ' Returns a list of customers. The query returns ' customers until the first customer for whom ' HasOrders returns false. That customer and all ' remaining customers are ignored. Dim customerswithorders = From cust In customers _ Order By cust.orders.count Descending _ Take While HasOrders(cust) كما مكنك استخدام خصائص إضاف ة الستعالم Linq باستدعاء عناصر المجموعات واألنواع المستعلم عنها الت وفرها Linq ح ث مكنك استخدام هذه اإلمكان ات اإلضاف ة باستدعاء معامل استعالم على نت جة االستعالم فمثال الكود التال ستخدم الطر قة Union لدمج ناتج استعالم ن ف نت جة استعالم واحدة و ستخدم الطر قة ToList(TSource) إلعادة ناتج االستعالم كقائمة Public Function GetAllCustomers() As List(Of Customer) Dim customers1 = From cust In domesticcustomers Dim customers2 = From cust In internationalcustomers Dim customerlist = customers1.union(customers2) Return customerlist.tolist() End Function 9

يىاضيع يحعهقة بحقنية Linq البذ ين اإلطالع عهيهب االسحذالل ان حهي عهى اننىع Local Type Inference ستخدم المترجم ف ف جول با ز ك 2008 االستدالل على النوع Type Inference لتحد د نوع المتؽ رات المحل ة الت تم التصر ح عنها بدون استخدام فقرة As ف تعب ر التصر ح ح ث ستدل المترجم على نوع المتؽ ر من نوع التعب ر الذي ضبط ق مة ذلك المتؽ ر مما وفر إمكان ة تعر ؾ المؽ رات بدون تحد د نوعها كما ف المثال التال Public Sub inferenceexample() End Sub ' Using explicit typing. Dim num1 As Integer = 3 ' Using local type inference. Dim num2 = 3 وال مكن استخدام االستدالل على النوع عند تعر ؾ الحقول ف الفئة Class Fields فإن كان num2 ف المثال السابق حقال ف فئة بدال عن كونه متؽ را محل ا فسوؾ ولد التصر ح خطؤ إذا كان Option Strict On وسوؾ صنؾ num2 على أنه ؼرض Object إن كان Option Strict Off وبشكل مشابه فنوع المتؽ رات الساكنة Static Variables ال مكن االستدالل عل ها إن كان Option Strict On وإن كان Option Strict Off فنوع المتؽ ر الساكن س كون ؼرض Object فإن لم تكن تر د من المتؽ ر num2 ف المثال السابق أن كون من النوع Integer ف مكنك تحد د نوعا آخر عند التصر ح عنه Dim num3 As Object = 3 or Dim num4 As Double = 3 والكود الذي ستخدم استدالل النوع شابه الكود الذي عتمد على الربط المتؤخر Late Binding الذي س كون نوعه معروفا فقط ف زمن التشؽ ل. ومعرفة النوع بشكل مبكر مكن المترجم من تحد د المشاكل قبل التنف ذ وحجز الذاكرة بدقة وإجراء عمل ات التحس ن األخرى باإلضافة إلى تمك ن ب ئة التطو ر من تزو د المبرمج ب IntelliSense والمساعدة حول أعضاء ذلك الؽرض باإلضافة إلى تفض له العتبارات خاصة باألداء بسبب أن جم ع الب انات الت تخزن باستخدام الربط المتؤخر جب تؽل فها وكؤنها من النوع Object والوصول إلى األعضاء ف زمن التشؽ ل س كون أبطؤ. حدث االستدالل على النوع عندما تم التصر ح عن المتؽ ر بدون استخدام فقرة As ف تعب ر التصر ح وضبط ق مة لذلك المتؽ ر ف ستخدم المترجم نوع تلك الق مة كنوع للمتؽ ر فمثال سطور الكود التال ة تعرؾ متؽ را من النوع String ' Using explicit typing. Dim name1 As String = "Springfield" ' Using local type inference. Dim name2 = "Springfield" و ستعرض الكود التال طر قتان متكافئتان إلنشاء مصفوفة من النوع Integer ' Using explicit typing. Dim somenumbers1() As Integer = New Integer() {4, 18, 11, 9, 8, 0, 5} ' Using local type inference. Dim somenumbers2 = New Integer() {4, 18, 11, 9, 8, 0, 5} 10

كما مكنك استخدام االستدالل على النوع لتحد د نوع متؽ ر التحكم لحلقة تكرار ة فف الكود التال س تعرؾ المترجم على النوع Integer ألن somenumbers2 عبارة عن مصفوفة Integer num بؤنه من Dim total = 0 For Each number In somenumbers2 total += number Next و ستخدم االستدالل على النوع ف العبارة Using أ ضا لتحد د نوع اسم المصدر كما هو واضح ف المثال التال Using proc = New System.Diagnostics.Process ' Insert code to work with the resource. End Using و ستدل على نوع المتؽ ر من الق مة المعادة من اإلجراء أ ضا كما هو ظاهر ف الكود التال ح ث كونpList1 و plist2 عبارة عن Lists of Processes ' Using explicit typing. Dim plist1() As Process = Process.GetProcesses() ' Using local type inference. Dim plist2 = Process.GetProcesses() وقد قدم ف جول با ز ك 2008 خ ارا جد دا هو Option Infer مكنك من تحد د إذا كان االستدالل المحل على النوع مسموحا أم ال ف ملؾ مع ن. فلتمك ن أو تعط ل خ ار االستدالل على النوع اكتب التعب ر المناسب من السطر ن التال ن ف بدا ة الملؾ Option Infer On Option Infer Off وإن لم تقم بتحد د ق مة للخ ار Option Infer ف الكود فالمترجم س ستخدم الخ ار االفتراض Option Infer On من أجل المشار ع الت تم إنشاإها ف Visual Basic 2008 والخ ار Option Infer Off من أجل المشار ع الت تمت ترق تها من إصدارات سابقة. وإن تضاربت ق مة الخ ار Option Infer ف الملؾ مع الق مة المضبوطة ف خ ارات ب ئة التطو ر أو ف سطر األوامر فسوؾ تم استخدام الق مة الموجودة ف الملؾ. Class Fields أو و ستخدم االستدالل على النوع فقط ف المتؽ رات الؽ ر ساكنة الخصائص Properties أو اإلجراءات Functions Non-Static وال مكن استخدامها ف تعر ؾ حقول الفئة 11

األنىاع ان جهىنة Anonymous Types قدم ف جول ستود و 2008 األنواع المجهولة anonymous types والت تمكنك من إنشاء األؼراض Objects بدون كتابة تعر ؾ فئة Class definition من أجل نوع الب انات وعوضا عن ذلك ولد المترجم الفئة من أجلك ولن كون للفئة اسما قابال لالستخدام ح ث تكون هذه الفئات موروثة مباشرة من Object وتمتلك الخصائص الت تحددها عند تعر ؾ الؽرض Object وبما أن نوع الب انات لم تم تحد ده تم اإلشارة إل ه على أنه نوع مجهول.anonymous type ح ث صرح المثال التال عن المتؽ ر product كمتؽ ر من النوع Price و Name ممتلكا الخاص ت ن anonymous type ' Variable product is an instance of a simple anonymous type. Dim product = New With {Key.Name = "paperclips",.price = 1.29} ح ث ستخدم تعب ر االستعالم التال األنواع المجهولة لدمج أعمدة الب انات المحددة بواسطة االستعالم وبما أنه ال مكنك تحد د نوع النت جة مقدما بسبب عدم إمكان ة التنبإ باألعمدة الت مكن أن ختارها استعالم مع ن فتمكنك األنواع المجهولة من كتابة استعالم ختار عدد من األعمدة بؤي ترت ب نر ده ف قوم المترجم بإنشاء نوع الب انات المماثل لتلك الخصائص المحددة بذلك الترت ب المع ن. وف المثال التال كون Products عبارة عن قائمة من أؼراض Product وكل منها متلك خصائص عد دة بح ث حمل المتؽ ر namepricequery تعر ؾ االستعالم الذي ع د عند تنف ذه مجموعة من األنواع المجهولة الت تمتلك الخاص ت ن Name و Price Dim namepricequery = From prod In products_ Select prod.name, prod.price والمتؽ ر namequantityquery OnHand و Name تعر ؾ حمل األنواع من مجموعة تنف ذه عند ع د الذي االستعالم خاص ت ن تمتلك الت المجهولة Dim namequantityquery = From prod In products_ Select prod.name, prod.onhand تعريف نوع مجهول Declaring an Anonymous Type تعر ؾ متؽ ر من نوع مجهول ستخدم قائمة بناء لتحد د خصائص ذلك النوع بح ث مكنك تحد د هذه الخصائص فقط عند اإلعالن عن النوع المجهول وال مكن استخدام بق ة عناصر الفئات مثل الطرائق واألحداث ف األنواع المجهولة فف المثال التال كون Product1 من نوع مجهول متلك خاص ت ن Name و Price 'Variable product1 is an instance of a simple anonymous type. Dim product1 = New With {.Name = "paperclips",.price = 1.29} - 'or- 'product2 is an instance of an anonymous type with key properties. Dim product2 = New With {Key.Name = "paperclips", Key.Price = 1.29} فإن قمت بتحد د الخصائص كخصائص مفتاح ة key properties أصبح بإمكانك استخدامها لمقارنة نوع ن مجهول ن هل هما متساو ن أم ال ومع ذلك فق م الخصائص المفتاح ة ال مكن تؽ رها فه للقراءة فقط. مع مالحظة أن التصر ح عن نوع مجهول ماثل التصر ح عن نوع مسمى باستخدام بان الؽرض object initializer 'Variable product3 is an instance of a class named Product. Dim product3 = New Product With {.Name = "paperclips",.price = 1.29} انخصبئص ان فحبحية Key Properties تختلؾ الخصائص المفتاح ة عن العاد ة بعدة أمور: تستخدم الخصائص المفتاح ة فقط لمقارنة المساواة ب ن نوع ن مجهول ن ال مكن تؽ ر ق م الخصائص المفتاح ة فه دائما للقراءة فقط فقط الخصائص المفتاح ة تم تضم نها ضمن ال Hash Code الذي ولده المترجم من أجل األنواع المجهولة 12

ان سبواة Equality تكون متؽ رات األنواع المجهولة متساو ة عندما تكون متؽ رات لنفس النوع المجهول و قوم المعالج بمعاملة متؽ ر ن كمتؽ ر ن من نفس النوع إذا توفرت ف هما الشروط التال ة تم التصر ح عنهما ف نفس المجمع تمتلك خصائصهما نفس االسم والنوع وتم التصر ح عنها بنفس الترت ب وتكون مقارنة األسماء ؼ ر حساسة لحالة األحرؾ نفس الخصائص ف ها محددة كخصائص أساس ة متلك كل نوع خاص ة أساس ة واحدة على األقل والتصر ح عن نوع مجهول الذي ال متلك أي خاص ة مفتاح ة كون مساو ا لنفسه فقط 'prod1 and prod2 have no key values. Dim prod1 = New With {.Name = "paperclips",.price = 1.29} Dim prod2 = New With {.Name = "paperclips",.price = 1.29} 'The following line displays False, because prod1 and prod2 have no 'key properties. Console.WriteLine(prod1.Equals(prod2(( 'The following statement displays True because prod1 is equal to itself. Console.WriteLine(prod1.Equals(prod1(( وتكون ق مة متؽ ر ن لنفس النوع المجهول متساو ن إذا كانت ق مة خصائصهما المفتاح ة متساو ة كما ف المثال التال الذي وضح ك ف ة فحص هذه المساواة Dim prod3 = New With {Key.Name = "paperclips", Key.Price = 1.29} Dim prod4 = New With {Key.Name = "paperclips", Key.Price = 1.29} 'The following line displays True, because prod3 and prod4 are 'instances of the same anonymous type, and the values of their 'key properties are equal. Console.WriteLine(prod3.Equals(prod4(( Dim prod5 = New With {Key.Name = "paperclips", Key.Price = 1.29} Dim prod6 = New With {Key.Name = "paperclips", Key.Price = 1.29, OnHand = 423} 'The following line displays False, because prod5 and prod6 do not 'have the same properties. Console.WriteLine(prod5.Equals(prod6(( Dim prod7 = New With {Key.Name = "paperclips", Key.Price = 1.29, OnHand = 24} Dim prod8 = New With {Key.Name = "paperclips", Key.Price = 1.29, OnHand = 423} 'The following line displays True, because prod7 and prod8 are 'instances of the same anonymous type, and the values of their 'key properties are equal. The equality check does not compare the 'values of the non-key field. Console.WriteLine(prod7.Equals(prod8(( انقيى انقببهة نهقراءة فقط ال مكن تؽ ر ق م الخصائص المفتاح ة فمثال ف prod8 ف المثال السابق الحقول Name و Price قابلة للقراءة فقط ف ح ن أن الحقل OnHamd مكن تؽ ر ق مته 'The following statement will not compile, because Name is a key 'property and its value cannot be changed. 'prod8.name = "clamps" 13

'OnHand is not a Key property. Its value can be changed. prod8.onhand = 22 األنواع المجهولة من تعابير االستعالم Anonymous Types from Query Expressions تعاب ر االستعالم ال تتطلب دوما إنشاء أنواع مجهولة فعند اإلمكان مكنها استخدام نوع موجود ل حمل ب انات العمود وهذا حدث عندما ع د االستعالم إما سجالت كاملة من مصدر الب انات أو حقل واحد من كل سجل فف المثال التال كون Customers عبارة عن مجموعة فئات Customer والفئة تمتلك العد د من الخصائص بح ث مكنك تضم ن واحدة أو أكثر من هذه الخصائص ف نتائج االستعالم وبؤي ترت ب تر ده فف المثال ن األول ن ال وجد حاجة ألي نوع مجهول ألن االستعالم جلب عناصر من أنواع معروفة ف Custs1 كون من النوع string ألن cust.name من النوع String و Custs2 هو مجموعة من األؼراض Customers ألن كل عنصر ف Customers هو ؼرض Customer وكامل العنصر تم جلبه بواسطة االستعالم Dim custs1 = From cust In customers_ Select cust.name Dim custs2 = From cust In customers_ Select cust ومع ذلك فاألنواع المسماة ال تكون دائما متوفرة ح ث مكنك االستعالم عن Names و Addresses من أجل هدؾ مع ن و ID و Numbers و Location من أجل هدؾ آخر فهنا تمكنك األنواع المجهولة من اخت ار أ ة ترك بة من الخصائص وبؤي ترت ب بدون أن تضطر ف البدا ة للتصر ح عن نوع مسمى جد د ل حمل النت جة وبدال عن ذلك قوم المترجم بإنشاء نوع مجهول لكل ترك بة من الخصائص فمثال االستعالم التال حدد فقط Name و ID من كل ؼرض Customer ف customers ومن أجل ذلك قوم بإنشاء نوع مجهول من تلك الخصائص Dim custs3 = From cust In customers_ Select cust.name, cust.id وكل من االسم والنوع العائد ن لخصائص النوع المجهول تم أخذها من بارامترات االستعالم cust.name و Cust.Id وتكون خصائص النوع المجهول الت نشئها االستعالم خصائص مفتاح ة دوما وعند تنف ذ cust3 ف حلقة For...Each التال ة تكون النت جة ه مجموعة أنواع مجهولة تمتلك خاص ت ن مفتاح ت ن Name و ID For Each selectedcust In custs3 Console.WriteLine(selectedCust.ID & ": " & selectedcust.name) Next جحذيذ يحى نسحخذو األنىاع ان جهىنة قبل أن تقوم بالتصر ح عن ؼرض بؤنه من نوع مجهول جب عل ك التفك ر ف ما إذا كان هذا الخ ار هو األفضل فمثال إن كنت تر د إنشاء ؼرض مإقت ل حتوي بعض حقول المعلومات ولست بحاجة إلى بق ة الحقول والطرائق الت تحتو ها الفئة الكاملة كون عندها النوع المجهول حال ج دا وتكون األنواع المجهولة مالئمة عندما تر د انتقاء مجموعة مختلفة من الخصائص عند كل تصر ح أو إن كنت تر د تؽ ر ترت ب هذه الخصائص وإن كان مشروعك حتوي على عدة أؼراض تحمل نفس الخصائص بترت ب ثابت مكنك عندها التصر ح عنهم بسهولة باستخدام األنواع المسماة باستخدام بان فئة فعندها باستخدام بان مالئم مكن تعر ؾ عدة متؽ رات من الفئة Product و كون ذلك أسهل من استخدام عدة متؽ رات مجهولة النوع 'Declaring instances of a named type. Dim firstprod1 As New Product("paperclips", 1.29( Dim secondprod1 As New Product("desklamp", 28.99( Dim thirdprod1 As New Product("stapler", 5.09( 'Declaring instances of an anonymous type. Dim firstprod2 = New With {Key.Name = "paperclips", Key.Price = 1.29} Dim secondprod2 = New With {Key.Name = "desklamp", Key.Price = 28.99} Dim thirdprod2 = New With {Key.Name = "stapler", Key.Price = 5.09} وتكمن فائدة أخرى لألنواع المجهولة ف أن المترجم مكنه التقاط األخطاء الطباع ة ف أسماء الخصائص فف المثال السابق فترض باألنواع firstprod2 و secondprod2 و thirdprod2 أن تكون متؽ رات لنفس النوع المجهول ومع ذلك قمت عن طر ق الخطؤ بالتصر ح عن و secondprod2 بؤحد الطرائق الالحقة وهو نوع مختلؾ عن firstprod2 thirdprod2 'Dim thirdprod2 = New With {Key.Nmae = "stapler", Key.Price = 5.09} 'Dim thirdprod2 = New With {Key.Name = "stapler", Key.Price = "5.09"} 14

'Dim thirdprod2 = New With {Key.Name = "stapler",.price = 5.09} واألمر األهم هو أنه هناك حدود الستخدام األنواع المجهولة ال تنطبق على األنواع المعروفة فمع أن firstprod2 و secondprod2 و thirdprod2 ه متؽ رات لنفس النوع المجهول فالمتؽ ر المجهول المشترك ؼ ر متوفر وال مكن توقع ظهوره كنوع معروؾ ف الكود فمثال مكن استخدام النوع المجهول لتحد د توق ع الطر قة للتصر ح عن حقل متؽ ر ف كون بالنت جة النوع المجهول ؼ ر مالئم لتبادل الب انات عبر الطرائق 15

Lambda Expressions ال Lambda Expression هو وظ فة Function بدون اسم تحتسب وتع د ق مة وح دة كما مكن استخدامها ف التعاب ر الت تطلب إجراءات مفوضة Delegate والمثال التال عن هذه التعاب ر ؤخذ ق مة و ع د الناتج بعد إضافة واحد لها Function (num As Integer) num + 1 Dim add1 = Function(num As Integer) num + 1 Console.WriteLine(add1(5)) كما مكنك إسناد هذه الوظ فة لمتؽ ر وتمر ر الق مة له كما مكنك تعر ؾ وتنف ذ الوظ فة بنفس الوقت Console.WriteLine((Function(num As Integer) num + 1)(5)) كما مكن أن تستخدم Lambda Expressions كق مة معادة عند استدعاء وظ فة أو تمر رها كوس ط إلجراء مفوض فف المثال التال تستخدم Lambda Expressions بول ان ة كوسائط لإلجراء testresult ح ث تطبق الطر قة فحص بول ان لوس ط من النوع Integer و ظهر الق مة Success إذا كانت ق مة Lambda Expression ه True أو Failure إن كانت ق مته False Module Module2 Sub Main() ' The following line will print Success, because 4 is even. testresult(4, Function(num) num Mod 2 = 0) ' The following line will print Failure, because 5 is not > 10. testresult(5, Function(num) num > 10) End Sub ' Sub testresult takes two arguments, an integer value and a ' Boolean function. ' If the function returns True for the integer argument, Success ' is displayed. ' If the function returns False for the integer argument, Failure ' is displayed. Sub testresult(byval value As Integer, ByVal fun As Func(Of Integer, Boolean)) If fun(value) Then Console.WriteLine("Success") Else Console.WriteLine("Failure") End If End Sub End Module Compiler بإنشاء Linq ح ث قوم المترجم Lambda Expressions ه األساس لكث ر من معامالت االستعالم تكون تعاب ر تعاب ر Lambda Expressions للق ام بالعمل ات الحساب ة للطرائق الخاصة باالستعالم مثل Where و Select و Order و By و Take While فعلى سب ل المثال انظر االستعالم التال Dim londoncusts = From cust In db.customers Where cust.city = "London" Select cust ح ث ستتم ترجمته إلى الكود التال Dim londoncusts = db.customers _.Where(Function(cust) cust.city = "London") _.Select(Function(cust) cust) وتكون ص ؽتها على الشكل 16

هذه التعاب ر ال تملك اسما ال مكن استخدام المعدالت معها مثل Overloads أو Overrides ال تستخدم قسم AS لتحد د نوع الق مة المعادة وبدال عن ذلك كون نوع الق مة المعادة هو نوع الق مة الت شكلها جسم اإلجراء فإن كان جسم اإلجراء مثال "London" Cust.City = فتكون الق مة المعادة بول ان ة جسم اإلجراء جب أن كون تعب ر ول س تصر ح و مكن أن حتوي على استدعاء لوظ فة إجراء Sub ال وجد تعب ر Return وتكون الق مة المعادة ه ق مة ذلك التعب ر الذي شكل جسم الوظ فة ال وجد تعب ر End Function ولكنه ال مكن أن ستدع جب أن تكون جم ع الوسائط محددة النوع أو تكون جم عها بؤنواع باإلشارة ؼ ر مسموح بالوسائط االخت ار ة الوسائط Generic ؼ ر مسموح بها ونت جة لهذه القواعد سنرى أن أي تعب ر Lambda Expression س كون بس طا وؼ ر معقد تشترك Lambda Expression مع الوظائؾ Methods بؤنها محددة ولها جم ع حقوق الوصول كؤي كود مكتوب ف الطر قة الت تحتو ها وهذا تضمن الوصول إلى متؽ رات األعضاء والوظائؾ وجم ع المؽ رات الموجودة ف الوظ فة الت تحتوي التعب ر Lambda Lambda والطر قة الت تم تحد د التعب ر makethegame هو محل بالنسبة ل target فف المثال التال المتؽ ر Expression Expression ف ها ه playthegame الحظ أن الق مة المعادة من التعب ر Lambda Expression تم تع نها ل takeaguess ف target مازالت تستط ع الوصول للمتؽ ر المحل Main Module Module1 Sub Main() ' Variable takeaguess is a Boolean function. It stores the target ' number that is set in makethegame. Dim takeaguess As gamedelegate = makethegame() ' Set up the loop to play the game. Dim guess As Integer Dim gameover = False While Not gameover guess = CInt(InputBox("Enter a number between 1 and 10 (0 to quit)", "Guessing Game", "0")) ' A guess of 0 means you want to give up. If guess = 0 Then gameover = True Else ' Tests your guess and announces whether you are correct. Method takeaguess ' is called multiple times with different guesses. The target value is not ' accessible from Main and is not passed in. gameover = takeaguess(guess) Console.WriteLine("Guess of " & guess & " is " & gameover) End If End While End Sub Delegate Function gamedelegate(byval aguess As Integer) As Boolean Public Function makethegame() As gamedelegate ' Generate the target number, between 1 and 10. Notice that ' target is a local variable. After you return from makethegame, ' it is not directly accessible. Randomize() Dim target As Integer = CInt(Int(10 * Rnd() + 1)) ' Print the answer if you want to be sure the game is not cheating ' by changing the target at each guess. Console.WriteLine("(Peeking at the answer) The target is " & target) ' The game is returned as a lambda expression. The lambda expression ' carries with it the environment in which it was created. This ' environment includes the target number. Note that only the current ' guess is a parameter to the returned lambda expression, not the target. ' Does the guess equal the target? Dim playthegame = Function(guess As Integer) guess = target 17

Return playthegame End Function End Module و ستعرض المثال التال مجاال عر ضا من حقوق الوصول المعششة ف Lambda Expression فعندما تم تنف ذ التعب ر Lambda Expression من Main ك adel ستخدم العناصر التال ة ( حقل ف الفئة afield خاص ة ف الفئة aprop وس ط لإلجرائ ة functionwithnestedlambda هو level1 متؽ ر محل ل functionwithnestedlambda هو localvar وس ط للتعب ر ) المعشش هو level2 Lambda Expression Module Module3 Sub Main() ' Create an instance of the class, with 1 as the value of ' the property. Dim lambdascopedemoinstance = New LambdaScopeDemoClass _ With {.Prop = 1} ' Variable adel will be bound to the nested lambda expression ' returned by the call to functionwithnestedlambda. ' The value 2 is sent in for parameter level1. Dim adel As adelegate = _ lambdascopedemoinstance.functionwithnestedlambda(2) ' Now the returned lambda expression is called, with 4 as the ' value of parameter level3. Console.WriteLine("First value returned by adel: " & adel(4)) ' Change a few values to verify that the lambda expression has ' access to the variables, not just their original values. lambdascopedemoinstance.afield = 20 lambdascopedemoinstance.prop = 30 Console.WriteLine("Second value returned by adel: " & adel(40)) End Sub Delegate Function adelegate(byval delparameter As Integer) _ As Integer Public Class LambdaScopeDemoClass Public afield As Integer = 6 Dim aprop As Integer Property Prop() As Integer Get Return aprop End Get Set(ByVal value As Integer) aprop = value End Set End Property Public Function functionwithnestedlambda _ (ByVal level1 As Integer) As adelegate Dim localvar As Integer = 5 ' When the nested lambda expression is executed the first ' time, as adel from Main, the variables have these values: ' level1 = 2 ' level2 = 3, after alambda is called in the Return statement ' level3 = 4, after adel is called in Main ' locarvar = 5 ' afield = 6 ' aprop = 1 18

End Class End Module ' The second time it is executed, two values have changed: ' afield = 20 ' aprop = 30 ' level3 = 40 Dim alambda = Function(level2 As Integer) _ Function(level3 As Integer) _ level1 + level2 + level3 + localvar _ + afield + aprop ' The function returns the nested lambda, with 3 as the ' value of parameter level2. Return alambda(3) End Function كما مكن تحو ل Lambda Expressions لتتوافق مع اإلجراءات المفوضة فعندما تع ن Lambda Expression إلجراء مفوض Delegate مكنك تحد د أسماء الوسائط ولكن مع إؼفال أنواع الب انات الخاصة بها تاركا مهمة تحد دها لإلجراء المفوض فف المثال التال تم تع ن Lambda Expression لمتؽ ر اسمه del من النوع ExampleDel الذي هو عبارة عن إجراء مفوض ؤخذ وس طت ن integer و string الحظ أن أنواع المتؽ رات ف Lambda Expression لم تم تحد دها ومع ذلك ف del تطلب وس طا من النوع integer ووس طا آخر من النوع string كما تم تحد ده عند تعر ؾ ExampleDel ' Definition of function delegate ExampleDel. Delegate Function ExampleDel(ByVal arg1 As Integer, _ ByVal arg2 As String) As Integer ' Declaration of del as an instance of ExampleDel, with no data ' type specified for the parameters, m and s. Dim del As ExampleDel = Function(m, s) m ' Valid call to del, sending in an integer and a string. Console.WriteLine(del(7, "up")) ' Neither of these calls is valid. Function del requires an integer ' argument and a string argument. 'Console.WriteLine(del(7, 3)) 'Console.WriteLine(del("abc")) ف المثال التال تم تحد د Lambda Expression ل ع د الق مة True إذا كان الوس ط متلك قسمة أو False إذا كان الق مة Nothing Dim notnothing = Function(num? As Integer) _ num IsNot Nothing Dim arg As Integer = 14 Console.WriteLine("Does the argument have an assigned value?") Console.WriteLine(notNothing(arg)) والمثال التال حدد Lambda Expression ع د Index العنصر األخ ر ف مصفوفة Dim numbers() As Integer = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9} Dim lastindex = Function(intArray() As Integer) _ intarray.length - 1 For i = 0 To lastindex(numbers) numbers(i) = numbers(i) + 1 Next 19

جعببير ن ذا في انع ق Lambda Expressions تعتبر تعاب ر لمدا من اإلضافات المف دة ف ف جول با ز ك 2008 ح ث مكنك إعادتها كق مة من وظ فة أو تمر رها كمحدد لوظ فة أخرى ح ث تمت إضافتها للؽة البا ز ك كدعم للؽة االستعالمات المضمنة Linq الت تض ؾ إمكان ات استعالم ة قو ة لبرمجة الب انات ف ف جول با ز ك وعندما تبدأ باستخدام تعاب ر لمدا سترى القوة والمرونة الكامنة ف ها Integer و ع د يب هي جعببير ن ذا شكل الكود التال مثاال عن تعر ؾ تعب ر لمدا أساس فهو عرؾ تعب ر لمدا ؤخذ الدخل و ع دها مضروبة ب 2 Integer بح ث ؤخذ ق مة Dim doubleit as Func(Of Integer, integer) = _ Function(x As Integer) x * 2 والنوع Func من األنواع الجد دة ف ف جول با ز ك 2008 وهو ف األساس إجراء مفوض Delegate ع د نوعا حدده المحدد األخ ر و مكنك من تمر ر أربعة محددات تسبق ذلك المحدد والنوع المفوض Func معرؾ ف المجمع System.Core.dll األمر الذي مكنك من االستفادة منه فور ا وذلك ألن المجمع المذكور تم است راده تلقائ ا عندما ننشئ تطب قا جد دا و مثل الكود التال تحم الت Overloads مختلفة ل Func Dim f0 As Func(Of Boolean) Dim f1 As Func(Of Integer, Boolean) Dim f4 As Func(Of Integer, Integer, Integer, Integer, Boolean) فف المثال السابق f0 هو مفوض ع د ق مة Boolean و f1 مفوض ؤخذ Integer و ع د Boolean و f4 مفوض ؤخذ أربعة محددات من النوع Integer و ع د ق مة من النوع Boolean وتكمن النقطة األساس ة ف التعب ر لمدا هو أنه مفوض قابل لالستدعاء تماما كالمفوضات ف ف جول با ز ك 2005 فمن ناح ة المساواة ال منى ف قطعة الكود األولى مكنك رإ ة الص ؽة الجد دة للتعاب ر لمدا فه تبدأ بالكلمة المحجوزة Function متبوعة بقائمة من المحددات وتعب ر وح د فف المثال السابق ؤخذ تعب ر لمدا محددا واحدا من النوع Integer ونالحظ عدم وجود تعب ر Return وذلك ألن المترجم عرؾ النوع المإسس عل ه التعب ر وبهذا قوم بتمر ر عبارة Return تلقائ ا وف هذه الحالة بما أن x هو من النوع Integer ونت جة المعادلة ه Integer لهذا فنت جة تعب ر لمدا ه Integer أ ضا و مكن السحر ف تعاب ر لمدا ف أنه مكن استخدامها كمفوض بس ط كما نرى ف المثال Dim doubleit As Func(Of Integer, Integer) = _ Function(x As Integer) x * 2 Dim z = doubleit(20) فإن نفذت الكود السابق سترى أن الق مة المخزنة ف z ه 40 وأنت بهذا قمت بإنشاء تعب ر لمدا ضاعؾ ق مة أي Integer مرر له. دعنا اآلن نتفحص مثال معقد أكثر باستخدام تعاب ر لمدا Dim mult As Func(Of Integer, Func(Of Integer, Integer)) = _ Function(x As Integer) Function(y As Integer) x * y و عتبر mult تعب ر لمدا معقد قل ال فهو ؤخذ كدخل له محدد من النوع Integer و ع د تعب ر لمدا كق مة له والذي أخذ بدوره ق مة Integer و ع د ق مة Integer كما مكننا إعادة تقس م التعب ر السابق على أسطر من أجل توض ح الكود Dim mult As Func(Of Integer, Func(Of Integer, Integer)) = _ Function(x As Integer) _ Function(y As Integer) x * y فتعب ر لمدا الخارج حتوي تعب ر لمدا آخر الذي ستخدم من قبل المترجم كق مة معادة و كون التوق ع الخاص بتعب ر لمدا الداخل مماثال لتوق ع المفوض Integer) Func(Of Integer, ف الق مة المعادة من تعب ر لمدا الخارج ح ث قوم المترجم بترجمة التعب ر بؤكمله دون مشاكل و مكننا رإ ة تعب ر لمدا هذا كما ل 20

Dim mult_10 = mult(10) Dim r = mult_10(4) فالسطر األول حدد mult_10 ك mult(10) وبما أن Mult(10) ع د تعب ر لمدا ؤخذ محدد و ضربه ب 10 والنوع المعاد من mult_10 هو Integer) Func(Of Integer, والسطر الثان ستدع mult_10 ممررا له الق مة 4 بهذا ستكون الق مة المخزنة ف r ه 40 و كون نوع r هو Integer و عتبر mult مصنع لتعاب ر لمدا فهو ع د تعب ر لمدا مخصص بالمحدد األول وستالحظ أن تعب ر لمدا الداخل ستخدم محدد تعب ر لمدا الخارج ولكن فترة ح اة تعب ر لمدا الداخل تتجاوز فترة ح اة تعب ر لمدا الخارج جعببير ن ذا كبسحذعبءات بما أن تعاب ر لمدا ه ببساطة مفوضات لذا مكنك استخدامها ف أي مكان مكن استخدام المفوض ف ه. الحظ اإلجراء التال الذي ؤخذ مفوض كمحدد له و ستدع مفوض من أجل كل عنصر ف القائمة Delegate Function ShouldProcess(Of T) (element As T) As Boolean Sub ProcessList(Of T) ( _ Elements As List(Of T), shouldprocess As ShouldProcess(Of T)) For Each elem in elements If shouldprocess(elem) Then ' Do some processing here End If Next End Sub و كون المثال التال تطب قا ق اس ا على المفوضات فالطر قة ProcessList ستمر على كل عنصر من القائمة وتتحقق ف ما إذا كان عل ها معالجة العنصر ثم تقوم ببعض المعالجة وحتى تتمكن من استخدام هذا ف ف جول با ز ك 2005 عل ك إنشاء وظ فة تمتلك نفس توق ع المفوض ثم تمرر عنوان تلك الوظ فة إلى اإلجراء ProcessList Class Person Public age As Integer End Class Function _PrivateShouldProcess(person As Person) As Boolean Return person.age > 50 End Function Sub DoIt() Dim list As New List(Of Person) 'Obtain list of Person from a database, for example ProcessList(list, AddressOf _PrivateShouldProcess) End Sub وهذا سبب بعض اإلزعاج فؽالبا عل ك البحث ف توث ق الكود لمعرفة ماذا مثل توق ع المفوض ثم جب عل ك مطابقته كل ا وإن احتجت الستدعاء ProcessList مع عدة إجراءات ستقوم بإنشاء العد د من الوظائؾ الخاصة. دعنا نرى اآلن ك ؾ مكننا استدعاء هذا اإلجراء باستخدام تعاب ر لمدا Class Person Public age As Integer End Class Sub DoIt() Dim list As new List(Of Person) 'Obtain list of Person from a database, for example 21

ProcessList(list, Function(person As Person) person.age > 50) End Sub فباستخدام تعاب ر لمدا لم عد هناك حاجة إلنشاء وظ فة خاصة للق ام بمنطق المعالجة ح ث تم تعر ؾ المفوض ف النقطة الت س ستخدم ف ها وهذا أفضل من تعر فه ضمن وظ فة خاصة ف مكان ما وفقدان محل تها باستخدام الطر قة الخاصة وبهذا أنت ترى قوة تعاب ر لمدا وتسه لها لعمل ة قراءة وص انة الكود الخاص بك ن برا جى جقذيى جعببير ن ذا من أجل دعم استعالمات ل نك لمدا. افترض أنه لد نا االستعالم التال Linq كان جب إضافة مجموعة من اإلمكان ات الجد دة للؽة ف جول با ز ك ومن ضمنها كانت تعاب ر Dim q = From p In Process.GetProgesses() _ Where p.priorityclass = ProcessPriorityClass.High _ Select P فلك تم ترجمة هذا التعب ر جري الكث ر من العمل تحت الؽطاء فالمترجم س قوم بالمرور عبر المجموعة Process.GetProcesses و طبق المرشح الموجود ف قسم Where عل ها و ع د قائمة بالعمل ات الت تطابق ذلك الشرط كما نالحظ وجود تعب ر ف جول با ز ك داخل قسم Where هو p.priorityclass = ProcessPriorityClass.High وذلك لتطب ق المرشح وهنا قوم المترجم بإنشاء تعب ر لمدا من أجل المرشح الموجود ف قسم Where و طبقه على كل عنصر ف قائمة العمل ات Dim q = Process.GetProcesses().Where( _ Function(p) p.priorityclass = ProcessPriorityClass.High) وأساسا شكل التعب ر لمدا اختصارا للمترجم من أجل اختصار عمل ة إنشاء الطرق وربطها مع المفوضات ح ث قوم بكل ذلك من أجلك والفائدة الت نجن ها من تعاب ر لمدا وال نجن ها عند استخدام الوظائؾ والمفوضات ه أن المترجم هنا ستخدم االستدالل المحل على النوع على تعاب ر لمدا فف المثال السابق تم تحد د نوع المحدد p بناء على االستخدام وف هذه الحالة حدد التعب ر ف قسم Where تعب ر لمدا و قوم المترجم باالستدالل آل ا على نوع الق مة المعادة من التعب ر لمدا بح ث تعتبر م زة االستدالل المحل على النوع المدعومة من قبل المعالج من اإلضافات القو ة لف جول با ز ك االسحذالل ان حهي عهى اننىع تقد م م زة االستدالل المحل على النوع القو ة عن أنه لم عد عل ك أن تقلق حول تحد د النوع المالئم لكل متؽ ر وبالتال فه تمكنك من الق ام بالعد د من األمور الت كانت تبدو مستح لة فاالستدالل على النوع المعاد من تعاب ر لمدا مف د جدا فإن كان لد ك نوع مفوض تر د ربطه مع تعب ر لمدا لم عد عل ك تحد د نوع جم ع المحددات Dim lambda As Func(Of Integer, Integer) = Function(x) x * x فف هذا المثال كون نوع تعب ر لمدا هو Integer) Func(Of Integer, وهو مفوض ؤخذ محدد من النوع Integer و ع د محدد من النوع Integer وكنت جة لهذا فالمترجم ستدل آل ا على أن المحدد x العائد لتعب ر لمدا هو من النوع Integer والق مة المعادة من التعب ر لمدا ه Integer أ ضا كما مكنك االستفادة من االستدالل على نوع تعاب ر لمدا عندما تستدع طر قة تؤخذ مفوضا الحظ الكود التال ف هذه الحالة تؤخذ الوظ فة ProcessList تعب ر لمدا و مكن استدعاإها على الشكل Delegate Function ShouldProcess(Of T) (element As T) As Boolean Sun ProcessList(Of T) (_ Elements As List(Of T), shouldprocess As ShouldProcess(Of T)) ' Method body removed for brevity End Sub Sub DoIt() Dim list As new List(Of A) ' fill or obtain elements in list ProcessList(list, Function(a) a.x > 50) 22

End Sub الحظ أننا لم نحدد نوع المحدد الممرر للتعب ر لمدا كما فعلنا سابقا وذلك ألن المعالج ستدل عل ه بنفسه. ك ؾ مكن حدوث شئ كهذا ف الحق قة هناك عدة مستو ات من االستدالل على النوع ف هذا المثال فف البدا ة رى المترجم ProcessList كإجراء عادي ؤخذ (T list(of كدخل له و (T ShouldProcess(Of ف استدعاء ProcessList و رى المترجم أن list ه المحدد األول وأنها Person) list(of وبما أن المحدد الثان ال وفر تلم حات حول ماه ة نوع T ف قرر المترجم أن T من النوع Person و ستدل من هذا على أن محدد (T ShouldProcess(Of هو من النوع Person وبهذا ستدل على أن المحدد الثان هو من النوع (T ShouldProcess(Of وأخ را بما أن تعب ر لمدا ال قدم نوع المحدد الخاص به والمترجم عرؾ أن نوع المحدد عتمد على توق ع المفوض (T ShouldProcess(Of وقد استدل على أن نوع المحدد a هو Person و عتبر هذا نوعا قو ا من االستدالل على النوع فل س عل ك معرفة نوع محددات المفوض عندما تبن تعب ر لمدا وف الحق قة من األفضل ترك المترجم قوم بذلك العمل ن ابة عنك واالستدالل على نوع النت جة بهذه الطر قة مف د حق قة إن لم كن لد ك نوع مفوض وتر د من المترجم أن قوم بتصن عه من أجلك علما بؤن هذه الم زة متوفرة ف ف جول با ز ك فقط Dim lambda = Function(x As Integer) x * x فف المثال السابق بما أن المحدد x هو من النوع Integer فالمترجم ستدل آل ا على أن الق مة المعادة ه من النوع Integer أ ضا كنت جة المعادلة الموجودة ف التعب ر وبما أن تعب ر لمدا ال متلك نوعا لهذا قوم المترجم بتصن ع مفوض مجهول طابق شكل تعب ر لمدا و ربط ذلك النوع المفوض بتعب ر لمدا. وهذه م زة عظ مة ألنها تعن أنه مكنك إنشاء تعاب ر لمدا بسرعة بدون أن تحتاج لتعر ؾ األنواع المفوضة الخاصة بها. فكم مرة كنت ف وضع تحتاج ف ه لتطب ق مجموعة من المتؽ رات وتحتاج إلى فعل ذلك ف العد د من األماكن فف الكود التال مرت عدة حاالت مشابهة وعادة مكننا معالجة ذلك بح ث مكن التحقق من الشرط ف مكان واحد بدال من التشتت ف أرجاء الوظ فة Class Motorcycle Public color As String Public CC As Integer Public weight As Integer End Class Sub PrintReport(motorcycle As New Motorcycle) If motorcycle.color = "Red" And motorcycle.cc = 600 And _ Motorcycle.weight > 300 And Motorcycle.weight < 400 Then ' do something here End If ' do something here If motorcycle.color = "Red" And motorcycle.cc = 600 And _ Motorcycle.weight > 300 And Motorcycle.weight < 400 Then ' do something here End If End Sub وف بعض األح ان ستخدم هذا التحقق ف هذه الوظ فة فقط و مكننا إضافة إجراء ف الفئة لدعم تلك الوظ فة فقط والق ام بذلك إثر على عمل ة ص انة الكود فماذا لو قام أحد ما باستدعاء هذه الوظ فة ف مكان آخر واحتجت للق ام بتعد ل ما وقد إدي هذا ف بعض الفئات إلى وجود وظائؾ صعب تعقبها جاعال خاص ة IntelliSense ا قل فائدة لوجود العد د من المدخالت اإلضاف ة ف ها إضافة إلى خرق منطق المحل ة وإن قمنا بذلك باستخدام طر قة منفصلة مختلفة عندها فضل أن تكون قر بة من الطر قة الت تستخدمها ومع وجود العد د من األشخاص عملون على نفس المشروع صبح من الصعب ص انة المحل ة على المدى الطو ل وهنا ؤت استخدام تعاب ر لمدا وترك المترجم قوم آل ا بإنشاء المفوضات و قوم باستخدامها عند الحاجة Sub PrintReport(motorcycle As New Motorcycle) Dim check = Function(m As Motorcycle) m.color = "Red" And _ 23

m.cc = 600 And _ m.weight > 300 And _ m.weight < 400 If check(motorcycle) Then ' do something here End If ' do something here If check(motorcycle) Then ' do something here End If End Sub قمنا هنا بتعد ل منطق تفحص بعض شروط Motorcycle ل ستخدم تعاب ر لمدا عوضا عن س ئات الطرائق الخاصة ح ث س قوم المترجم تلقائ ا بإنشاء النوع المفوض و قوم بالعمل لك نستط ع استدعاء تعاب ر لمدا أ نما احتاج ذلك وهذه الطر قة مف دة ألنها تضع المنطق قر ب من التصر ح ح ث نقوم بتصن ع نسخة واحدة و قوم المترجم بعدها بمعظم عمل ات الص انة و عتبر هذا مف دا ألنه مكنك من بناء تعب ر معقد كجسم لتعب ر لمدا وباستخدام الربط المتؤخر واالستدالل على النوع ف هذا الس نار و فال نحدد نوع تعب ر لمدا أو المتؽ ر Dim lambda = Function(x) x * x وهنا أ ضا ولد المعالج مفوض مجهول من أجلك ولكن حدد نوع تعب ر لمدا ك System.Object وهذا عن أنه قد تم تفع ل الربط المتؤخر ف هذا الس نار و عندما كون الخ ار Option Strict على الوضع Off و عتبر هذا الس نار و ج دا بالنسبة ألولئك الذ ن عتمدون على الربط المتؤخر ح ث أن تعاب ر لمدا تدعم عمل ات الربط المتؤخر بشكل كامل فف المثال السابق طالما أن المعامل * معرؾ على األنواع الممررة إلى تعب ر لمدا فسوؾ عمل Dim a = lambda(10) Dim b = lambda(cdec(10)) Dim c = lambda("this will throw an exception because " & _ "strings don't support the * operator") وكما ترى من المثال السابق طالما أن المعامل * موجود ف مكتبات زمن التشؽ ل بالنسبة للنوع الممرر فسوؾ جري كل شئ بشكل ج د كما أن تعاب ر لمدا تتؤقلم بشكل رائع مع الربط المتؤخر ف ف جول با ز ك. انكىد ان ىنذ جحث انغطبء بعدما استكشفنا تعاب ر لمدا دعنا نلق نظرة على الكود الذي تم تول ده من قبل المترجم. انظر للكود السابق Sub TestLambda() Dim doubleit As Func(Of Integer, Integer) = _ Function(x As Integer) X * 2 Console.WriteLine(doubleIt(10)) End Sub أنت تعلم أن Func هو مفوض والمفوضات ه مإشرات للوظائؾ فك ؾ قوم المترجم إذا بالعمل ف هذه الحالة قوم المترجم بإصدار وظ فة جد دة و ربطها بمفوض ش ر إلى تلك الوظ فة الجد دة Private Function $GeneratedFunction$(x As Integer) As Integer Return x * 2 End Function Sub TestLambda() Dim doubleit As Func(Of Integer, Integer) = _ AddressOf $GeneratedFunction$ 24

Console.WriteLine(doubleIt(10) End Sub C ح ث ؤخذ المترجم تعب ر لمدا و نشئ وظ فة جد دة بمحتو اته و ؽ ر عبارة التصر ح بح ث ؤخذ تعب ر لمدا عنوان الوظ فة الجد دة المولدة فف هذه الحالة تم تول د الوظ فة بنفس األب الذي حتوي على الطر قة الت تستخدم تعب ر لمدا فإن كان TestLambda معرؾ ف الفئة فسوؾ تم تعر ؾ الوظ فة الجد دة ف الفئة C أ ضا ونالحظ أن هذه الوظ فة ؼ ر قابلة لالستدعاء و تم التصر ح عنها باستخدام محدد الوصول Private جعببير ن ذا ورفع ان حغيرات ف األمثلة السابقة ش ر جسم تعاب ر لمدا إلى متؽ رات تم تمر رها إلى تلك المتؽ رات ومع ذلك تؤت قوة تعاب ر لمدا مع ثمار رفع المتؽ رات وجم ع تعاب ر لمدا مبن ة على مبدأ متشابه. وتعب ر لمدا مكن أن ستخدم متؽ رات مرتبطة أو متؽ رات حرة لم تم تعر فها ضمن التوق ع الخاص بتعب ر لمدا فالمتؽ رات الحرة ممكن أن كون قد تم التصر ح عنها ف اإلجراء المستدع للتعب ر فقد تكون متؽ رات محل ة أو محددات ممررة لذلك اإلجراء والتعاب ر المرتبطة تكون تلك الت تم التصر ح عنها ف جسم التعب ر أو عناصر ف الفئة المحتو ة للتعب ر لمدا متضمنا الفئة األب لتلك الفئة. وهذا هام من أجل التم ز ب ن المتؽ رات المرتبطة والحرة ف تعاب ر لمدا الخاصة بك ألنها تإثر على داللة تعب ر لمدا والكود الذي تم تول ده وبالتال إثر على صحة برنامجك وهذا مثال حتوي على تعاب ر لمدا تستخدم متؽ رات مرتبطة وأخرى حرة Function MakeLambda() As Func(Of Integer, Integer) Dim y As Integer = 10 Dim addten As Func(Of Integer, Integer) = Function(ByVal x) x + y Return addten End Function Sub UseLambda() Dim addten = MakeLambda() Consloe.WriteLine(addTen(5)) End Sub فهذا الكود س قوم بطباعة 15 على نافذة الكونسول عندما تم استدعاء UseLambda ولكن مكن أن تسؤل نفسك ك ؾ عمل هذا تحدد الوظ فة MakeLambda المتؽ ر y كمتؽ ر محل والتعب ر لمدا ستخدم y ولكن التعب ر لمدا تم إعادته كنوع معاد من الوظ فة MakeLambda والوظ فة UseLambda تحصل على التعب ر لمدا من الوظ فة MakeLambda وتنفذ التعب ر لمدا و بدو األمر كما لو أن المتؽ ر y قد تم تذكره من قبل التعب ر لمدا. ففترة ح اة المتؽ ر y تنته مع نها ة الطر قة MakeLambda فعندما نحصل على التعب ر لمدا من MakeLambda فسوؾ تصبح MakeLambda خارج المجال و جب إزالة المساحة الت تحجزها ف المكدس وبطر قة ما علق هذا المتؽ ر مع تعب ر لمدا وهذا ما عرؾ برفع المتؽ ر Variable Lifting فف هذه الحالة دعى المتؽ ر y بالمتؽ ر المرفوع وكما ترى فالمتؽ رات المرفوعة تعتبر م زة برمج ة قو ة فالمترجم قوم بالكث ر من العمل من أجل تمك نك من إمساك حالة المتؽ ر ح ث حفظها خارج مجال فترة ح اتها الطب ع ة فعندما صادؾ المترجم تعاب ر لمدا تستخدم متؽ رات حرة قوم برفع المتؽ ر إلى فئة تدعى Closure بح ث تكون فترة ح اة هذه الفئة تمتد إلى ما بعد فترة ح اة المتؽ رات الحرة المستضافة داخلها و قوم المترجم بإعادة كتابة الوصول إلى المتؽ رات ف الطرق ل تم الوصول إلى نسختها الموجودة ف الفئة Closure دعنا نس ر مرة أخرى عبر المثال MakeLambda Dim MakeLambda() As Func(Of Integer, Integer) Dim y As Integer = 10 Dim addten As Func(Of Integer, Integer) = Function(ByVal x) x + y Return addten End Function وكما قمنا بالتحل ل سابقا فالمتؽ ر x مرتبط بمحدد التعب ر لمدا ولكن المتؽ ر Closure الت تلتقط المتؽ رات الحرة كما ف تعر ؾ تعب ر لمدا y تعب ر حر و قوم المترجم بالكشؾ عن ذلك و تابع بإنشاء الفئة Public Class _Closure$ 1 Public y As Integer 25

Public Function _Lambda$ 1(ByVal x As Integer) As Integer Return x + Me.y End Function End Class مكنك رإ ة أن متؽ ر Closure لتقط المتؽ ر y و خزنه ف الفئة Closure و تم تحو ل المتؽ ر الحر بعدها إلى متؽ ر مرتبط داخل الفئة Closure كما قوم المترجم بإعادة كتابة الطر قة الت تحتوي على التعب ر لمدا لتبدو كما ل Function MakeLambda() As Func(Of Integer, Integer) Dim Closure As New _Closure$ 1 Closure.y = 10 Return AddressOf Closure._Lambda$ 1 End Function مكنك اآلن رإ ة ك ؾ قوم المترجم بإنشاء المتؽ ر Closure و ع د كتابة المتؽ ر y الذي تم رفعه ضمن المتؽ ر Closure و ضبط ق مته و ع د ببساطة عنوان تعب ر لمدا المخزن ضمن الفئة Closure ومن الهام مالحظة أن المترجم قوم برفع المتؽ رات الحرة ف تعاب ر لمدا فقط و تم التقاط حالة المتؽ ر ف Closure الذي بقى موجودا طالما أن تعب ر لمدا بق موجودا. انظر للمثال التال Sub Test() Dim y As Integer = 10 Dim Lambda As Func(Of Integer, Integer) = Function(ByVal x) x + y y = 20 Console.WriteLine(Lambda(5)) End Sub ما ه الق مة الت تظهر عند تنف ذ الوظ فة السابقة إن قلت 25 فقد أصبت. فلماذا 25 إذا المترجم قوم بالتقاط وإعادة كتابة جم ع المتؽ رات الحرة y إلى نسخة Closure كالتال Sub Test() Dim Closure As New $Closure_Compiler_Generated_Name$ Closure.y = 10 Dim Lambda = AddressOf Closure.Lambda_1 Closure.y = 20 Console.WriteLine(Lambda(5)) End Sub فف الوقت الذي تم تنف ذ تعب ر لمدا ف ه تكون ق مة y قد تؽ رت إلى 20 وبهذا فعندما تم تنف ذ تعب ر لمدا ع د + 20 5 وهذا هام جدا ألنه عندما نؤت للحد ث عن الحلقات وأن المتؽ رات الحرة تم التقاطها ف Closure وح د قد ترى تصرفات ؼر بة. انظر للمثال التال Sub Test() For I = 1 To 5 StartThread(Function() I + 10) Next End Sub افرض أن StartThread نشئ مسارا جد دا و طبع النت جة على الكونسول وطالما أنه تم التقاطه إلى Closure ف مكن أن تكون الحلقة قد ؼ رت ق مة I ف الوقت الذي قوم المسار ف ه باستدعاء تعب ر لمدا وف هذه الحالة فالبرنامج قد ال طبع النت جة المتوقعة وبدال عن ذلك عل ك رإ ة المتؽ ر الملتقط داخل الحلقة Sub Test For I = 1 To 5 Dim x = I StartThread(Function() x + 10) Next 26