Мне нужно написать класс, где я хочу, чтобы потребитель мог утилизировать код, обернув код оператором using(...)
в C#.Зачем мне нужно создать свойство, чтобы проверить, был ли ресурс удален при использовании одноразовой пясти в C#?
Для этого я должен реализовать интерфейс Microsoft IDisposable
.
на основе Microsoft approach on implementing it, я должен сделать что-то вроде этого
общий интерфейс, который так
public interface ISomeClass : IDisposable
{
// ... some methods to include
}
public class SomeClass : ISomeClass
{
private readonly TimeTrackerContext _context;
private bool disposed = false;
protected virtual void Dispose(bool disposing)
{
if (!this.disposed && disposing && _context != null)
{
_context.Dispose();
}
this.disposed = true;
}
public void Dispose()
{
Dispose(true);
GC.SuppressFinalize(this);
}
}
Я пытаюсь научиться C# правильный путь, так что я есть вопрос относительно этой реализации.
Вопрос
Почему мне действительно нужно иметь свойство, сказать мне, если объект был расположен или нет, прежде чем утилизировать его?
Другими словами, не могу ли я просто проверить, является ли значение _context
нулевым, прежде чем удалять его? Что-то вроде этого
public class SomeClass : ISomeClass
{
private readonly TimeTrackerContext _context;
private void SelfDisposing()
{
if (_context != null)
{
_context.Dispose();
}
}
public void Dispose()
{
SelfDisposing();
GC.SuppressFinalize(this);
}
private void SelfDisposing(bool disposing)
{
if (_context != null && !this.disposed && disposing)
{
_context.Dispose();
}
this.disposed = true;
}
}
Вы можете, но вы не устанавливаете контекст в null после его удаления, поэтому, когда он будет пустым, тогда? – Evk
не будет делать это, поскольку весь объект больше не находится в памяти? –
no, Dispose делает то, что вы говорите. Вы не устанавливаете контекст в значение null, поэтому оно не будет равно null. – Evk