В этом нет особого смысла, но бывают моменты, когда это имеет смысл.
Один из примеров - метод Dispose()
. Рассмотрим этот тип:
public class Owner
{
// snip
private BigAllocation _bigAllocation;
// snip
protected virtual void Dispose(bool disposing)
{
if (disposing)
{
// free managed resources
if (_bigAllocation != null)
{
_bigAllocation.Dispose();
_bigAllocation = null;
}
}
}
}
Теперь вы можете утверждать, что в этом нет необходимости, и вы были бы в основном правы. Обычно Dispose()
вызывается только до разыменования Owner
, и когда будет собран Owner
, _bigAllocation
также будет ... в конце концов.
Тем не менее:
Если для _bigAllocation
указано значение NULL, он будет сразу же доступен для сбора , если на него никто не ссылается. Это может быть полезным, если Owner
относится к генерации GC с более высоким номером или имеет финализатор. В противном случае, Owner
должен быть выпущен до того, как _bigAllocation
будет иметь право на сбор.
Хотя это своего рода угловой случай. У большинства типов не должно быть финализаторов, и в большинстве случаев _bigAllocation
и Owner
будут в одном поколении.