2

Component から派生するクラスを作成しました。

public class MyComponent: System.ComponentModel.Component
{


}

Visual Studio が次のコードを挿入しているのを見ました。

protected override void Dispose(bool disposing)
{
    try
    {
        if (disposing && (components != null))
        {
            components.Dispose();
        }
    }
    catch
    {
        throw;
    }
    finally
    {
        base.Dispose(disposing);
    }
}

MyComponentのメンバーがありDataSet、おそらく を実装する他のメンバーがいくつかありますIDisposableDispose()適切にクリーンアップされるようにするには、メソッドで何を変更する必要がありますか? 助けてくれてありがとう。

4

4 に答える 4

2

変化する:

if (disposing && (components != null))
{
     components.Dispose();
}

することが:

if (disposing && (components != null))
{
    _dataset.Dispose();
    components.Dispose();
}
于 2008-10-30T15:13:32.787 に答える
0

私はこのクラスを思いつきました:

public class DisposableComponentWrapper : IComponent
{
    private IDisposable disposable;

    public DisposableComponentWrapper(IDisposable disposable)
    {
        this.disposable = disposable;
    }

    public DisposableComponentWrapper(IDisposable disposable, ISite site)
        : this(disposable)
    {
        Site = site;
    }

    public void Dispose()
    {
        if (disposable != null)
        {
            disposable.Dispose();
        }
        if (Disposed != null)
        {
            Disposed(this, EventArgs.Empty);
        }
    }

    public ISite Site { get; set; }

    public event EventHandler Disposed;
}

IContainer への拡張メソッド:

public static void Add(this IContainer container, IDisposable disposableComponent)
{
    var component = (disposableComponent as IComponent);
    if(component == null)
    {
        component = new DisposableComponentWrapper(disposableComponent);
    }
    container.Add(component);
}

これは、使い捨てのリソースを自分のフォームに参加させたい人に役立つかもしれません.

注: IComponent.Disposed の動作については確信が持てません。MSDNでは、このインターフェイスの実装でどのように呼び出す必要があるかについてはあまり言及されていません。ドキュメントは、クライアント コードがイベントに登録する必要がある場合よりも多くのことを話しているように聞こえます。このインターフェースの実装によってトリガーされます。

于 2012-02-07T00:45:18.527 に答える
0

破棄可能なメンバー オブジェクトを確認し、null でない場合は破棄します。

于 2008-10-30T15:15:13.267 に答える
-1

componentsコンポーネントで使い捨てをラップし、コレクションに追加します。破棄パターンの生成された実装は、それらを正しく破棄します。

public partial class MyComponent : System.ComponentModel.Component
{
    private readonly System.Data.DataSet _dataSet;

    public MyComponent(System.Data.DataSet dataSet)
    {
        _dataSet = dataSet ?? throw new System.ArgumentNullException(nameof(dataSet));
        components.Add(new DisposableWrapperComponent(dataSet));
    }
}

は次のDisposableWrapperComponentように定義されます。

using System;
using System.ComponentModel;

public class DisposableWrapperComponent : Component
{
    private bool disposed;

    public IDisposable Disposable { get; }

    public DisposableWrapperComponent(IDisposable disposable)
    {
        Disposable = disposable ?? throw new ArgumentNullException(nameof(disposable));
    }

    protected override void Dispose(bool disposing)
    {
        if (disposed) return;

        if (disposing)
        {
            Disposable.Dispose();
        }

        base.Dispose(disposing);

        disposed = true;
    }
}

@smoothdeveloperの回答に触発されました。

データ セットをリセットできるようにする必要がある場合は、有効期間管理をプロパティにカプセル化すると非常にうまく機能します。

using System;
using System.ComponentModel;
using System.Data;

public partial class MyComponent : Component
{
    private const string DataSetComponentName = "dataSet";

    public DataSet DataSet
    {
        get => (DataSet)((DisposableWrapperComponent)components.Components[DataSetComponentName])
                ?.Disposable;
        set
        {
            var lastWrapper = (DisposableWrapperComponent)components.Components[DataSetComponentName];
            if (lastWrapper != null)
            {
                components.Remove(lastWrapper);
                lastWrapper.Dispose();
            }

            if (value != null)
            {
                components.Add(new DisposableWrapperComponent(value), DataSetComponentName);
            }
        }
    }

    public MyComponent(DataSet dataSet)
    {
        DataSet = dataSet ?? throw new ArgumentNullException(nameof(dataSet));
    }
}

で使い捨てオブジェクトを作成し、OnStartで破棄する Windows サービスを実装するときに、これを使用しましたOnStop

于 2019-12-17T21:19:29.120 に答える