在C#中变得懒惰

如果你和我一样,就在寻找提高应用程序速度的方法。在本文中,我将向你展示.NET框架中一个不太为人所知的类,该类使延迟创建对象变得容易且线程安全。

旧方法

在介绍有趣的东西之前,让我们看一下如何在不使用.NET的情况下尝试做这些事情。 Lazy 类。

通常,在设计类时,你可以从如下代码开始:

你最终可能会发现,随着需要实例化的事物数量的增加,在创建对象时性能会大大降低。

在这种情况下,你可以决定延迟加载 Starship 类。也就是说,你可以决定仅在需要时实例化它们。

一个典型的版本如下所示:

那里有很多行。幸运的是,这可以压缩一点:

嗯,尽管可能不太容易阅读,但这至少是简洁的。

但是,此版本的扩展版本和简洁版本都存在线程问题。

如果两个调用者试图获取一个属性,则有可能一个人可能会通过空检查,然后其线程进入休眠状态,而另一个线程也通过了该空检查。在这种情况下,有两个实例 ExpensiveWarpCore 创建并分配给 _warpCore。这可能不是问题,也可能很重要。

为了完全解决此限制,你需要执行以下操作:

尽管从技术上讲这是更安全的方法,但是你可以在课堂上开始逐步了解如何在引入新的延迟加载属性时进行多次操作,这将变得乏味并且使人们倾向于跳过代码。

略读是很糟糕的,它会隐藏错误,因此,我们寻找一种更好的方法。

懒惰介绍

.NET提供了一个称为 Lazy 允许你在第一次请求对象值时延迟实例化对象。

让我们来看看使用 Lazy

有趣的是,我们将复杂性从属性获取器中移出,并将其置于支持领域。

让我们看一下那个懒惰的初始化器:

new Lazy(() => new ExpensiveWarpCore(), true)

首先,我们在 Lazy 并提供一个通用类型参数,告知类它将提供一个 WarpCore 实例。

接下来,我们传入 Func 调用以创建我们需要的实例的参数。在这种情况下,我们只是称呼 ExpensiveWarpCore 构造函数。请注意,如果我们只是在调用默认构造函数 WarpCore 代替 ExpensiveWarpCore,我们甚至不需要指定此 Func 值。

最后,我们传递了 true 最终参数的布尔值,指示此实例应该是线程安全的。

总结思想

你仅需几行就能知道如何使用 Lazy 可以在首次使用对象时安全,简明地实例化对象,并且可以选择采用线程安全的方式进行实例化。

像其他任何东西一样,在使用Lazy时需要权衡取舍。首先,这些折衷涉及语法,对于较新的开发人员而言可能很难阅读。

总而言之, Lazy 我强烈建议你将其添加到你的标准做法中。缺点是最小的,并且在简单模式上实现标准化的能力是一个巨大的胜利。

在C#中变得懒惰的帖子首先出现在Kill All Defects中。

资讯来源:由0x资讯编译自DEV,原文:https://dev.to/integerman/getting-lazy-in-c-4dk5 ,版权归作者所有,未经许可,不得转载
关注我们:Twitter | Facebook | Linkedin | Medium | Telegram | Weibo | WeChat