我目前改变一类广泛使用的移动尽可能多的从类构造成延迟初始化特性的昂贵的初始化。下面是一个例子(在C#):

在:

public class ClassA
{
    public readonly ClassB B;

    public void ClassA()
    {
        B = new ClassB();
    }
}

后:

public class ClassA
{
    private ClassB _b;

    public ClassB B
    {
        get
        {
            if (_b == null)
            {
                _b = new ClassB();
            }

            return _b;
        }
    }
}

有在课堂上,我改变这些属性的公平几个,有的不是在某些情况下(因此懒惰)使用,但如果他们使用,他们很可能会被重复调用。

不幸的是,属性通常还使用了类的内部。这意味着存在用于直接通过而不会被初始化的方法中使用的私有变量(_b)的电位。

有一种仅使公共属性(B)提供的类的内部,或者即使是相同的初始化-时需要的?

的替代方法

此,从程序员(未主观足够显然)转贴: https://softwareengineering.stackexchange.com/questions/34270/best-方法换懒惰初始化与 - 属性

有帮助吗?

解决方案

您可以考虑推延迟属性为基类,以避免对所述背衬变量的直接访问。不理想,我知道。我一直认为这是缺乏对延迟属性C#即直接支持的东西。

其他提示

好了,我推荐的解决办法是告诉你的同事使用属性,而不是场。但是你可以傻瓜型它在一定程度上是这样的:

public class ClassA
{
    private Lazy<ClassB> _b = new Lazy<ClassB>(() => new ClassB());

    public ClassB B
    {
        get
        {
            return _b.Value;
        }
    }
}

现在,它是相当困难的搞砸了。

@chibacity张贴(和随后)删除[后来取消删除:P]使用一个抽象基类的替代选项。虽然它可能不是很理想代码分布方面它确实提供了一个很好的封装去除大量的代码混乱制作一个更清洁,更简洁的ClassA的。举例来说,你可以考虑结合技术来实现这两个目标:

public class ClassB { /* Class to be lazily instantiated */ }

public abstract class BaseA
{
    private Lazy<ClassB> _b = new Lazy<ClassB>(() => new ClassB());
    public virtual ClassB B { get { return _b.Value; } }
}

public class ClassA : BaseA
{
    public override ClassB B { get { return base.B; } }
}

乍一看,似乎这样更长篇大论,而当你考虑到ClassA的是,你会在与,这意味着现在你所有的引用都经历同样的属性来工作类 - 有没有多余的不必要的场造成潜在的混乱,也没有直接绕过属性参考_B,而且也没有必要告诉你的同事用哪个...只有一个。

不是说这是做这种正确的方式或者说这是应该或不应该遵循一个模式,我只是指出了什么@chibacity建议的优点是可以被忽视。

这将是很好,如果你可以有隐含的延迟加载特性,而无需参考B.Value ...例如:

[Lazy]
public ClassB B { get; }

或用于无参数构造函数的对象

[Lazy(() => new ClassB("Hello", "World"))]
public ClassB B { get; }

或可能作为@chibacity在注释建议

public ClassB B { lazyget; }

public ClassB B { lazyget : new ClassB(); }

唉,我不认为任何这些都是目前可用的解决方案以任何形式...

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top