2009-02-18 3 views
4

Это может быть глупый вопрос, но существует ли обычная практика для инициализации свойств коллекции для пользователя, поэтому им не нужно создавать новую конкретную коллекцию перед использованием это в классе?Инициализация коллекции, поэтому пользователю не нужно

Являются ли они предпочтительными по сравнению с другими?

Вариант 1:

public class StringHolderNotInitialized 
{ 
    // Force user to assign an object to MyStrings before using 
    public IList<string> MyStrings { get; set; } 
} 

Вариант 2:

public class StringHolderInitializedRightAway 
{ 
    // Initialize a default concrete object at construction 

    private IList<string> myStrings = new List<string>(); 

    public IList<string> MyStrings 
    { 
     get { return myStrings; } 
     set { myStrings = value; } 
    } 
} 

Вариант 3:

public class StringHolderLazyInitialized 
{ 
    private IList<string> myStrings = null; 

    public IList<string> MyStrings 
    { 
     // If user hasn't set a collection, create one now 
     // (forces a null check each time, but doesn't create object if it's never used) 
     get 
     { 
      if (myStrings == null) 
      { 
       myStrings = new List<string>(); 
      } 
      return myStrings; 
     } 
     set 
     { 
      myStrings = value; 
     } 
    } 
} 

Вариант 4:

Любые другие хорошие варианты для этого?

ответ

10

В этом случае я не вижу причины для ленивой загрузки, поэтому я бы пошел с вариантом 2. Если вы создаете тонну этих объектов, тогда количество распределений и GC, которые будут результатом, будет проблема, но это не то, что нужно учитывать, если это не будет проблемой позже.

Кроме того, для таких вещей я обычно не допускал назначение класса IList. Я бы сделал это только для чтения. Не контролируя реализацию IList, вы открываете себя до неожиданных реализаций.

+0

Хорошо, я не думал о возможности неизвестных реализаций IList. –

+0

Кроме того, в рамочной книге упоминается, что вы действительно не должны раскрывать типы IList или List , но вместо этого используйте массив и используйте список внутри. –

+0

В какой каркасной книге вы ссылаетесь? Это звучит как что-то, что я должен прочитать! –

2

Для варианта 1: если вы хотите заставить пользователя инициализировать что-то перед использованием вашего класса, тогда лучшее место, чтобы заставить его находиться в конструкторе.

Для варианта 2: Если вы не заставляете пользователя, вам действительно нужно инициализировать пустую коллекцию самостоятельно в конструкторе/инициализаторе.

Для варианта 3: ленивая инициализация имеет смысл только в том случае, если она требует слишком большой работы или ее медленной/громоздкой операции.

Мой голос идет на вариант 2.

1

Единственная реальная причина для использования отложенной загрузки решения для оптимизации. И первое правило оптимизации - «не оптимизировать, если вы не измерили» :)

Основываясь на этом, я бы пошел с решением, наименее вероятным для возникновения ошибки. В этом случае это будет решение № 2. Установка его в инициализаторе практически исключает возможность null ref здесь. Единственный способ, которым это произойдет, - это если пользователь явно устанавливает его в null.

Смежные вопросы