使用不同需要的属性优化对象

时间:2011-12-21 10:37:43

标签: c# winforms properties lazy-loading

我的应用程序操纵包含许多属性的对象,其中一些属性较轻而其他属性较重(需要计算,数据库查询)。 在某些情况下,我需要访问所有属性,在其他上下文中(例如gridviews,或者当对象用作另一个对象的成员时),我只需要访问一些属性。

我已经尽可能晚地延迟加载沉重的成员,但我不知道如何避免“携带”我不需要的属性。

我被告知要为每个类创建一个额外的“轻量级”版本以响应此问题,但我的应用程序包含50多个类,因此需要花费大量时间。此外,拥有同一类的多个版本也会产生其他问题。

哪种解决方案更优化?创建多个类版本是否有意义? 如果不需要的属性保持为空,该怎么办?具有null(未分配)属性的对象是否比没有这些属性的对象重?

非常感谢你的回答!

2 个答案:

答案 0 :(得分:1)

我不确定它会帮助您专门解决您的问题,但.NET 4.0引入了Lazy类,它是一个用于延迟初始化重/大对象实例的包装类。它提供了一个.Value属性,当第一次访问时(并且只是第一次)初始化包装的对象实例。如果永远不会访问.Value,则永远不会初始化被包装的对象实例。但听起来你自己已经这样做了,很可能是你的属性Get / Set定义。

对于哪个对象更重,一个没有属性的轻量级类或带有NULL变量的原始类:如果问题中的属性是引用类型,那么唯一的浪费是指向引用类型的指针x86每个属性4个字节,x64每个属性8个字节。 .NET中空类实例的默认最小大小似乎约为24个字节。

例如:

public class MyClassLight
{
    public int PropertyInt { get; set; } // 4 byte value type
    public OtherClass1 PropertyOtherClass1 { get; set; } // 4 or 8 byte reference type
}

public class MyClassHeavy
{
    public int PropertyInt { get; set; } // 4 byte value type
    public string PropertyString { get; set; } // 4 or 8 byte reference type
    public OtherClass1 PropertyOtherClass1 { get; set; } // 4 or 8 byte reference type
    public OtherClass2 PropertyOtherClass2 { get; set; } // 4 or 8 byte reference type
}

假设您在x86上运行,MyClassLight的实例将花费24字节开销+ 4字节+4字节= 32字节内存。

MyClassHeavy将是24字节开销+ 4字节+4字节+4字节+4字节= 40字节内存。

即使您的繁重类具有50个属性作为引用类型,将它们保持为NULL也只会在每个实例中产生额外的200字节内存(因为该类仍需要为指针保留内存,这可能会在某些情况下使用点)。如果内存中有数十万或数百万个这样的对象,则每个对象可能需要200个字节,但如果不是,那么它似乎可以忽略不计。

增加50个类的2个版本的复杂性似乎并不值得。但是如果你必须走这条路线,我会重构它来创建一个接口,它只包含两个类(轻和重)共享的属性,然后重构代码以尽可能多地使用接口而不是具体类,这样它就兼容了轻重班。

答案 1 :(得分:0)

可能你可以创建counstructor来初始化光属性。并且对重属性进行延迟初始化(仅在访问时初始化)。然后你可以有一个轻量级的物体,它将具有所有的属性,但没有初始化。