3

この質問はちょっとした逸話ですが、それでも私にとっては興味深いものです。Visual Studio 2008 が次の定数の使用を好まない理由を知りたいと思っていました。

public class Service101 : ServiceBase
{
    /// <remarks>
    /// Shown at Start -> Settings -> Control Panel -> Administrative Tools -> Services
    /// </remarks>
    internal const string SERVICE_NAME = "WinSvc101";
    /// <remarks>
    /// Shown at Start -> Settings -> Control Panel -> Administrative Tools -> Services
    /// </remarks>
    internal const string DISPLAY_NAME = "Windows Service 101";
    /// <summary>
    /// Public constructor for Service101.
    /// </summary>      
    public Service101()
    {
        InitializeComponent();
    }

    private void InitializeComponent()
    {
        this.ServiceName = Service101.SERVICE_NAME;
        this.EventLog.Source = Service101.DISPLAY_NAME;
        this.EventLog.Log = "Application";

        if (!EventLog.SourceExists(Service101.DISPLAY_NAME))
        {
            EventLog.CreateEventSource(Service101.DISPLAY_NAME, "Application");
        }
    }
    #region Events
    /// <summary>
    /// Dispose of objects that need it here.
    /// </summary>
    /// <param name="disposing">Whether or not disposing is going on.</param>
    protected override void Dispose(bool disposing)
    {
        // TODO: Add cleanup code here (if required)
        base.Dispose(disposing);
    }

設計時に次の警告が表示されているため:

Warning 1   The designer cannot process the code at line 68: 

if (!EventLog.SourceExists(DISPLAY_NAME))
{
    EventLog.CreateEventSource(DISPLAY_NAME, "Application");
}

The code within the method 'InitializeComponent' is generated by the designer and should not be manually modified.  Please remove any changes and try opening the designer again.   E:\Proyectos\beanstalk\dotnetfx\trunk\WinSvc101\WinSvc101\Service101.cs 69  0   

どんなコメントでも大歓迎です。よろしくお願いします。

4

4 に答える 4

5

それは実際にあなたに言いました。そのコードはデザイナーによって生成されます。設計者は、それを残したままにする必要があります。デザイナーに不快なことをさせたくない限り、そのコードを変更しないでください。


ビジュアル デザイナーに表示されるものと生成されたコードの間には、一種の均衡があります。

  1. 空のデザイン サーフェイスから開始するため、コードは生成されません。
  2. 何かをデザイン サーフェイスにドラッグします。デザイナーは、それを作成するために必要なコードを生成します。
  3. そのオブジェクトのプロパティを設定すると、指定したとおりにプロパティを設定するコードがデザイナーによって生成されます。
  4. 保存して閉じる
  5. デザイナーでドキュメントを再度開きます。デザイナーは、デザイン サーフェイスに何を表示するかを考え出さなければなりません。生成したコードを読み取り、コードがそれ自体で生成されたことを認識しているため、そのコードがデザイン面で何を意味するかを認識します。
  6. 次に変更または保存が行われると、コードが再生成されます。

ここで、生成されたコードに何らかの変更を加えたとします。デザイナーが行ったのとまったく同じ方法でその変更を行わない限り、変更は認識されません。変更はデザイン サーフェイスには表示されません。次回の変更または保存時に、デザイナーは変更なしでコードを再生成します

したがって、生成されたコードへの変更を失いたくない場合は、生成されたコードに変更を加えないでください。

于 2009-07-26T13:09:50.597 に答える
3

にコードを追加すると、設計者は満足しませんInitializeComponent()。代わりに次のようにしてみてください。

public Service101()
{
    InitializeComponent();
    this.createEventSource();
}

private void InitializeComponent()
{
    this.ServiceName = SERVICE_NAME;
    this.EventLog.Source = DISPLAY_NAME;
    this.EventLog.Log = "Application";
}

void createEventSource()
{
    if (!EventLog.SourceExists(DISPLAY_NAME))
    {
        EventLog.CreateEventSource(DISPLAY_NAME, "Application");
    }
}
于 2009-07-26T13:11:31.613 に答える
3

私にはかなり明確に思えます。これは、自動生成されたコードを変更したため、それを行うべきではないことを示しています。

最悪の場合、変更内容が失われる可能性があります。最良の場合、予期しないコードが検出され、何も変更されないため、変更が失われることはありません。しかし、それはあなたのコードも理解できません。定数は他の場所に配置する必要があります。

于 2009-07-26T13:12:54.577 に答える
1

要点が少しずれていますが、とにかく、定数 (およびパブリック定数) を使用している理由がよくわかりません。これしかできなかったの?

private void InitializeComponent()
{
    this.ServiceName = "WinSvc101";
    this.EventLog.Source = "Windows Service 101";
    // ....
}
于 2009-07-26T14:02:04.110 に答える