Статическое поле в классе - повторяется ли оно для каждого вызова статического метода? - PullRequest
2 голосов
/ 22 апреля 2010

Если у меня есть статический класс со статическим полем, таким как:

private static myField = new myObject();

У меня есть несколько статических методов, которые используют myField.

Восстанавливается ли myField для каждого вызова метода? Я предполагаю, что он создается при первом вызове метода, который использует его, и остается в памяти, пока GC не очистит его?

Приветствия к любым указателям: -)

Ответы [ 5 ]

7 голосов
/ 22 апреля 2010

Нет, он назначается на один раз, когда к классу обращаются впервые. GC не освободит память для этого экземпляра во время работы приложения - память будет освобождена при выгрузке домена приложения.

1 голос
/ 22 апреля 2010

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

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

1 голос
/ 22 апреля 2010

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

1 голос
/ 22 апреля 2010

Есть статья Джона Скита об инициализации и флаге beforefieldinit.Это объясняет немного об инициализации и цитирует важные части спецификации C #.

0 голосов
/ 24 апреля 2010

Назначается только один раз, во время инициализации класса. Это происходит эффективно в первый раз, когда класс «активно» затрагивается. См. инициализация класса в спецификации JVM для точной информации о том, когда класс будет инициализирован.

Предполагая, что класс, в котором находится этот код, называется MyClass, myField будет GCed вскоре после загрузчика классов, который загрузил MyClass, GCed. (классы выгружаются с гранулярностью загрузчика классов во всех основных JVM).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...