2013-08-09 3 views
2

Я выбираю между двумя реализациями для поиска строк (только для чтения).public static readonly field vs getter для списка поиска

С поглотителем:

public static List<string> MyList { get { return myList; } } 
private static readonly List<string> myList = new List<string> 
{ 
    "Item 1", "Item 2", "Item 3" 
}; 

Или просто:

public static readonly List<string> MyList = new List<string> 
{ 
    "Item 1", "Item 2", "Item 3" 
}; 

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

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

Спасибо!

ответ

4

Лично я бы рекомендовал использовать свойства только потому, что они более гибкие. Например, вы можете реализовать ленивую загрузку своей коллекции за свой объект, которую вы не можете сделать с полем.

Однако, есть много большая проблема с вашим кодом. Только поля для чтения и свойства только для чтения гарантируют, что ссылка MyList не может быть переназначена в другой список. Но важно понимать, что ни один из этих вариантов фактически не делает этот список только для чтения.

В обоих случаях ничего не мешает какой-то другой код от вызова:

MyClass.MyList.Clear(); 
MyClass.MyList.Add("Foo"); 

Я бы сильно рекомендовать что-то вроде этого:

public static IList<string> MyList { get { return myList; } } 
private static readonly ReadOnlyCollection<string> myList = 
    new ReadOnlyCollection<string>(new[] 
    { 
     "Item 1", "Item 2", "Item 3" 
    }); 
+1

перестал писать свой ответ, когда это струился :) +1. –

+0

Привет, спасибо за ваш ответ. Возможно, вы имели в виду "myList = new ReadOnlyCollection"? –

+0

@ OJRaqueño К сожалению, у него должен быть параметр типа. См. Мой обновленный ответ. –