Страницы

Поиск по вопросам

суббота, 30 ноября 2019 г.

Время жизни объекта

#net #c_sharp


В некотором блоке создан анонимный объект и объект в "слабой ссылке":
//first object System.Random
string result=new Random().Next(0,1)==1 ?
  "equal 1":"sory, but not equal 1";

//second object System.Random 
string result=((Random)new WeakReference(new Random()).Target).Next(0,1)==1 ?
  "equal 1":"sory, but not equal 1";

GC.Collect();

Вопрос: Какой из помеченных комментариями объектов имеет большие шансы остаться в
живых после сборки мусора что вызванна явно в конце примера? Заранее спасибо.    


Ответы

Ответ 1



Хороший вопрос, но точного ответа на него, к сожалению, не существует. В стандарте языка нет четкого определения механизма работы GC.Collect() и семантики очистки объектов, обернутых слабыми ссылками. Т.е, если говорить кратко, то ответ - implementation specific, т.к, скажем, под некоторой сферической реализацией C# Runtime вызов GC.Collect() может вообще ничего не делать и это будет соответствовать стандарту. Если рассуждать чуть ближе к практике, то в этой ситуации оба из объектов Random будут помечены как возможные для удаления. Первый - по очевидным причинам, второй - т.к WeakReference будет указывать на объект, более не доступный ни по одному из codepath (да и сам объект WeakReference также оказывается недоступным после выхода из соответствующего блока). А вот что происходит дальше, уже implementation specific, т.к совершенно неизвестно, что GC будет делать с объектами, возможными для удаления. Он может отложить их на следующий вызов сборщика, может поместить в какую-либо свою дополнительную внутреннюю очередь и т.п. Возможен, разумеется, очевидный вариант, когда оба объекта просто будут удалены. Ситуация также осложняется тем, что оптимизатор может решить, что выгоднее аллокировать переменные Random на стеке, нежели в хипе. Что, естественно, делает вопрос о сборке мусора неактуальным.

Комментариев нет:

Отправить комментарий