在一个网站上,我读到:
女士加载是延迟加载对象直到我们需要这些数据的概念。换句话说,我们按需加载对象,而不是提前加载不必要的数据。
我想尝试在我的简单控制台应用程序中使用延迟加载。
Student
班级
public class Students
{
public string Name { get; set; }
public string Surname { get; set; }
public string PESEL { get; set; }
private Lazy<List<Students>> LazyStudents;
public Students()
{
}
public List<Students> StudentsProperty
{
get
{
if (LazyStudents == null)
LazyStudents = new Lazy<List<Students>>(() => LoadStudensList());
return LazyStudents.Value;
}
}
public List<Students> LoadStudensList()
{
List<Students> tempStudentsList = new List<Students>();
tempStudentsList.Add(new Students() { Name = "Adam", Surname = "Wróbel", PESEL = "96120904999" });
tempStudentsList.Add(new Students() { Name = "Edyta", Surname = "Urbańczyk", PESEL = "76354736458" });
tempStudentsList.Add(new Students() { Name = "Gabriela", Surname = "Rydwańska", PESEL = "72637284923" });
tempStudentsList.Add(new Students() { Name = "Dawid", Surname = "Rytel", PESEL = "62736482732" });
return tempStudentsList;
}
}
Program
和Main()
方法:
class Program
{
static void Main(string[] args)
{
Students students = new Students();
Console.WriteLine("Hello World!");
foreach (var items in students.StudentsProperty)
{
Console.WriteLine($"Imię: {items.Name}");
Console.WriteLine($"Nazwisko: {items.Surname}");
Console.WriteLine($"PESEL: {items.PESEL}");
Console.WriteLine("");
}
Console.WriteLine("Hello World!");
}
}
我想我使用延迟加载,当我创建学生类 StudentsProperty 的新对象时(从延迟列表返回元素)仍然为空。当我使用使用 StudentsProperty 的方法时,将添加到 LazyList 的元素
foreach (var items in students.StudentsProperty)
{
Console.WriteLine($"Imię: {items.Name}");
Console.WriteLine($"Nazwisko: {items.Surname}");
Console.WriteLine($"PESEL: {items.PESEL}");
Console.WriteLine("");
}
我在foreach
循环之前添加断点,我看到 StudentsProperty 有元素:
我是否错误地实现了延迟加载,或者我是否理解错误?
Lazy.Value
是懒惰得到评估的时候。
LazyStudents = new Lazy<List<Students>>(() => LoadStudensList());
return LazyStudents.Value;
没有任何意义。在第一行中,您说“在需要时评估”,第二行说“我现在需要它”。
通过空值检查,您已经自己完成了所有懒惰的评估。使用这个:
private Lazy<List<Students>> LazyStudents = new Lazy<List<Students>>(() => LoadStudensList());
public List<Students> StudentsProperty
{
get
{
return LazyStudents.Value;
}
}
或这个:
private List<Students> LazyStudents;
public List<Students> StudentsProperty
{
get
{
if (LazyStudents == null)
LazyStudents = LoadStudensList();
return LazyStudents;
}
}
它们在概念上应该是相同的。除了多线程保护、调试和可能其他令人讨厌的细节外,大多数情况下没有区别。
为什么在调试器中看到值的问题有点复杂。查看Lazy source,它应该在调试器中显示 null,感谢internal T ValueForDebugDisplay
. 然而,你不是在看懒惰的价值。通过查看Students.StudentsProperty
您正在查看您的get
和 debbuger 评估 getter 并且您的 getter 强制 Lazy 进行评估。您绕过了 MS 为我们创建的所有调试代码。Lazy
直接暴露,这是应该的。或者,而不是调试器,登录LoadStudensList()
底线:Lazy
只有在Value
被调用之前才懒惰。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句