潍坊网站公司,四川省建设勘察设计网站,专业做标书,利尔化学股票最新消息延迟初始化 是一种将对象的创建延迟到第一次需要用时的技术#xff0c;换句话说#xff0c;对象的初始化是发生在真正需要的时候才执行#xff0c;值得注意的是#xff0c;术语 延迟初始化 和 延迟实例化 的意思是相同的——可以互换使用#xff0c;通过使用 延迟初始化 技… 延迟初始化 是一种将对象的创建延迟到第一次需要用时的技术换句话说对象的初始化是发生在真正需要的时候才执行值得注意的是术语 延迟初始化 和 延迟实例化 的意思是相同的——可以互换使用通过使用 延迟初始化 技术可以避免应用程序不必要的计算和内存消耗这篇文章我们将会讨论如何在 C# 中使用 延迟初始化。有些朋友听完这些可能会懵逼接下来用一个简单的例子来了解下 延迟加载 的场景考虑下面两个类 Customer 和 Order Customer 类包含了一个 Orders 属性一个人肯定会有很多的订单也就意味着它可能包含了很多的数据甚至还需要连接数据库去获取 Orders 记录在这种场景下没必要给 customer 集合中的所有人都带上完整的 orders这个初始化开销是巨大的优化点就是不加载 Orders直到某些 customer 真的需要 Orders 时才按需灌入。使用 LazyT 你可以自己写一段逻辑来实现 延迟初始化在 .Net Framework 4.0 之后就没必要了 因为在 System 命名空间下已经提供了 LazyT而且还是 线程安全 的可以使用这个类来延迟 资源密集型 的对象按需创建。当使用 LazyT 的时候这里的 T 就是你要延迟的集合那如何做到按需加载呢调用 LazyT.Value 即可下面的代码片段展示了如何使用 LazyT。
LazyIEnumerableOrder orders new LazyIEnumerableOrder();
IEnumerableOrder result lazyOrders.Value;现在考虑下面的两个类: Author 和 Blog一个作者可以写很多文章所以这两个类之间是 一对多 的关系下面的代码片段展示了这种关系。public class Author{public int Id { get; set; }public string FirstName { get; set; }public string LastName { get; set; }public string Address { get; set; }public ListBlog Blogs { get; set; }}public class Blog{public int Id { get; set; }public string Title { get; set; }public DateTime PublicationDate { get; set; }}值得注意的是关系型数据库中的 一对多 关系映射到对象模型就是 Author 类中增加一个 List Blogs 属性使用这个属性Author 就可以维持一个或者多个 Blog 实例对象对吧。现在假定在 用户界面 上仅需展示 Author 的基础信息比如说(firstnamelastnameaddress在这种场景下给 Author 对象加载 Blogs 集合是毫无意义的当真的需要加载 Blogs 时执行 Blogs.Value 即可立即执行下面展示了 LazyBlog Blogs 的用法。public class Author{public int Id { get; set; }public string FirstName { get; set; }public string LastName { get; set; }public string Address { get; set; }public LazyIListBlog Blogs new LazyIListBlog(() GetBlogDetailsForAuthor(this.Id));private IListBlog GetBlogDetailsForAuthor(int Id){//Write code here to retrieve all blog details for an author.}}使用通用的 Lazy 接下来让我们看看如何使用泛型的 Lazy 实现单例模式下面的 StateManager 是线程安全的同时为了演示 延迟初始化我使用了 静态构造函数 来确保 C# 编译器不会将它标记为 beforefieldinit。public sealed class StateManager{private StateManager(){}public static StateManager Instance{get{return Nested.obj;}}private class Nested{static Nested(){}internal static readonly StateManager obj new StateManager();}}下面我用 LazyT 来包装 StateManager你会发现使用 LazyT 来做延迟初始化真的是太简单了。。。public class StateManager{private static readonly LazyStateManager obj new LazyStateManager(() new StateManager());private StateManager() { }public static StateManager Instance{get{return obj.Value;}}}可以瞄一下上面代码的 Instance 属性它被做成只读属性了同时也要注意 obj.Value 也是一个只读属性。public class LazyT{public T Value{get{if (_state ! null){return CreateValue();}return _value;}}}延迟初始化 是一个很不错的性能优化技术它允许你将那些 资源密集型 的对象延迟到你真正需要加载的时候再加载大家结合自己的场景尽情的使用吧译文链接https://www.infoworld.com/article/3227207/how-to-perform-lazy-initialization-in-c.html