Ключевое слово static. Статические члены класса и статические классы

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

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

Для того чтобы воспользоваться членом типа static за пределами класса, достаточно указать имя этого класса с оператором-точкой. Но создавать объект для этого не нужно. В действительности член типа static оказывается доступным не по ссылке на объект, а по имени своего класса.

Переменные, объявляемые как static, по существу, являются глобальными. Когда же объекты объявляются в своем классе, то копия переменной типа static не создается. Вместо этого все экземпляры класса совместно пользуются одной и той же переменной типа static. Такая переменная инициализируется перед ее применением в классе.

На применение методов типа static накладывается ряд следующих ограничений:

• В методе типа static должна отсутствовать ссылка this, поскольку такой метод не выполняется относительно какого-либо объекта

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

• Аналогичные ограничения накладываются на данные типа static. Для метода типа static непосредственно доступными оказываются только другие данные типа static, определенные в его классе. Он, в частности, не может оперировать переменной экземпляра своего класса, поскольку у него отсутствуют объекты, которыми он мог бы оперировать

Класс можно объявлять как static. Статический класс обладает двумя основными свойствами. Во-первых, объекты статического класса создавать нельзя. И во-вторых, статический класс должен содержать только статические члены. Статический класс создается по приведенной ниже форме объявления класса, видоизмененной с помощью ключевого слова static.



static class имя класса { // ...

Статические классы применяются главным образом в двух случаях. Во-первых, статический класс требуется при создании метода расширения. Методы расширения связаны в основном с языком LINQ. И во-вторых, статический класс служит для хранения совокупности связанных друг с другом статических методов.

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

Конструктор можно также объявить как static. Статический конструктор, как правило, используется для инициализации компонентов, применяемых ко всему классу, а не к отдельному экземпляру объекта этого класса. Поэтому члены класса инициализируются статическим конструктором до создания каких-либо объектов этого класса.

30. Сборщик мусора в C#

Сборка мусора снимает с разработчика огромное количество работы и проблем. Фактически, от разработчика требуется только выделить для объекта место в управляемой куче, а о том, когда и как он будет удалён, позаботится сборщик мусора.
При инициализации объекта, ему будет выделена необходимая для него память, ключевое слово newдобавляет объект в управляемую кучу и возвращает ссылку на сам объект. Объект будет сам удалён тогда, когда он будет уже не нужен.

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

  • Ссылки на глобальные объекты
  • Ссылки на статические объекты либо поля;
  • Ссылки на локальные переменные;
  • Ссылки на объектные параметры, передаваемые методу;
  • Регистр центрального процессора, который ссылается на объект;

Во время сборки мусора исполняющая среда будет исследовать объекты в управляемой куче, чтобы определить, являются ли они, по-прежнему, корневыми для приложения. Для этого CLR будет строить граф объектов, который представляет каждый достижимый объект в куче.
Пример :
Ключевое слово static. Статические члены класса и статические классы - student2.ru
В данном примере недоступными оказались объекты C, F, I. Данные объекты будут удалены из памяти, оставшееся пространство в куче сжимается, указатель на следующий элемент настраивается таким образом, чтобы указывать на следующий доступный участок памяти. Конечный результат будет следующим:
Ключевое слово static. Статические члены класса и статические классы - student2.ru
К большим объектам(более 85000 байт) не применяется сжатие.
Для оптимизации данного процесса был придуман механизм «поколений».
Каждый объект в куче соответствует одному из 3 поколений.



  • Поколение 0: Новый размещенный в куче объект, который еще никогда не помечался как подлежащий сборке мусора.
  • Поколение 1: Объект, который уже пережил один процесс сборки мусора.
  • Поколение 2: Объект, который пережил более одного процесса сборки мусора.

Идея «поколений»: чем дольше объект находится в куче, тем выше вероятность того, что он в ней и останется.
Вначале сборщик мусора анализирует все объекты поколения 0, если после удаления всех ненужных объектов остаётся достаточное количество памяти, то все оставшиеся элементы повышаются до поколения 1. Если все объекты поколения 0 проверены, но по-прежнему требуется память, то начинается проверка на достижимость и удаление объектов из поколения 1, уцелевшие объекты поколения 1 повышаются до поколения 2. Если же сборщику мусора по-прежнему требуется память, то проверку на достижимость и удаление начинают проходить объекты поколения 2. Объекты поколения 2, которым удалось пережить сборку мусора, по-прежнему остаются объектами поколения 2, так как это старшее поколение.
Когда же запускается процесс сборки мусора:

  • Заполнено поколение 0;
  • Вызов из кода GC.Collect;
  • Операционная система сообщает, что недостаточно памяти;

Существует возможность программного управления сборщиком мусора. Для этого существует тип System.GC
Чтобы заставить уборщика мусора провести уборку, достаточно вызвать метода Collect, доступный в классе GC. При вызове также можно указать номер поколения, в котором необходимо произвести уборку мусора.
Желательно избегать вызовов любых методов Collect. Лучше не вмешиваться в работу сборщика мусора пока без этого можно обойтись.

Наши рекомендации