已经实例化了检查延迟加载的属性

时间:2010-05-14 09:23:46

标签: c# lazy-loading

在具有延迟加载属性的类中,例如:

private Collection<int> someInts;

public Collection<int> SomeInts
{
    get
    {
        if (this.someInts == null) this.someInts = new Collection<int>();
        return this.someInts;
    }
}

是否值得拥有如下财产:

public bool SomeIntsExist
{
    get { return (this.someInts != null && this.someInts.Count > 0); }
}

然后使用该属性..例如:

if (thatClass.SomeIntsExist)
{
    // do something with thatClass.SomeInts collection
}

或者这是不成熟的优化。它肯定更容易使用下面的东西滚动,但它将不必要地实例化该集合:

if (thatClass.SomeInts.Count > 0)
{
    // do something with thatClass.SomeInts collection
}

编译器是否足够智能来计算这样的事情?还有更好的方法吗?

4 个答案:

答案 0 :(得分:3)

即使是懒惰的属性初始化听起来像是过早优化。只有极少数情况我可以想到延迟创建空集合有助于解决问题(假设您的示例不过分简化)。

但是当你不得不延迟集合初始化时,你也可能(甚至不得不)优化Exists方法,因为延迟初始化是一个关键要求。

答案 1 :(得分:2)

如果你正在处理昂贵的数据检索,我认为值得拥有这样的属性,例如数据库查询。

但是,您的代码存在缺陷。如果事先已经访问过属性,SomeIntsExist只会真正给你正确的答案,如果属性是延迟加载的,那么可能确实有整数,但它们还没有被加载。它应该重命名为IsInitialised。我知道这是一个例子,但它可能仍然值得指出:)

答案 2 :(得分:1)

编译器不会自动计算出类似的东西。 这意味着,在最后一种情况下

if (thatClass.SomeInts.Count > 0) 
{ 
    // do something with thatClass.SomeInts collection 
} 

该集合将被实例化。

所以在我看来,它取决于初始化集合的成本是多少 - 在简单的情况下,它并不是真的很贵,但浪费的内存可能会总结......

答案 3 :(得分:0)

如果延迟加载的类是一个很大的并且初始化需要一些时间......这样的布尔值会很快。

bin如果是一个简单的.net集合,它在我看来并不存在。