English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية
التأخير في التنفيذ يعني تأخير حساب التعبير إلى اللحظة التي تحتاج إليها فعليًا. إنه يعزز الأداء بشكل كبير عن طريق تجنب التنفيذ غير الضروري.
التأخير في التنفيذ ينطبق على أي مجموعة ذاكرة وبرامج LINQ البعيدة، مثل LINQ-to-SQL،LINQ-to-Entities،LINQ-to-XML وما إلى ذلك.
لنستخدم المثال التالي لفهم التأخير:
في المثال السابق، يمكنك رؤية أن الاستعلام تم تنفيذه وتنفيذه باستخدام دائرة foreach. يُسمى هذا التأخير.
لإجراء فحص تأكد من أن التأخير يعيد دائمًا أحدث البيانات، يمكنك إضافة طالب مراهق آخر بعد دائرة foreach، وفقًا لقائمة طلاب المراهقة:
كما ترون، يعاد تنفيذ الدائرة الثانية من foreach تنفيذ الاستعلام ويعيد أحدث البيانات. يتم إعادة حساب التأخير في كل مرة يتم تنفيذه؛ ويُسمى هذاالطلب التأخيري. هذا هو من بين مزايا التأخير الرئيسية: إنه يقدم دائمًا أحدث البيانات.
يمكنك استخدام yield يتم تنفيذ توسيع مخصصة لكلمة المفتاح IEnumerable بفضل التأخير.
على سبيل المثال، يمكنك إنشاء طريقة توسيع مخصصة لIEnumerable تسمى GetTeenAgerStudents، وسيعود هذا الطريقة قائمة بجميع طلاب المراهقة.
public static class EnumerableExtensionMethods { public static IEnumerable<Student> GetTeenAgerStudents(this IEnumerable<Student> source) { foreach (Student std in source) { Console.WriteLine("Accessing student {0}", std.StudentName); if (std.age > 12 && std.age < 20) yield return std; } } }
لاحظ، في كل مرة يتم استدعاء GetTeenAgerStudents، يتم طباعة اسم الطالب على وحدة التحكم.
الآن، يمكنك استخدام الطرق الموسعة التالية:
C#:
IList<Student> studentList = new List<Student>() { new Student() { StudentID = 1, StudentName = "John", age = 13 } , new Student() { StudentID = 2, StudentName = "Steve", age = 15 } , new Student() { StudentID = 3, StudentName = "Bill", age = 18 } , new Student() { StudentID = 4, StudentName = "Ram", age = 12 } , new Student() { StudentID = 5, StudentName = "Ron", age = 21 } }; var teenAgerStudents = from s in studentList.GetTeenAgerStudents() select s; foreach (Student teenStudent in teenAgerStudents) Console.WriteLine("اسم الطلاب: {0}", teenStudent.StudentName);
الوصول إلى الطلاب John اسم الطلاب: John الوصول إلى الطلاب Steve اسم الطلاب: Steve الوصول إلى الطلاب Bill اسم الطلاب: Bill الوصول إلى الطلاب Ram الوصول إلى الطلاب Ron
من خلال النظر في الناتج، سيتم استدعاء GetTeenAgerStudents() عند استخدام cycle foreach لاستدعاء studentList.
لذلك، من خلال هذه الطريقة، يمكنك استخدامyieldأنشئ طرق مخصصة باستخدام الكلمات المفتاحية للحصول على ميزة التنفيذ المتأخر.