在派生类中实现IDisposable

时间:2013-10-10 15:30:31

标签: c# .net idisposable

如果我有这样实现IDisposable的接口(来自apress书的例子)

public interface IArchitectRepository : IDisposable
{
    IEnumerable<Architect> GetArchitects();
    Architect GetAchitectDetails(int id);
    void Create(Achitect a);
    void Update(Achitect a);
    void Delete(int id);
    void Save();
}

如何在派生类中实现Dispose方法?

在书中,它保留为NotImplementedException

4 个答案:

答案 0 :(得分:3)

您没有理由以不同于正常情况的方式实现Dispose模式。

请参阅Implementing a Dispose Method

答案 1 :(得分:2)

与大多数意味着实现类义务的接口不同,实现IDisposable的类的唯一义务是将Dispose的调用视为一个实例将要发布的充分通知被遗弃IDisposable赋予的真正义务落在实例所有者身上:如果类型实现IDisposable,则每个实例应该有一个所有者有义务确保其Dispose方法在被放弃之前被调用;所有者可以通过致电Dispose本身,或将所有权转让给新的所有者来履行义务。

请注意,IDisposable实例的所有者并不关心Dispose提供的实例在返回后可以安全放弃的情况。如果在调用Dispose之前可以安全地放弃某个特定对象,则Dispose方法无需执行任何操作。它应该抛出NotImplementedExceptionNotSupportedException,因为它应该无法做它需要做的所有事情(即什么都没有)。

答案 2 :(得分:0)

您应该查看MSDN以获取完整示例:http://msdn.microsoft.com/en-us/library/system.idisposable.aspx

最低要求是:

public class ArchitectRepository : IArchitectRepository
{
    // implement all the IArchitectRepository methods

    public void Dispose()
    {
        // assuming your repository has a connection property
        if (this.Connection != null)
            this.Connection.Close();
        // do the same for all other disposable objects your repository has created.
    }
}

答案 3 :(得分:0)

具体实现可以覆盖如下

        public bool IsDisposed { get; set; }

        public bool IsLockedForDisposing { get; set; }


        /// <summary>
        /// Dispose the Loaded Context
        /// </summary>
        /// 
        protected virtual void Dispose(bool disposing)
        {
            if (!this.disposed)
            {
                if (disposing)
                {
                    // Disposing of managed code
                    context.Dispose();
                    // GC.Collect(context);
                }
                this.disposed = true;
            }
        }

        public void Dispose()
        {
            if (!IsLockedForDisposing)
            {
                IsDisposed = true;
                Dispose(true);
                GC.SuppressFinalize(this);
            }
        }