.NET延迟加载/预先计算的属性

时间:2012-07-16 22:12:38

标签: c# .net properties

我班的课程很复杂:

    private Image m_LogoImage=null;

    public Image LogoImage
    {
        get
        {
            if (m_LogoImage == null && File.Exists(Data.LogoFileUrl))
            {
                DrawingImage image = DrawingImage.FromFile(Data.LogoFileUrl);
                m_LogoImage = Image.GetInstance(image, new Color(1, 1, 1));
            }
            return m_LogoImage;
        }
    }

LogoImage.get是客户端第一次调用它时非常慢且耗费资源的操作,该属性计算图像并将结果存储在私有变量m_LogoImage中。
这对我来说非常基本。 .NET支持自动属性(public string P {get;set;})。它是否支持自动存储复杂的属性?

3 个答案:

答案 0 :(得分:5)

存在许多基于状态的问题,因此懒惰负载没有语言级别的机制。

但是,您可以使用Lazy<T>类来完成此功能。

 private Lazy<Image> logo = new Lazy(() => LoadImage()); 

 public Image LogoImage
    {
        get
        {
            return logo.Value;
        }
    }

您还可以使用空合并运算符(??)为可空类型执行延迟加载。

get 
{
    return image ?? (image = LoadImage());
}

答案 1 :(得分:0)

不 - 它不支持“自动存储复杂属性” - 从那时起它意味着它必须支持“自动加载复杂属性” - 这必须是可定制的...然后你' d最终得到C#。

答案 2 :(得分:0)

从它的外观来看:DrawingImage.FromFile(Data.LogoFileUrl);你的数据来自某种静态对象。您当前基于每个类实例的加载方法是在每个新实例上反复加载相同的对象。您可以通过在初始运行时将数据预加载到静态对象来进行优化。 E.g:

private static Image _m_LogoImage = DrawingImage.FromFile(Data.LogoFileUrl);

public Image LogoImage
{
    get  {  return _m_LogoImage; }
}