Jeer
@Jeer
уверенный пользователь

Как правильно хранить структуру c#?

Добрый денёчек. Вопрос по организации памяти и как это вообще правильней делать. Итак, есть некая структура данных
public struct myStruct
    {
        public myEnum id;
        public string field1;
        public string field2; 
        public List<string> fields3;
     }

Не суть важно, что там за поля и опустил конструктор. Этих структур ограниченное количество и доступ к ним нужен из всего приложения. По сути это некий справочник, который для быстроты мы храним не в БД, а прям в коде. Есть два способа организации, первый, это обернуть доступ к таким структурам в функцию с ветвлением switch

public static myStruct Get(myEnum id)
{
     switch (id)
            {
                case myEnum.First: return new myStruct(. . . );
                case myEnum.Second: return new myStruct(. . . );
                default: return null;
            }
}
//вызываем так
var result = Get(myEnum.first);


И второй вариант, хранить в словаре

public static class pogreb
    {
        public static Dictionary<myEnum, myStruct> spravochnik;

        public static void fillSpravochnik()
        {
            var res =  new Dictionary<myEnum, myStruct>();
            res.Add( myEnum.first, new myStruct(. . .) );
            res.Add( myEnum.second, new myStruct(. . .) );
            spravochnik = res;
        }
    }
//Ну и вызывать, соответственно
if(pogreb.spravochnik == null) pogreb.fillSpravochnik();
var result = pogreb.ContainsKey(myEnum.first) ? pogreb[myEnum.first] : null;


То есть в первом случае мы при каждом вызове создаем структуру и отдаем её результатом, а во втором случае мы создаем структуры один раз и все результаты храним в справочнике. Какой подход использовать? Плюсы и минусы? Правильно ли это и есть ли еще какой-нибудь подход?
  • Вопрос задан
  • 640 просмотров
Решения вопроса 1
@Free_ze
Пишу комментарии в комментарии, а не в ответы
Выглядит как сравнение "хардкод vs контейнер". Разница очевидна: Dictionary обеспечивает поиск со сложностью O(1) (против O(n) у свича) и способен динамически расширяться.
В контексте задачи это похоже на DI для бедных. В этом случае Dictionary будет нагляднее.

ИМХО по коду

Не лишним было бы почитать стайлгайд для C#
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
@Maa-Kut
Поскольку речь идет именно о структурах, второй вариант не имеет смысла, т.к. из словаря все равно будут возвращаться копии сохраненных в словаре структур: в C# структуры - это value type.

Ну и на будущее: если уж идти вторым путем, то надо активнее использовать инкапсуляцию. Т.е. инициализацию поля spravochnik и получение значения из него надо выполнять непосредственно в классе pogreb. Наружу класс должен выставить не публичное поле (публичные поля - почти всегда зло), а метод или свойство, которые будут проверять/инициализировать sparovochnik и искать в нем значение.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы