【发布时间】:2021-06-23 08:40:34
【问题描述】:
在我阅读的一个网站上:
女士加载是延迟加载对象直到我们需要此数据的概念。换句话说,我们按需加载对象,而不是提前加载不必要的数据。
我想尝试在我的简单控制台应用中使用延迟加载。
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!");
}
}
我想我使用延迟加载,当我创建学生类 StudentProperty 的新对象(从延迟列表返回元素)仍然为空时。当我使用使用 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 循环之前添加断点,我看到 StudentProperty 有元素:
是我错误地实现了延迟加载还是我理解错了什么?
【问题讨论】:
-
你能澄清一下这个说法吗?:“我想我使用延迟加载,当我创建学生类 StudentProperty 的新对象(从延迟列表返回元素)仍然为空”
-
您通过推迟实例化
Lazy<T>类来滥用它。它已经处理了惰性方面,但您也可以通过检查 null 并在StudentsProperty中实例化它来自己处理。您应该在字段的声明点实例化Lazy<T>。至于为什么你可以看到StudentsProperty属性 - 调试器正在访问它,所以它当然会被实例化,因为调试器导致了这个! -
你可以通过一些例子来理解这个概念,而不是仅仅从理论上理解它codeproject.com/Articles/652556/Can-you-explain-Lazy-Loading
-
对于初学者来说,拥有
Lazy意味着您不再需要任何类型的null检查——只需执行readonly Lazy<..> = new Lazy(...)。懒惰地创建Lazy是多余的。其次——在断点处,如果你向调试器询问StudentsProperty——你是在询问数据,所以它当然会出现!只在LoadStudensList中设置断点而不检查表达式,跳过Main,看看它何时被调用。 -
Lazy<T>基本上只是if (x == null) x = new List<T>()的快捷方式。正如其他人已经指出的那样,您可以删除您的空检查。
标签: c# lazy-loading lazy-evaluation