Disposable.cs
61 lines
| 2.4 KiB
| text/x-csharp
|
CSharpLexer
/ Implab / Disposable.cs
|
|
r48 | using Implab.Diagnostics; | |
| using System; | |||
|
|
r40 | using System.Collections.Generic; | |
| using System.Diagnostics; | |||
| using System.Linq; | |||
| using System.Web; | |||
| namespace Implab { | |||
|
|
r48 | /// <summary> | |
| /// Объект, поддерживающий освобождение ресурсов. | |||
| /// </summary> | |||
|
|
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()); | |||
| } | |||
|
|
r48 | /// <summary> | |
| /// Переводит объект в состояние <c>Disposed</c> и вызывает событие <see cref="Disposed"/> | |||
| /// </summary> | |||
| /// <param name="disposing">Признак того, что нужно освободить ресурсы, иначе данный метод | |||
| /// вызван сборщиком мусора и нужно освобождать ТОЛЬКО неуправляемые ресурсы ТОЛЬКО этого | |||
| /// объекта.</param> | |||
| /// <remarks> | |||
| /// Данный метод осуществляет проверку того, что объект уже был освобожден, чтобы не вызывать | |||
| /// событие <see cref="Disposed"/>. Не поддерживает многопоточность. | |||
| /// </remarks> | |||
|
|
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); | |||
| } | |||
|
|
r48 | /// <summary> | |
| /// Записывает сообщение об утечке объекта. | |||
| /// </summary> | |||
|
|
r40 | protected virtual void ReportObjectLeaks() { | |
|
|
r48 | TraceLog.TraceWarning("The object is marked as disposable but isn't disposed properly: {0}", this); | |
|
|
r40 | } | |
| ~Disposable() { | |||
| Dispose(false); | |||
| ReportObjectLeaks(); | |||
| } | |||
| } | |||
| } |
