netlib.narod.ru< Назад | Оглавление | Далее >

Как быть с Main?

При рассмотрении программ вроде HelloWorld может вызвать удивление метод Main. Main — метод класса HelloWorld, в то же время Main создает экземпляр класса HelloWorld. Это может показаться странным: программа уподобляется Мюнхгаузену, который вытянул себя из болота за волосы. Как метод Main вообще может выполняться, если еще не создан экземпляр класса HelloWorld?

Отвечаю: метод Main определен как static. Существование статических методов не зависит от того, созданы ли экземпляры каких-либо объектов класса. По идее ОС загружает программу в память и начинает выполнение программы с вызова:

  HelloWorld.Main();

Если Main не определен как static, ОС не сможет его вызвать. Если вы удалите слово static из определения Main, компилятор сообщит об отсутствии у программы точки входа.

Может, вам покажется удобнее поместить Main в свой класс, как в программах на С# главы 1. В этом нет ничего неправильного, и кое-кто предпочитает этот подход. Его демонстрирует программа SeparateMain.cs, по функциональности не отличающаяся от HelloWorld.

SeparateMain.cs

  //-----------------------------------------------
  // SeparateMain.cs (C) 2001 by Charles Petzold
  //-----------------------------------------------
  using System;
  using System.Drawing;
  using System.Windows.Forms;

  class SeparateMain
  {
      public static void Main()
      {
          Application.Run(new AnotherHelloWorld());
      }
  }
  class AnotherHelloWorld: Form
  {
      public AnotherHelloWorld()
      {
          Text = "Another Hello World";
          BackColor = Color.White;
      }
      protected override void OnPaint(PaintEventArgs pea)
      {
          Graphics grfx = pea.Graphics;

          grfx.DrawString("Hello, Windows Forms!", Font,
                          Brushes.Black, 0, 0);
      }
  }

Согласен: она выглядит чище с точки зрения архитектуры, и я немного поэкспериментировал, структурируя примеры программ моей книги таким образом. Но у меня нет желания добавлять в каждую программу три строки кода, и я не вижу смысла заводить два класса там, где можно обойтись одним. Кроме того, я отказался от такого подхода, когда начал замечать, что статические методы и свойства классов .NET возвращают экземпляры классов, к которым они относятся. Например, Chocolate — статическое свойство класса Color, тем не менее, оно возвращает экземпляр Color.


netlib.narod.ru< Назад | Оглавление | Далее >

Сайт управляется системой uCoz