1

在使用Windows Service VS2013 项目模板创建项目时,我注意到从工具框中添加EventLog组件后,名为“组件设计器生成的代码”的#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接口让我认为这样的行应该包含在Designer生成的代码中。我知道这没什么大不了的,而且仅在极少数情况下(例如,您在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 回答