0

我的班级有复杂的财产:

    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;})。它是否支持自动存储复杂的属性?

4

3 回答 3

5

有许多基于状态的问题,因此没有用于延迟加载的语言级别机制。

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

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

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

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

get 
{
    return image ?? (image = LoadImage());
}
于 2012-07-16T22:21:49.917 回答
0

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

于 2012-07-16T22:18:09.770 回答
0

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

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

public Image LogoImage
{
    get  {  return _m_LogoImage; }
}
于 2012-07-16T22:24:37.240 回答