#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 Lazylazy = new Lazy (() => new OurCompanyCar()); }
Комментариев нет:
Отправить комментарий