1

Windows Service VS2013 プロジェクト テンプレートを使用してプロジェクトを作成しているときに、ツール ボックスからEventLogコンポーネントを追加した後、「Component Designer generated code」という名前の#regionが次のコードで満たされていることに気付きました。

    private void InitializeComponent()
    {
        this.eventLog1 = new System.Diagnostics.EventLog();
        ((System.ComponentModel.ISupportInitialize)(this.eventLog1)).BeginInit();
        // 
        // Service1
        // 
        this.ServiceName = "Service1";
        ((System.ComponentModel.ISupportInitialize)(this.eventLog1)).EndInit();

    }

私の質問は次のとおりです。次のような行を生成するデザイナーを追加する必要があります。

components.Add(this.eventLog1);

ラインの後

this.eventLog1 = new System.Diagnostics.EventLog();

? 次のようなメソッドが存在するという事実:

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

System.Diagnostics.EventLogがIDisposableインターフェイスを実装していることから、生成されたコードのデザイナーにそのような行を含める必要があると思います。それは大したことではなく、非常にまれなケース (たとえば、 MainメソッドでServicesBase派生インスタンスを汚すなど) で、その行の欠如がアプリのパフォーマンスに影響を与える可能性があることはわかっていますが、それでも私には意味がありません。そのようなDisposalメソッドの実装であり、次のような行を追加しないでください: components.Add(this.eventLog1); . 何かご意見は?

4

1 に答える 1

1

これは私にはバグのように見えます。EventLog クラスは、コンテナー参照を受け取る適切なコンストラクターを実装するのを忘れています。コンポーネントはそうする必要はありません。基本的な例は BackgroundWorker と OpenFileDialog であり、破棄するものはありません。

しかし、はい、EventLog はそうです。イベント ログは通常、プログラムの存続期間中行われ、EventLog インスタンスは通常、静的変数に格納されます。修正は非常に簡単です。

using System;
using System.ComponentModel;
using System.Diagnostics;

public class MyEventLog : EventLog {
    public MyEventLog() { }
    public MyEventLog(IContainer container) : this() { container.Add(this); }
}
于 2014-11-07T15:01:03.140 に答える