gpt4 book ai didi

c# - 了解 C# 中的延迟加载优化

转载 作者:行者123 更新时间:2023-11-30 19:38:04 25 4
gpt4 key购买 nike

在阅读了一些关于 yield、foreach、linq 延迟执行和迭代器在 C# 中的工作原理之后。我决定尝试在一个小项目中优化基于属性的验证机制。结果:

private IEnumerable<string> GetPropertyErrors(PropertyInfo property)
{
// where Entity is the current object instance
string propertyValue = property.GetValue(Entity)?.ToString();

foreach (var attribute in property.GetCustomAttributes().OfType<ValidationAttribute>())
{
if (!attribute.IsValid(propertyValue))
{
yield return $"Error: {property.Name} {attribute.ErrorMessage}";
}
}
}

// inside another method
foreach(string error in GetPropertyErrors(property))
{
// Some display/insert log operation
}

我发现这很慢,但这也可能是由于反射或需要处理大量属性。

所以我的问题是……这是对延迟加载机制的最佳使用还是一种很好的使用?或者我遗漏了一些东西并且只是浪费了大量资源。

注意:代码意图本身并不重要,我关心的是其中延迟加载的使用。

最佳答案

Lazy loading不是特定于 C# 或 Entity Framework 的东西。这是一种常见的模式,允许延迟一些数据加载。延迟意味着不立即加载。需要时的一些示例:

  • 在 (Word) 文档中加载图像。文档可能很大,可能包含数千张图像。如果您在打开文档时加载所有这些,可能会花费大量时间。没有人愿意坐看 30 秒加载文档。 Web 浏览器中使用相同的方法 - 资源不与页面正文一起发送。浏览器延迟资源加载。
  • 加载对象图。它可能是来自数据库的对象、文件系统对象等。加载完整图可能等于将所有数据库内容加载到内存中。这要花多长时间?有效率吗?不会。如果你正在构建一些文件系统资源管理器,你会在开始使用之前加载系统中每个文件的信息吗?如果您只加载有关当前目录的信息(可能是直接子目录),速度会快得多。

延迟加载并不总是意味着延迟加载,直到您真正需要数据为止。在您真正需要该数据之前,加载可能发生在后台线程中。例如。您可能永远不会滚动到网页底部来查看页脚图像。延迟加载意味着仅延迟。 C# 枚举器可以帮助您实现这一点。考虑获取目录中的文件列表:

string[] files = Directory.GetFiles("D:");
IEnumerable<string> filesEnumerator = Directory.EnumerateFiles("D:");

第一种方法返回文件数组。这意味着目录应该获取它的所有文件并将它们的名称保存到数组之前你甚至可以获得第一个文件名。这就像在您看到文档之前加载所有图像。

第二种方法使用枚举器 - 当您询问下一个文件名时,它会一个一个地返回文件。这意味着枚举器将立即返回,而无需获取所有文件并将它们保存到某个集合中。您可以在需要时一个接一个地处理文件。这里延迟获取文件列表。

但是你要小心。如果底层操作没有被延迟,那么返回枚举器不会给你带来任何好处。例如。

public IEnumerable<string> EnumerateFiles(string path)
{
foreach(string file in Directory.GetFiles(path))
yield return file;
}

这里您使用 GetFiles 方法,该方法在返回文件名之前填充文件名数组。因此,一个一个地生成文件不会给您带来任何速度优势。

顺便说一句,在你的情况下你有完全相同的问题 - GetCustomAttributes 扩展在内部使用 Attribute.GetCustomAttributes 返回属性数组的方法。因此,您不会减少获得第一个结果的时间。

关于c# - 了解 C# 中的延迟加载优化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35153049/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com