Статические методы отличаются от методов экземпляра тем, что нет экземпляра класса, к которому они принадлежат, должен быть создан для их вызова. Когда вы вызываете статический метод, вы фактически делаете вызов, используя имя типа , а не экземпляр типа - что должно укрепить идею о том, что статические методы не вызываются в экземплярах. Это повторяет и подчеркивает : Не требуется экземпляр класса для вызова открытого статического метода этого класса.
Теперь ваш пример некорректен, но, предположительно, строка: if( Foo.SomeCheck() )
вызывает статический метод SomeCheck
, используя имя типа: Foo
- не экземпляр. Однако для выполнения этого вызова необходимо создать экземпляр класса - , однако в вашем примере у вас нет правильно сформированного экземпляра Bar
. Как правило, код должен существовать внутри метода (или инициализатора элемента), которого у вас здесь нет.
Чтобы ответить на другие части вашего вопроса. Предполагая, что рассматриваемый код является частью метода экземпляра, что-то должно создать экземпляр Bar
- и вызвать этот метод. Это что-то должно было бы создать или иным образом получить экземпляр Bar
. Ссылочные типы всегда будут создаваться в куче, но здесь это в значительной степени не имеет значения.
Что касается сбора мусора, вам обычно не стоит об этом беспокоиться. Среда выполнения .NET обеспечивает очистку экземпляров, на которые нет ссылок ни от одного корневого объекта в вашей программе. Корни обычно представляют собой экземпляры, которые находятся где-то в стеке вызовов или на которые ссылаются статические члены того или иного типа. Поскольку мы не видим здесь никакого кода, который создает или ссылается на Bar
, невозможно сказать , когда будет собрано. Например, если Bar
является синглтоном и хранится где-то в статической переменной, он может существовать очень долго - возможно, весь срок жизни программы. Вы не можете знать, не видя всех кода, который манипулирует и управляет Bar
.