Проверка лениво загруженных свойств были созданы - PullRequest
4 голосов
/ 14 мая 2010

В классе с ленивым загруженным свойством, например:

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 ]

3 голосов
/ 14 мая 2010

Даже ленивая инициализация свойства звучит как преждевременная оптимизация. Я могу вспомнить лишь несколько случаев, когда отсрочка создания пустой коллекции помогает решить проблему (при условии, что ваш пример не упрощен).

Но когда вам нужно отложить инициализацию коллекции, вам, вероятно, следует (или даже нужно) оптимизировать метод Exists, потому что ленивая инициализация является критическим требованием.

2 голосов
/ 14 мая 2010

Я бы сказал, что стоит иметь такие свойства, если вы имеете дело с дорогостоящим поиском данных, например, запросами к базе данных.

Однако в вашем коде есть недостаток.SomeIntsExist будет действительно давать правильный ответ только в том случае, если свойство было получено заранее, если свойство загружено с отложенной загрузкой, тогда действительно могут быть целые числа, но они просто еще не были загружены.Он должен быть переименован во что-то вроде IsInitialised.Я знаю, что это пример, но, вероятно, все же стоит указать :)

1 голос
/ 14 мая 2010

Компилятор не будет вычислять такие вещи автоматически. Это означает, что в последнем случае

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

коллекция будет создана.

Так что, на мой взгляд, это зависит от того, насколько дорогой является инициализация коллекции - в простом случае это не очень дорого, но потраченная впустую память могла бы подвести итог ...

0 голосов
/ 14 мая 2010

если ленивый загруженный класс большой и инициализация займет некоторое время .... такой логический смысл.

bin в случае простой коллекции .net это не имеет смысла, по моему мнению.

...