Disposable.cs
61 lines
| 2.4 KiB
| text/x-csharp
|
CSharpLexer
/ Implab / Disposable.cs
cin
|
r48 | using Implab.Diagnostics; | |
using System; | |||
cin
|
r40 | using System.Collections.Generic; | |
using System.Diagnostics; | |||
using System.Linq; | |||
using System.Web; | |||
namespace Implab { | |||
cin
|
r48 | /// <summary> | |
/// Объект, поддерживающий освобождение ресурсов. | |||
/// </summary> | |||
cin
|
r40 | public class Disposable : IDisposable { | |
bool m_disposed; | |||
public event EventHandler Disposed; | |||
public bool IsDisposed { | |||
get { return m_disposed; } | |||
} | |||
protected void AssertNotDisposed() { | |||
if (m_disposed) | |||
throw new ObjectDisposedException(this.ToString()); | |||
} | |||
cin
|
r48 | /// <summary> | |
/// Переводит объект в состояние <c>Disposed</c> и вызывает событие <see cref="Disposed"/> | |||
/// </summary> | |||
/// <param name="disposing">Признак того, что нужно освободить ресурсы, иначе данный метод | |||
/// вызван сборщиком мусора и нужно освобождать ТОЛЬКО неуправляемые ресурсы ТОЛЬКО этого | |||
/// объекта.</param> | |||
/// <remarks> | |||
/// Данный метод осуществляет проверку того, что объект уже был освобожден, чтобы не вызывать | |||
/// событие <see cref="Disposed"/>. Не поддерживает многопоточность. | |||
/// </remarks> | |||
cin
|
r40 | protected virtual void Dispose(bool disposing) { | |
if (disposing && !m_disposed) { | |||
m_disposed = true; | |||
EventHandler temp = Disposed; | |||
if (temp != null) | |||
temp(this,EventArgs.Empty); | |||
} | |||
} | |||
public void Dispose() { | |||
Dispose(true); | |||
GC.SuppressFinalize(this); | |||
} | |||
cin
|
r48 | /// <summary> | |
/// Записывает сообщение об утечке объекта. | |||
/// </summary> | |||
cin
|
r40 | protected virtual void ReportObjectLeaks() { | |
cin
|
r48 | TraceLog.TraceWarning("The object is marked as disposable but isn't disposed properly: {0}", this); | |
cin
|
r40 | } | |
~Disposable() { | |||
Dispose(false); | |||
ReportObjectLeaks(); | |||
} | |||
} | |||
} |