使用属性进行延迟初始化的方法

Stu*_*egg 8 c# recommendation-engine lazy-initialization c#-3.0

我正在改变一个广泛使用的类,将类昂贵的初始化从类构造函数移动到Lazy Initialized属性.下面是一个例子(在c#中):

之前:

public class ClassA
{
    public readonly ClassB B;

    public void ClassA()
    {
        B = new ClassB();
    }
}
Run Code Online (Sandbox Code Playgroud)

后:

public class ClassA
{
    private ClassB _b;

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

            return _b;
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

在我正在改变的类中有更多这些属性,有些在某些情境中没有使用(因此是懒惰),但如果使用它们,它们可能会被重复调用.

不幸的是,这些属性通常也在课堂内使用.这意味着私有变量(_b)有可能被方法直接使用而不进行初始化.

有没有办法只在类中提供公共属性(B),或者甚至是在需要时初始化的替代方法?

这是从程序员转发的(显然不够主观):https: //softwareengineering.stackexchange.com/questions/34270/best-methods-for-lazy-initialization-with-properties

mqp*_*mqp 16

好吧,我推荐的解决方案是告诉你的同事使用这个属性,而不是现场.但你可以在某种程度上像这样傻逼它:

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

    public ClassB B
    {
        get
        {
            return _b.Value;
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

现在搞砸了很难.

  • 可能想提一下LazyThreadSafetyMode. (2认同)

Tim*_*oyd 6

您可以考虑将延迟属性推送到基类中,以避免直接访问支持变量.我知道并不理想.我一直认为这是C#中缺乏的东西,即直接支持懒惰属性.