Страницы

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

суббота, 21 декабря 2019 г.

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

#c_sharp #clr #static


Известно, что статика не привязана к объекту (экземпляру), а хранится в типе объекта
(!), и соответственна эта статика (в виде полей/методов и т.д.), будет существовать
в едином экземпляре для всех созданных объектов типа.  

Другими словами, все созданные объекты !статического класса будут ссылаться на единственную
версию этих статических методов/полей.    

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

Стоит ли избегать статические коллекции/массивы, которые работают с большим кол-вом
данных (или же стоит, но нужно будет их "чистить вручную")?

Что является дурным тонном по использованию статики?

Или же можно использовать статику в таком же количестве, как и экземплярные варианты?
    


Ответы

Ответ 1



Я думаю, что стоит руководствоваться не «физическими» особенностями хранения, а семантикой, смыслом ваших данных. Если у вас какой-либо метод или данные относится ко всем экземплярам класса, то этот метод/данные следует объявлять статическими. Если же у вас, например, экземпляр существует в единственном числе в системе, то следует объявлять его синглтоном. Это должно быть главным соображением, влияющим на то, как именно вы объявляете ваши данные. Если в вашей программе по её смыслу данные являются статическими, объявляйте их статическими. Если они по своей сути являются экземпляром, объявляйте их данными экземпляра. Пример: цвет автомашины, выпускаемой концерном Генри Форда — чёрный. Значит, это статические данные: 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()); }

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

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