首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >什么是延迟初始化?为什么它有用?

什么是延迟初始化?为什么它有用?
EN

Stack Overflow用户
提问于 2009-06-11 00:23:02
回答 7查看 48.9K关注 0票数 92

什么是对象的延迟初始化?您如何做到这一点?优点是什么?

EN

回答 7

Stack Overflow用户

发布于 2009-06-11 00:25:34

延迟初始化是一种性能优化,您可以将对象创建推迟到真正需要它之前(可能代价高昂)。

一个很好的例子是,不要预先创建数据库连接,而是仅在需要从数据库获取数据之前创建。

这样做的关键原因是,(通常)如果您从不需要对象,则可以完全避免创建它。

票数 116
EN

Stack Overflow用户

发布于 2009-06-11 00:41:16

延迟初始化的概念是将对象的创建推迟到对象实际第一次使用。如果使用得当,它可以带来显著的性能提升。

就我个人而言,我在.NET 2.0中创建自己的手动ORM时使用了延迟初始化。当从数据库加载我的集合时,集合中的实际项被延迟初始化。这意味着可以快速创建集合,但只有在我需要时才加载每个对象。

如果您熟悉Singleton模式,您可能也看到过惰性初始化的实际应用。

代码语言:javascript
运行
复制
public class SomeClassSingleton
{
    private static SomeClass _instance = null;

    private SomeClassSingleton()
    {
    }

    public static SomeClass GetInstance()
    {
        if(_instance == null)
            _instance = new SomeClassSingleton();

        return _instance;
    }
}

在这种情况下,直到SomeClassSingleton使用者第一次需要SomeClass实例,它才会被初始化。

票数 22
EN

Stack Overflow用户

发布于 2009-06-11 00:45:17

在一般的计算术语中,“懒惰评估”是指将处理过程推迟到你真正需要它的时候。主要的想法是,如果你不需要它,或者在你使用它之前,值会发生变化,你有时可以避免代价高昂的操作。

System.Exception.StackTrace就是一个简单的例子。这是一个异常的字符串属性,但直到您访问它时,它才会被实际构建。在内部,它做一些类似这样的事情:

代码语言:javascript
运行
复制
String StackTrace{
  get{
    if(_stackTrace==null){
      _stackTrace = buildStackTrace();
    }
    return _stackTrace;
  }
}

这为您节省了实际调用buildStackTrace的开销,直到有人想知道它是什么。

属性是简单地提供这类行为的一种方法。

票数 7
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/978759

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档