2

このようにIDisposableを実装するインターフェース(プレスブックの例)がある場合

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

4 に答える 4

4

Dispose パターンを通常とは異なる方法で実装する理由はありません。

Dispose メソッドの実装を参照してください。

于 2013-10-10T15:32:22.223 に答える
2

実装クラス側の義務を暗示するほとんどのインターフェースとは異なり、実装するクラスの唯一の義務は、インスタンスが放棄されるという適切な通知としてIDisposableの呼び出しを考慮することです。Disposeによって付与される実際の義務IDisposableは、インスタンスの所有者にかかっています。型が を実装IDisposableしている場合、各インスタンスには、そのDisposeメソッドが放棄される前に確実に呼び出されるようにする義務がある 1 人の所有者が必要です。所有者は、自分自身を呼び出すかDispose、義務を引き受ける新しい所有者に所有権を渡すことによって、これを行うことができます。

インスタンスの所有者は、インスタンスが返された後に安全に破棄される場合は、IDisposable何をしてもかまわないことに注意してください。Dispose特定のオブジェクトがDispose呼び出される前に安全に破棄できる場合、Disposeメソッドで何もする必要はありません。orをスローすべきではありません。これは、実行する必要があるすべてのことを実行できない (つまり、何も実行できない) べきではないためです。NotImplementedExceptionNotSupportedException

于 2013-10-10T18:46:50.717 に答える
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.
    }
}
于 2013-10-10T15:33:55.907 に答える
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);
            }
        }
于 2013-10-10T15:35:53.607 に答える