المحتوى عن 'linq'.



مزيد من الخيارات

  • ابحث بالكلمات المفتاحية

    أضف وسومًا وافصل بينها بفواصل ","
  • ابحث باسم الكاتب

نوع المُحتوى


التصنيفات

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

التصنيفات

  • PHP
    • Laravel
    • ووردبريس
  • جافاسكريبت
    • Node.js
    • jQuery
    • AngularJS
    • Cordova
  • HTML
    • HTML5
  • CSS
  • SQL
  • سي شارب #C
    • منصة Xamarin
  • بايثون
    • Flask
    • Django
  • لغة روبي
    • Sass
    • إطار عمل Bootstrap
    • إطار العمل Ruby on Rails
  • لغة Go
  • لغة جافا
  • لغة Kotlin
  • برمجة أندرويد
  • لغة Swift
  • لغة R
  • لغة TypeScript
  • سير العمل
    • Git
  • صناعة الألعاب
    • Unity3D
  • مقالات برمجة عامة

التصنيفات

  • تجربة المستخدم
  • الرسوميات
    • إنكسكيب
    • أدوبي إليستريتور
    • كوريل درو
  • التصميم الجرافيكي
    • أدوبي فوتوشوب
    • أدوبي إن ديزاين
    • جيمب
  • التصميم ثلاثي الأبعاد
    • 3Ds Max
    • Blender
  • نصائح وإرشادات
  • مقالات تصميم عامة

التصنيفات

  • خواديم
    • الويب HTTP
    • قواعد البيانات
    • البريد الإلكتروني
    • DNS
    • Samba
  • الحوسبة السّحابية
    • Docker
  • إدارة الإعدادات والنّشر
    • Chef
    • Puppet
    • Ansible
  • لينكس
  • FreeBSD
  • حماية
    • الجدران النارية
    • VPN
    • SSH
  • مقالات DevOps عامة

التصنيفات

  • التسويق بالأداء
    • أدوات تحليل الزوار
  • تهيئة محركات البحث SEO
  • الشبكات الاجتماعية
  • التسويق بالبريد الالكتروني
  • التسويق الضمني
  • التسويق بالرسائل النصية القصيرة
  • استسراع النمو
  • المبيعات
  • تجارب ونصائح

التصنيفات

  • إدارة مالية
  • الإنتاجية
  • تجارب
  • مشاريع جانبية
  • التعامل مع العملاء
  • الحفاظ على الصحة
  • التسويق الذاتي
  • مقالات عمل حر عامة

التصنيفات

  • الإنتاجية وسير العمل
    • مايكروسوفت أوفيس
    • ليبر أوفيس
    • جوجل درايف
    • شيربوينت
    • Evernote
    • Trello
  • تطبيقات الويب
    • ووردبريس
    • ماجنتو
  • أندرويد
  • iOS
  • macOS
  • ويندوز

التصنيفات

  • شهادات سيسكو
    • CCNA
  • شهادات مايكروسوفت
  • شهادات Amazon Web Services
  • شهادات ريدهات
    • RHCSA
  • شهادات CompTIA
  • مقالات عامة

أسئلة وأجوبة

  • الأقسام
    • أسئلة ريادة الأعمال
    • أسئلة العمل الحر
    • أسئلة التسويق والمبيعات
    • أسئلة البرمجة
    • أسئلة التصميم
    • أسئلة DevOps
    • أسئلة البرامج والتطبيقات
    • أسئلة الشهادات المتخصصة

التصنيفات

  • ريادة الأعمال
  • العمل الحر
  • التسويق والمبيعات
  • البرمجة
  • التصميم
  • DevOps

تمّ العثور على 2 نتائج

  1. تعتبر تقنيّة Linq من التقنيّات الجديدة نسبيًّا في سي شارب ولغات دوت نت عمومًا. تسمح هذه التقنيّة بإجراء عمليّات استعلام معقّدة لاستخلاص البيانات بشكل سلس وسهل بسبب شكلها المألوف كما سنرى لاحقًا في هذا الدرس. لتقنيّة Linq أشكال متعدّدة: Linq to Objects: للتعامل مع البيانات الموجودة في ذاكرة البرنامج. Linq To XML: للتعامل مع البيانات النصيّة الموجودة بتنسيق XML. Linq To SQL: وهي تقنيّة خاصّة بالحصول على البيانات من خادم SQL Server. في الحقيقة تمّ التخلّي عن هذه التقنيّة رغم حداثتها، وذلك لصالح تقنيّة أحدث وأكثر تطوّرًا وهي Entity Framework. كما يتحدّث هذا الدرس عن تعابير Lambda وهي من المزايا المفيدة والتي تسهّل عمل المبرمجين إلى حدٍّ كبير. ستناول في هذا الدرس الشكل الأوّل من Linq، وهو استخدام Linq مع الكائنات Objects. ولكن قبل ذلك لنتحدّث قليلًا عن تعابير Lambda. تعابير Lambda تستطيع تخيّل تعابير Lambda على أنّها دوال functions صغيرة ليس لها اسم، تعمل على إجراء عمليّات حسابيّة بسيطة، ومن الممكن أن ترجع نتيجة. في الواقع يمكن للنوّاب Delegates أن تغلّف تعابير Lambda ضمن شروط محدّدة. سنتناول مثالًا بسيطًا يوضّح كيفيّة التعامل معها. انظر إلى الشيفرة التالية: class Program { delegate int Square(int x); static void Main(string[] args) { Square square = (x) => x * x; int result = square(5); } } صرّحنا في الشيفرة السابقة عن النائب Square الذي يتطلّب وسيطًا واحدًا من النوع int ويُرجع قيمة من نفس النوع. يُفترض بهذا النائب بأن يُغلّف التوابع التي تعمل على إيجاد مربّع عدد صحيح. إذا نظرت الآن إلى التابع Main ستجد أنّنا في السطر الأوّل منه نصرّح عن المتغيّر square من نوع النائب Square، حيث نُسند إليه ما يلي: (x) => x * x التعبير السابق هو تعبير Lambda بسبب وجود السهم <= ضمنه. فهم هذا التعبير بسيط، فهو يطلب وسيطًا وحيدًا (x) على يسار السهم، ويضرب قيمة هذا الوسيط بنفسها: x * x على يمين السهم، سيُرجع هذا التعبير قيمة x مضروبةً بنفسها. ولكن الملفت في الأمر أنّنا قد أسندنا هذا التعبير إلى متغيّر من نوع النائب Square. السبب في ذلك أنّ تعبير Lambda السابق يتوافق مع النائب Square في أنّه يحتاج إلى وسيط وحيد من النوع int ويُرجع قيمة من نفس النوع. ولكنّنا لم نوضّح في تعبير Lambda نوع الوسيط أو نوع القيمة المُعادة! لا مشكلة في ذلك، فسيتم استخلاص النوع من الوسيط المُمرّر وذلك بشكل تلقائي. كمثال آخر على استخدام تعبير Lambda يمكن كتابة تعبير يتطلّب وسيطين ولكن لا يُرجع أي قيمة. انظر إلى الشيفرة التالية: class Program { delegate void SumAndPrinting(int a, int b); static void Main(string[] args) { SumAndPrinting sumAndPrnt = (a, b) => Console.WriteLine(a + b); sumAndPrnt(3, 4); } } النائب SumAndPrinting يقبل الآن وسيطين من النوع int لكنّه لا يُرجع أي قيمة (void). انظر إلى تعبير Lambda كيف أصبح: (a, b) => Console.WriteLine(a + b) لاحظ كيف أنّ الوسائط الموجودة بين قوسين تفصل بينها فواصل عاديّة دون تحديد الأنواع. كما يمكنك أن تلاحظ أيضًا بأنّ هذا التعبير مهمّته جمع قيمتي الوسيطين والطبع إلى الشاشة دون إرجاع أيّ قيمة. ملاحظة: يمكننا الاستغناء عن القوسين في تعبير Lambda، إذا أردنا تمرير وسيط واحد فقط. مثل: x => x * x استعلاماتLinq للاستفادة من Linq يجب إضافة نطاق الاسم System.Linq باستخدام الكلمة المحجوزة using. أفضل وسيلة لفهم Linq هي من خلال مثال تطبيقي بسيط، في البرنامج Lesson15_01 سنستخدم الصنف Student الذي استخدمناه في درس سابق ولكن سنجري فيه بعض التعديلات البسيطة، حيث أصبحنا نفصل اسم الطالب FirstName عن كنيته LastName، بالإضافة إلى إضافة حقل جديد اسمه Id من النوع int، والذي يُعبّر عن رقم الطالب: class Student { public int Id { get; set; } public string FirstName { get; set; } public string LastName { get; set; } public int Mark { get; set; } } سننشئ 10 كائنات من الصنف Student ونخزّنها ضمن مجموعة عموميّة <List<Student ثم نُجري على هذه المجموعة بعض "الحيل" باستخدام Linq. الهدف من هذا البرنامج هو إجراء عمليّة تصفية على هؤلاء الطلّاب بحيث نحصل على الطلّاب الذين تكون درجاتهم أكبر تمامًا من 60. سيحتوي البرنامج Lesson15_01 على أفكار جديدة ولكن مفيدة فكن مستعدًّا: 1 using System; 2 using System.Collections.Generic; 3 using System.Linq; 4 5 namespace Lesson15_01 6 { 7 class Student 8 { 9 public int Id { get; set; } 10 public string FirstName { get; set; } 11 public string LastName { get; set; } 12 public int Mark { get; set; } 13 } 14 15 class Program 16 { 17 static void Main(string[] args) 18 { 19 List<Student> studentsList = new List<Student>() 20 { 21 new Student {Id = 1, FirstName = "Ahmad", LastName = "Morad" , Mark = 80}, 22 new Student {Id = 2, FirstName = "Husam", LastName = "Sayed" , Mark = 75}, 23 new Student {Id = 3, FirstName = "Nour", LastName = "Hasan" , Mark = 65}, 24 new Student {Id = 4, FirstName = "Bssel", LastName = "Shamma" , Mark = 30}, 25 new Student {Id = 5, FirstName = "Ahmad", LastName = "Khatib" , Mark = 90}, 26 new Student {Id = 6, FirstName = "Maryam", LastName = "Burhan" , Mark = 95}, 27 new Student {Id = 7, FirstName = "Sarah", LastName = "Burhan" , Mark = 100}, 28 new Student {Id = 8, FirstName = "Mansour", LastName = "Khalid" , Mark = 50}, 29 new Student {Id = 9, FirstName = "Omran", LastName = "Barrak" , Mark = 45}, 30 new Student {Id = 10, FirstName = "Hasan", LastName = "Anis" , Mark = 56}, 31 }; 32 33 Console.WriteLine("Full List:"); 34 Console.WriteLine("----------"); 35 PrintList(studentsList); 36 37 38 IEnumerable<Student> students = from student in studentsList 39 where student.Mark > 60 40 select student; 41 42 Console.WriteLine(); 43 Console.WriteLine("After applying Linq:"); 44 Console.WriteLine("----------"); 45 PrintList(students); 46 } 47 48 private static void PrintList(IEnumerable<Student> students) 49 { 50 Console.WriteLine("{0,-5}{1,-15}{2,-15}{3,-10}", "Id", "First Name", "Last Name", "Mark"); 51 52 foreach (Student s in students) 53 { 54 Console.WriteLine("{0,-5}{1,-15}{2,-15}{3,-10}", s.Id, s.FirstName, s.LastName, s.Mark); 55 } 56 } 57 } 58 } نفّذ البرنامج السابق لتحصل على شكل شبيه بما يلي: لاحظ كيف استثنى البرنامج في القائمة الثانية الطلاب الذين تقل درجاتهم عن 60 أو تساويها. قارن بين القائمتين واكتشف العناصر المستثناة. يبدأ البرنامج في التابع Main بإنشاء 10 كائنات من النوع Student تمثّل بيانات عشرة طلّاب وإسناد هذه الكائنات فورًا إلى المجموعة القائمة studentsList بشكل مختصر (الأسطر من 19 إلى 31). الملفت هنا هو طريقة إنشاء كل من هذه الكائنات. انظر إلى السطر 21 مثلًا: new Student {Id = 1, FirstName = "Ahmad", LastName = "Morad" , Mark = 80} هذا شكل مختصر لإنشاء كائن من النوع Student حيث استخدمنا حاضنة {} بعد اسم الصنف Student مباشرةً وكتبنا أسماء الخصائص التي نريد تهيئتها ضمن هذه الحاضنة. بالنسبة لبانيّة الصنف Student فستُستدعى بكلّ تأكيد. يعتبر هذا الشكل من الإنشاء والإسناد المباشر للخصائص مفيدًا للغاية (أستخدمه بكثرة في برامجي الخاصّة) حيث يقلّل من أسطر الشيفرة البرمجيّة إلى حدٍّ كبير. سيطبع البرنامج بعد ذلك القائمة التي أنشأناها قبل قليل من باب التوضيح، وذلك من خلال استدعاء التابع الساكن PrintList (السطر 35) بالشكل التالي: PrintList(studentsList); مرّرنا لهذا التابع القائمة الكاملة studentsList. التصريح عن التابع الساكن موجود في الأسطر بين 48 و 56 وسنتكلّم عنه بعد قليل. يحتوي السطر 38 على عبارة برمجيّة تستخدم استعلام Linq: IEnumerable<Student> students = from student in studentsList where student.Mark > 60 select student; يقع استعلام Linq على يمين عامل الإسناد (=)، وفي الحقيقة إذا كان لديك اطّلاع على لغة SQL فسيكون هذا الاستعلام مألوفًا بالنسبة إليك. لنركّز الآن على هذا الاستعلام فحسب: from student in studentsList where student.Mark > 60 select student يبدأ الاستعلام بالكلمة المحجوزة from يتبعه اسم متغيّر جديد يمكنك تسميّته بأيّ اسم ترغبه. اخترت الاسم student لأنّني وجدتّه معبّرًا. بعد اسم المتغيّر الجديد نجد الكلمة المحجوزة in وبعدها اسم المجموعة التي نريد تطبيق الاستعلام عليها. إذًا أصبح بإمكاننا قراءة السطر الأوّل من الاستعلام على الشكل التالي: يبدأ السطر الثاني بالكلمة المحجوزة where وهي اختياريّة ومن الممكن عدم كتابتها، وهي تسمح بكتابة شرط من ممكن تطبيقه على عناصر المجموعة studentsList. بالنسبة لمثالنا هذا، اخترت تطبيق الشرط: where student.Mark > 60 أي أنّني أريد أن تكون درجة كل طالب (student) أكبر تمامًا من 60. أمّا السطر الثالث select student فهو يخبر Linq عن شكل البيانات التي نريد الحصول عليها بنتيجة تنفيذ الاستعلام. في مثالنا هذا نريد الحصول على مجموعة كل عنصر من عناصرها هو كائن من النوع Student. بنتيجة تنفيذ الاستعلام السابق سيحتوي المتغيّر students على مرجع لكائن مجموعة يحقّق الواجهة <IEnumerable<Student ولا يهمّك في الحقيقة ما هو النوع الفعليّ لهذه المجموعة. يمكن لاستعلام Linq أن يُنتج مرجعًا لكائن مجموعة يحقّق الواجهة <IQueryable<Student ولكنّ الحديث عن هذا الموضوع هو خارج مجال الدرس. في الواقع يمكن استخدام شروط أكثر تعقيدًا كأن نرغب بالحصول على جميع الطلّاب الذين تتراوح درجاتهم بين 60 و90 ضمنًا على سبيل المثال، وذلك باستخدام العامل && بالشكل التالي: from student in studentsList where student.Mark >= 60 && student.Mark <= 90 select student كما من الممكن أنّ نرتّب البيانات حسب رقم الطالب id، أو بحسب اسمه FirstName أو كنيته LastName أو بمزيج منها، وذلك باستخدام الكلمة المحجوزة orderby الخاصّة بـ Linq: from student in studentsList where student.Mark >= 60 && student.Mark <= 90 orderby student.FirstName, student.LastName select student سيقوم الاستعلام السابق بترتيب العناصر التي توافق الشرط الموجود في القسم where حسب الاسم ثمّ حسب الكنيّة. توجد في الحقيقة الكثير من المزايا القويّة التي تتمتّع بها استعلامات Linq والتي لا يتّسع هذا الدرس لذكرها. بالنسبة للتابع PrintList (الأسطر من 50 حتى 58) فيقتصر دوره على طباعة جدول للقائمة التي نمرّرها كوسيط إليه. لاحظ أنّ الوسيط الوحيد الذي يقبله يحقّق الواجهة <IEnumerable<Student لذلك فيمكننا تمرير أي وسيط إليه يحمل مرجعًا إلى كائن من أيّ صنف يحقّق هذه الواجهة بما فيه بالطبع الصنف <List<Student. الأمر الوحيد الجديد في هذا التابع هو استخدامه لتنسيق مختلف في إظهار البيانات بشكل جدوليّ. انظر السطر 52. ستجد النص التنسيقي: "{0,-5}{1,-15}{2,-15}{3,-10}" يسمح هذا النص التنسيقي بعرض البيانات بشكل جدوليّ أنيق على الشاشة، حيث يسمح التنسيق التالي {0, -5} بعرض الوسيط ذو الموقع 0 (من التابع WriteLine) ضمن حقل عرضه 5 فراغات بحيث تكون المحاذاة نحو اليسار. أمّا التنسيق {1, -15} فيسمح بعرض الوسيط ذو الموقع 1 ضمن حقل عرضه 15 فراغ بحيث تكون المحاذاة نحو اليسار أيضًا. بإزالة إشارة السالب (-) من التنسيقين السابقين ستصبح المحاذاة نحو اليمين. هل تريد المزيد من الإثارة؟ أضف السطر التالي إلى السطر 43 من البرنامج السابق (أي بعد العبارة التي تستخدم استعلام Linq): double average = students.Average(s => s.Mark); تستخدم هذه العبارة التابع Average من المتغيّر students الذي يحتوي على قائمة الطلّاب بعد التصفيّة كما نعلم. وكما يُوحي اسمه يعمل هذا التابع على حساب معدّل الطلاب (كائنات Student) الموجودين ضمن students. ولكن كيف سيعرف التابع Average الحقل الذي سيتمّ بموجبه حساب المعدّل؟ يتمثّل الحل في استخدام تعبير Lambda يتطلّب وسيطًا واحدًا (الوسيط s) الذي سيمثّل كائن Student، ويُرجع قيمة الخاصيّة Mark له: s => s.Mark سيستخدم التابع هذا التعبير للمرور على جميع العناصر الموجودة ضمن المجموعة students ليحصل على درجة كلّ منها باستخدام تعبير Lambda السابق ثمّ يحسب المعدّل، ليعمل البرنامج على إسناده إلى المتغيّر average وهو من النوع double كما هو واضح. بعد تنفيذ العبارة السابقة وعلى فرض أنّ نسخة البرنامج Lesson15_01 الأساسيّة هي التي استُخدمت، ستكون قيمة average تساوي 77.5، ويمثّل هذا الرقم معدّل الطلاب الذين تكون درجاتهم أكبر تمامًا من 60. قد يبدو كلّ ما قدّمناه جميلًا وممتعًا، لكنّك لن تستمتع بشكل فعليّ بهذه المزايا الرائعة التي توفّرها Linq و تعابير Lambda ما لم تستخدمها في برامجك الخاصّة. أستخدم مثل هذه المزايا في برامجي التي أطوّرها، ولن تتصوّر مدى سعادتي عندما أستخلص بيانات من قاعدة بيانات أو من خدمة ويب web service قد تحتوي على المئات أو الآلاف من البيانات الخام، ثمّ أُطبّق عليها وصفات Linq السحريّة فأحصل على ما أريده بكتابة عبارة برمجيّة واحدة فقط! تمارين داعمة تمرين 1 أجرِ تعديلًا على البرنامج Lesson15_01 بحيث نحصل على جميع الطلّاب الذين تكون درجاتهم أقل تمامًا من 50. تمرين 2 أجرِ تعديلًا آخرًا على البرنامج Lesson15_01 بحيث نحصل على جميع الطلّاب الذين يكون الحرف الأوّل من اسمهم هو "A". (تلميح: أحد الحلول المقترحة هو استخدام التابع StartWith من الخاصيّة النصية FirstName للكائن student أي على الشكل التالي: student.FirstName.StartsWith("A") وذلك بعد الكلمة where في استعلام Linq ). الخلاصة تعرّفنا في هذا الدرس على تعابير Lambda واستعلامات Linq. حيث صمّمنا عدّة برامج توضّح هاتين التقنيّتين المهمّتين في البرمجة باستخدام سي شارب. ستصادف كلًّا منهما كثيرًا في حياتك البرمجيّة، وستكون سعيدًا باستخدامها نظرًا للاختصار الكبير الذي ستحصل عليه في الشيفرة البرمجيّة، هذا فضلًا عن الأداء عالي المستوى الذي لن تستطيع مجاراته باستخدامك للشيفرة التقليديّة.
  2. تُعتبر لغة #C وتُلفظ "سي شارب" غنيّة عن التعريف. فهذه اللغة التي بات عمرها أكثر من 15 عام، أصبحت إحدى اللّغات الأساسيّة في عالم الأعمال. لقد نمت #C من مجرّد كونها لغة عاديّة تستخدم البرمجة كائنيّة التوجّه (OOP) إلى لغة ذات إمكانيّات واسعة وتسهيلات كبيرة جدًّا لخدمة المطوّرين في بناء تطبيقات مؤسّساتيّة بالترافق مع بيئة تطوير ممتازة وهي Visual Studio التي تتكامل مع #C في تقديم الحلول المناسبة للمطوّر. تستطيع أن ترى #C في جميع الأماكن، فلقد أصبحت لغة البرمجة الرئيسيّة التي تتبنّاها مايكروسوفت. تستطيع أن تستخدمها في بناء تطبيقات لويندوز وتطبيقات لأنظمة لينوكس (عن طريق مشروع Mono)، كما يمكنك أن تبني باستخدامها تطبيقات ويب بأنواعها، وإذا أحببت أن تستخدمها في بناء تطبيقات سحابيّة فهي معتمدة في عدد من الخدمات السحابيّة مثل Windows Azure و Amazon AWS. أمّا إذا أردت دخول عالم تطبيقات الأجهزة الذكيّة فستبلي بلاءً حسنًا! فبعد ظهور شركة Xamarin (المنبثقة عن مشروع Mono لتشغيل تطبيقات دوت نت على أنظمة لينوكس) أصبح بإمكانك كتابة تطبيقات أصيلة native applications للعمل على Android و iOS و Windows Phone، وغيرها. نبذة عن الامتحان يقيس هذا الامتحان مهاراتك كمطوّر في استخدام #C حيث أنّ هناك أربعة مجالات رئيسيّة تغطّي الإمكانيّات الأساسيّة لهذه اللغة. تنصح مايكروسوفت أن يتقدّم لهذا الامتحان كلّ مطوّر له خبرة برمجيّة عمرها عامين أو عام واحد في مجال الأعمال باستخدام لغة سي شارب. يكلّف هذا الامتحان حاليًّا مبلغًا وقدره 150 دولارًا أمريكيًّا ويمكنك أن تحجز لإجراء هذا الامتحان عن طريق الإنترنت لإجرائه في أيّ مركز معتمد من مايكروسوفت يمكنك مراجعة الصفحة الرسميّة للامتحان. يجري الامتحان ضمن المركز المعتمد في توقيت مُحدّد تلتزم به. تكون القاعة التي سيجري فيها الامتحان مراقبة، وبعد أن يقوم الموظّف المختص بتحميل أسئلة الامتحان على الحاسوب يبدأ التوقيت. من الضروري التنبّه إلى أنّ النقاط الواردة في هذا المقال لا تمثّل بالضرورة المصدر الوحيد لأسئلة الامتحان، ويجب الانتباه أيضًا إلى وجود بعض المواقع التي تزوّدك بأسئلة مسرّبة لامتحانات سابقة مع الحلول لهذه الأسئلة، وفي الغالب تكون مدفوعة وليست مجّانيّة. المشكلة هنا (بصرف النظر عن كونها مسألة غير قانونيّة) في أنّه قد تكون هذه الأسئلة غير صحيحة بمعنى أنّ مصدرها ليس امتحانات مايكروسوفت، وهناك احتمال أن يكون مصدرها امتحانات مايكروسوفت بالفعل ولكن قد تكون الإجابات المقترحة لها خاطئة، وفي جميع الأحوال لا تستطيع أن تضمن أن تتكرّر هذه الأسئلة في امتحانات قادمة. المجالات الرئيسيّة لأسئلة الامتحان فيما يلي المجالات الرئيسيّة للامتحان، والنسبة المئويّة لمساهمة كلّ منها في أسئلة الامتحان: إدارة سير البرنامج (25%) إنشاء واستخدام الأنواع (24%) تنقيح التطبيقات وحمايتها (25%) الوصول إلى البيانات (26%) 1. إدارة سير البرنامج ستحتاج في هذا المجال إلى الفهم الجيّد والصحيح لكلّ من النقاط التالية التي تُعبّر عن مدى قدرتك على التحكّم بسير البرنامج بشكل سليم. ويغطّي الجوانب التالية: التعامل مع مسارات التنفيذ المتعدّدة multithreading والمعالجة غير المتزامنة asynchronous processing، والمقدرة على استخدم مكتبة مهام تفرّعيّة مثل ParallelFor و Plinq و Tasks، واستخدام الكلمتين المحجوزتين async و await، وإدارة البيانات باستخدام المجموعات المتزامنة concurrent collections. إدارة مسارات التنفيذ المتعدّدة عن طريق مزامنة المصادر synchronous resources، واستخدام القفل locking، وإيقاف تشغيل مهمة task، وأيضًا إنشاء طرائق ذات مسارات تنفيذ آمنة لمعالجة الشروط التسابقيّة race conditions لمسارات التنفيذ. التعامل مع سير البرنامج عن طريق التعامل مع المصفوفات arrays والمجموعات collections، واتخاذ القرارات في البرنامج باستخدام عبارات switch وif/then بالإضافة إلى العوامل الأخرى، كما يجب التمكّن من تقييم وحساب التعابير البرمجيّة. التعامل مع الأحداث events والردود callbacks عن طريق إنشاء معالجات أحداث، والاشتراك في الأحداث وإلغاء الاشتراك بها، واستخدام أنواع نوّاب delegates مضمّنة لإنشاء الأحداث، وإنشاء نوّاب delegates مُخصّصة وتعابير lambda وطرائق عديمة الاسم anonymous methods. معرفة كيفيّة معالجة الاستثناء الناتجة عن الأخطاء التي قد تقع أثناء التنفيذ وذلك عن طريق معالجة مختلف الاستثناءات exceptions من مختلف المصادر عن طريق الكتلة try-catch-finally، وتعلّم كيفيّة رمي الاستثناءات، وتحديد الوقت المناسب لإعادة رمي الاستثناءات، وإنشاء استثناءات مُخصّصة. 2. إنشاء واستخدام الأنواع يختبر هذا المجال مدى قدرتك على التعامل مع الأنواع المضمّنة ضمن إطار العمل دوت نت، بالإضافة إلى مدى قدرتك على إنشاء أنواع جديدة. وأيضًا فهم الفرق الأساسيّ بين أنواع القيمة value types والأنواع المرجعيّة reference types. ويغطّي الجوانب التالية: إنشاء أنواع جديدة عن طريق إنشاء أنواع قيمة value types (مثل structs و enum) وأنواع مرجعيّة reference types وأنواع عموميّة generic types، وإنشاء بانيات constructors ومتغيّرات ساكنة static variables وخصائص مُفهرسَة indexed properties. وأيضًا زيادة تحميل الطرائق overload methods وتجاوز الطرائق override methods. استخدام الأنواع وذلك عن طريق فهم عمليّة التعليب box وإلغاء التعليب unbox لأنواع القيمة، والتحويل cast بين الأنواع، والتعامل مع الأنواع الديناميكيّة dynamic، والتأكّد من التوافقيّة مع الشيفرة غير المُدارة unmanaged code (أي الشيفرة المكتوبة بلغات برمجة لا تتبع لإطار العمل .net) فرض التغليف encapsulation وذلك باستخدام الخصائص، ومحدّدات الوصول (public و private و protected). إنشاء بنية أصناف هرميّة عن طريق تصميم وتحقيق واجهة interface، والوراثة من صنف أساس، إنشاء وتحقيق الأصناف بالاستناد إلى الواجهات IComparable و IEnumerable و IDisposal و IUnknown. إنشاء أنواع جديدة والبحث عن الأنواع أثناء التشغيل runtime باستخدام تقنيّة reflection، وإنشاء وتطبيق وقراءة السمات attributes باستخدام هذه التقنيّة، وتوليد الشيفرة أثناء تشغيل البرنامج باستخدام CodeDom وتعابير lambda، واستخدام الأنواع من فضاء الاسم System.Reflection. إدارة دورة حياة كائن عن طريق التعامل مع المصادر غير المُدارة unmanaged resources، وتحقيق الواجهة IDisposable والتعامل معها. التعامل مع النصوص وذلك باستخدام الأصناف StringBuilder و StringWriter و StringReader، والبحث ضمن النصوص وتنسيقها. 3. تنقيح التطبيقات وحمايتها يختبر هذا المجال مدى قدرتك على التعامل أدوات التنقيح واكتشاف الأخطاء، وكيفيّة حماية بيانات التطبيق والتحقّق منها. ويغطّي الجوانب التالية: التحقّق من المدخلات عن طريق التحقّق من البيانات بتنسيق JSON، وإدارة سلامة البيانات، وتقييم تعبير نظامي regular expression للتحقّق من تنسيق المُدخلات، واستخدام الدوال المضمّنة للتحقّق من نوع البيانات والمحتوى، والمقدرة على كتابة التعابير النظاميّة أيضًا. إجراء تشفير متماثل symmetric وغير متماثل asymmetric، حيث يتم اختيار خوارزميّة التشفير المناسبة، وإنشاء وإدارة الشهادات certificates، والتعامل مع فضاء الاسم System.Security، وتشفير الدفوقات streams. إدارة التجميعات assemblies عن طريق إضافة إصدار لتجميعة، وتوقيع التجميعات باستخدام أسماء قويّة، ووضع تجميعة ضمن ذاكرة التجميعات العامّة global assembly cache، وإنشاء تجميعة WinMD. تنقيح تطبيق بإنشاء وإدارة توجيهات directives للمترجم، واختيار نمط مناسب لعمليّة بناء التطبيق، والتعامل مع أدوات مراقبة الأداء للتطبيق، والتعامل مع التسجيل logging وتعقّب الأثر tracing، واختبار أداء التطبيقات profiling applications، وإنشاء ومراقبة عدّادات الأداء performance counters، وأيضًا الكتابة إلى مسجّل الأحداث event log. 4. الوصول إلى البيانات يختبر هذا المجال مدى قدرة المطوّر على الوصول إلى البيانات والتعامل معها عن طريق العديد من التقنيّات المهمّة حيث يغطّي الجوانب التالية: إجراء عمليات دخل/خرج عن طريق الكتابة والقراءة من الملفات والدفوقات streams، والكتابة والقراءة من الشبكة باستخدام الأصناف الموجودة ضمن فضاء الاسم System.Net، وإجراء عمليات دخل/خرج غير متزامنة asynchronous operations. التعامل مع البيانات عن طريق الحصول على البيانات من قاعدة البيانات وتحديثها، والتعامل مع البيانات بتنسيق JSON وXML، والحصول على البيانات عن طريق خدمات ويب web services. الاستعلام عن البيانات والكائنات ومعالجتها باستخدام LINQ وذلك عن طريق الاستعلام عن البيانات باستخدام عوامل مثل: projection، join، group، take، skip، aggregate، وإنشاء طرائق للتعامل مع استعلامات LINQ، واختيار البيانات المستعلم عنها وتهيئتها باستخدام الأنواع عديمة الاسم anonymous types، والتنفيذ القسري لاستعلام، وقراءة وتصفية وإنشاء بنى المعطيات باستخدام LINQ to XML. سَلْسَلَة serialize البيانات، وإعادة تجميعها deserialize وذلك عن طريق السَلْسَلَة وإعادة التجميع باستخدام السَلْسَلَة الثنائيّة binary serialization والسَلْسَلَة المخصّصة والسَلْسَلَة باستخدام مُسَلْسِل XML ومُسَلْسِل JSON. تخزين البيانات ضمن المجموعات collections واستردادها منها، حيث يتوجّب التمكّن من تخزين البيانات واستردادها باستخدام القواميس dictionaries والمصفوفات والقوائم lists والمجموعات الرياضيّة sets والأرتال queues، واختيار نوع مناسب لمجموعة، وتهيئتها، وإضافة العناصر إليها، وإزالتها منها، واستخدام المجموعات ذات النوع المُحدّد typed collections والمجموعات ذات النوع غير المُحدّد non-typed collections، وإنشاء مجموعات مُخصّصة، وتحقيق واجهات المجموعات.