Будут ли накапливаться объекты класса Repository в памяти при GC.SuppressFinalize или будут уничтожаться?
Есть класс для работы с бд который реализует IDisposable:
class Repository : IDisposable
{
~Repository() => Dispose(true);
private bool _disposed;
protected readonly ApplicationDbContext _context = new ApplicationDbContext();
public void Dispose()
{
Dispose(true);
GC.SuppressFinalize(this); //1. Прошу GC не собирать этот объект
}
protected virtual void Dispose(bool disposing)
{
if(disposing)
{
if (_disposed)
throw new ObjectDisposedException(nameof(_context));
_context.Dispose();
}
_disposed = true;
}
//..ниже какие-то CRUD методы
}
Так же, есть класс, в котором создают каждый раз объект класса Repository
private Timer _timer;
private async void _timer_Elapsed(object sender, ElapsedEventArgs e)
{
await Check();
}
private async Task Check()
{
using(var db = new Repository()) //2 Инициализирую новый объект (а исчез ли старый?)
{
//...
}
}
Будут ли объекты db в методе Check() съедены GC или же будут "висеть" пока программу не закроют? Программа будет работать 24/7.
Ответы (1 шт):
GC.SuppressFinalize(this); //1. Прошу GC не собирать этот объект
Вы не совсем верно понимаете, зачем нужен этот метод. Он не запрещает уничтожать объект во время сборки мусора, он говорит сборщику мусора собирать его сразу, без предварительного вызова файналайзера, который можно определить через ~Repository(). Вызов этого метода можно пропустить, потому что при необходимости освобождение ресурсов будет произведено в Dispose(bool disposing).
Отвечая на вопрос - объект будет собран сборщиком мусора.
Про файналайзеры почитать можно тут (но в целом нужда в них возникает чрезвычайно редко):
https://docs.microsoft.com/ru-ru/dotnet/csharp/programming-guide/classes-and-structs/finalizers
UPD:
~Repository() => Dispose(true);
Тут у вас неправильно реализован паттерн Dispose. Из файналайзера Dispose(bool disposing) должен вызываться с false, чтобы можно было пропустить освобождение управляемых ресурсов (которые уже могли быть к этому времени освобождены сборщиком мусора, ведь порядок сборки мусора не детерминирован, и нет никаких гарантий, что освобождаемые управляемые ресурсы еще существуют).