今天就跟大家聊聊有关如何在C#项目中使用Lazy,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。
使用 Lazy<T>
你可以自己写一段逻辑来实现 延迟初始化,在 .Net Framework 4.0 之后就没必要了, 因为在 System 命名空间下已经提供了 Lazy<T>,而且还是 线程安全 的,可以使用这个类来延迟 资源密集型 的对象按需创建。
当使用 Lazy<T> 的时候,这里的 T 就是你要延迟的集合,那如何做到按需加载呢?调用 Lazy<T>.Value 即可,下面的代码片段展示了如何使用 Lazy<T>。
Lazy<IEnumerable<Order>> orders = new Lazy<IEnumerable<Order>>(); IEnumerable<Order> 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 List<Blog> 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 的基础信息,比如说:(firstname,lastname,address),在这种场景下,给 Author 对象加载 Blogs 集合是毫无意义的,当真的需要加载 Blogs 时,执行 Blogs.Value 即可立即执行,下面展示了 Lazy<Blog> 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 Lazy<IList<Blog>> Blogs => new Lazy<IList<Blog>>(() => GetBlogDetailsForAuthor(this.Id)); private IList<Blog> GetBlogDetailsForAuthor(int Id) { //Write code here to retrieve all blog details for an author. } }
接下来让我们看看如何使用泛型的 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(); } }
下面我用 Lazy<T> 来包装 StateManager,你会发现使用 Lazy<T> 来做延迟初始化真的是太简单了。。。
public class StateManager { private static readonly Lazy<StateManager> obj = new Lazy<StateManager>(() => new StateManager()); private StateManager() { } public static StateManager Instance { get { return obj.Value; } } }
可以瞄一下上面代码的 Instance 属性,它被做成只读属性了,同时也要注意 obj.Value 也是一个只读属性。
public class Lazy<T> { public T Value { get { if (_state != null) { return CreateValue(); } return _value; } } }
看完上述内容,你们对如何在C#项目中使用Lazy有进一步的了解吗?如果还想了解更多知识或者相关内容,请关注亿速云行业资讯频道,感谢大家的支持。
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。