English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية
L'esecuzione differita significa che l'evaluazione dell'espressione è differita fino al momento in cui è effettivamente necessario. Questo evita l'esecuzione non necessaria e migliora notevolmente le prestazioni.
L'esecuzione differita è applicabile a qualsiasi insieme di memoria e ai provider LINQ remoto, come LINQ-to-SQL, LINQ-to-Entities, LINQ-to-XML e altri.
Facciamo un esempio per comprendere l'esecuzione differita:
Nell'esempio sopra, è possibile vedere che la query è stata implementata ed eseguita durante l'iterazione con il ciclo foreach. Questo viene chiamato esecuzione differita. Quando si accede effettivamente a ogni oggetto nella raccolta e si esegue il trattamento, LINQ gestisce la raccolta studentList.
Per verificare che l'esecuzione differita restituisca sempre i dati più recenti, aggiungere un altro studente adolescente alla fine del ciclo foreach e verificare l'elenco degli studenti adolescenti:
Come visto, il secondo ciclo foreach esegue nuovamente la query e restituisce i dati più recenti. L'esecuzione differita ricomputa ogni volta che viene eseguita; questo viene chiamatoValutazione lenta. Questo è uno dei principali vantaggi dell'esecuzione differita: fornisce sempre i dati più recenti.
È possibile utilizzare in C# yield L'implementazione del metodo di estensione personalizzato per IEnumerable utilizza l'esecuzione differita.
Ad esempio, è possibile implementare un metodo di estensione personalizzato GetTeenAgerStudents per IEnumerable, che restituirà l'elenco di tutti gli studenti adolescenti.
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; } } }
Si prega di notare che ogni volta che GetTeenAgerStudents() viene chiamato, stampiamo il nome dello studente sulla console.
Ora, è possibile utilizzare i seguenti metodi estesi:
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("Nome dello studente: {0}", teenStudent.StudentName);
Accedendo al studente John Nome dello studente: John Accedendo al studente Steve Nome dello studente: Steve Accedendo al studente Bill Nome dello studente: Bill Accedendo al studente Ram Accedendo al studente Ron
Come si può vedere dall'output, GetTeenAgerStudents() viene chiamato quando si itera su studentList con un ciclo foreach.
Quindi, in questo modo, è possibile utilizzareyieldCreare metodi personalizzati con parole chiave per ottenere vantaggi di esecuzione differita.