Страницы

Поиск по вопросам

понедельник, 12 ноября 2018 г.

Семантика работы/хранения статики в CLR

Известно, что статика не привязана к объекту (экземпляру), а хранится в типе объекта (!), и соответственна эта статика (в виде полей/методов и т.д.), будет существовать в едином экземпляре для всех созданных объектов типа.
Другими словами, все созданные объекты !статического класса будут ссылаться на единственную версию этих статических методов/полей.
На фоне этого, возникает вопрос, а как лучше всего использовать статику, ведь объекты с модификатором static не подлежат сборке мусора, т.к. хранятся в типе объекта (который в свою очередь связан с доменом приложения, и будет существовать до конца жизненного цикла приложения).
Стоит ли избегать статические коллекции/массивы, которые работают с большим кол-вом данных (или же стоит, но нужно будет их "чистить вручную")?
Что является дурным тонном по использованию статики?
Или же можно использовать статику в таком же количестве, как и экземплярные варианты?


Ответ

Я думаю, что стоит руководствоваться не «физическими» особенностями хранения, а семантикой, смыслом ваших данных.
Если у вас какой-либо метод или данные относится ко всем экземплярам класса, то этот метод/данные следует объявлять статическими. Если же у вас, например, экземпляр существует в единственном числе в системе, то следует объявлять его синглтоном.
Это должно быть главным соображением, влияющим на то, как именно вы объявляете ваши данные. Если в вашей программе по её смыслу данные являются статическими, объявляйте их статическими. Если они по своей сути являются экземпляром, объявляйте их данными экземпляра.
Пример: цвет автомашины, выпускаемой концерном Генри Форда — чёрный. Значит, это статические данные:
class FordCar { public static readonly Color = Colors.Black; }
В моей компании есть на текущий момент только одна машина. Но это всё равно конкретный экземпляр. Значит, это синглтон
class OurCompanyCar { private OurCompanyCar() { } public static OurCompanyCar() Instance { get { return lazy.Value; } }
private static readonly Lazy lazy = new Lazy(() => new OurCompanyCar()); }

Комментариев нет:

Отправить комментарий