Luffy1
@Luffy1
Student, Junior .NET programmer, C#, JS, HTML/CSS

Зачем нужны статические(ударение на слово "статические") поля/автоматические статические свойства в классе?

Доброго времени суток! До меня только сейчас дошло, что я знаю, что такое статические поля, какая разница между статическими и динамическими полями, но я не понимаю зачем нужны именно статические. Зачем они нужны? Чтобы, если мы хотим, например, значение поля типа int поменять с 5 на 9 во всех классах? Или чтобы, если мы, например, хотим, чтобы если в одном классе менялось значение, то и во всех остальных, типа не нужно писать много кода и обрабатывать каждый класс? В этом смысле они удобны?
  • Вопрос задан
  • 813 просмотров
Решения вопроса 4
@majstar_Zubr
C++, C#, gamedev
Статическая область памяти инициализируется до начала исполнения точки входа main.

Статический класс гарантирует существование единственного экземпляра класса.

Статическое поле позволяет реализовать хранение данных, которые будут существовать вплоть до выхода из функции main.

Статический конструктор позволяет произвести предварительную инициализацию для класса ещё до создания хотя бы одного экземпляра класса.

Статические данные, таким образом, можно считать достоянием главного потока, исходного процесса.

В общем случае, всё статическое используется для инициализации, которая должна произойти раньше рантайма. Но это справедливо только для области каждого класса / иерархии классов, а не всего набора классов в исходном коде, потому что управлять порядком отработки статических конструкторов - моветон.

Если использование кода не предполагает использование класса в нескольких потоках, то допускается использование "общих" данных в статических полях, но как правило, это рационально только для readonly и const.
Ответ написан
Комментировать
yarosroman
@yarosroman Куратор тега C#
C# the best
Одна из реализаций паттерна синглтон, на статическом поле класса строится. Ну и как выше, всякие счётчики, какой нибудь класс обработчик, общий на все классы, да куча разных кейсов.
Ответ написан
Комментировать
Griboks
@Griboks Куратор тега C#
Статические члены относятся к типу класса, а не его экземпляру. Это на один уровень выше в иерархии типов.

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

Например, мы хотим иметь несколько разных методов вычисления площади класса "гиперсфера" в зависимости от размерности пространства. Классический подход: передавать размерность в конструктор, а в методе GetSquare() каждый раз у каждого объекта проверять размерность и использовать соответствующую формулу. Однако, было бы проще задать размерность сразу для типа "гиперсфера", т. е статически. Тогда и в конструкторе меньше параметров, и каждый раз проверять не требуется, и лишняя память не тратится, и меньше кода писать, и новые объекты сразу создаются с нужной формулой. Иными словами, паттерн "фабрика".
Ответ написан
Комментировать
mindtester
@mindtester Куратор тега C#
http://iczin.su/hexagram_48
в дополнение - только в статических классах можно реализовать расширения
типа такого
private static void print(this object o) => Console.WriteLine(o.ToString());
пример использования тут https://dotnetfiddle.net/dbc0kh

ps кстати, все LINQ построено на расширениях
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

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

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