Почему Visual Studio предоставляет вам Page_Load для WebForms по умолчанию?

При создании новой веб-формы Visual Studios по умолчанию создает обработчик Page_Load в исходном коде, что неплохо. Поэтому в течение многих лет я всегда помещал код для таких вещей, как установка свойств элементов управления в Page_Load. Недавно я использовал Reflector для просмотра некоторых сборок, написанных Microsoft, и увидел, что они поместили тот же тип логики в метод под названием OnLoad (который предположительно вызывает событие загрузки). Поэтому я начал задаваться вопросом, где лучше всего устанавливать свойства элементов управления в OnLoad или Page_Load? Или совсем другим методом? И если не Page_Load, почему Studio добавляет это в код?

Моя последняя мысль: хотя я знаю, что размещение логики в OnLoad работает нормально, я, вероятно, пока буду придерживаться Page_Load, потому что это общепринято. Я задал вопрос на самом деле, чтобы узнать, не упустил ли я что-то новое после того, как увидел, что OnLoad появляется в чужом коде. Спасибо всем за вдумчивые ответы!


person barneytron    schedule 16.01.2009    source источник


Ответы (5)


Page_Load - это просто автозапуск для OnLoad. Вы могли подумать, что это не имеет значения, что используется, но я согласен с К. Скотт Аллен из Ode to Code, что обычно следует отклоняться от нормы только в том случае, если вы пытаетесь сделать что-то неожиданное. Переопределение виртуального метода, такого как OnLoad, предполагает, что вы пытаетесь сделать что-то другое, например, не вызывать base.Onload, чего обычно не делают большинство программистов.

person DavGarcia    schedule 16.01.2009

Вы не хотите использовать OnLoad, потому что они его используют, потому что это оболочка для вызова события Page_Load. Они добавляют туда логику, потому что не обрабатывают событие Page_Load.

Короче говоря, продолжайте использовать Page_Load.

person Chad Moran    schedule 16.01.2009

Обычно методы OnX - это методы, которые вызывают событие X. Они похожи на внутренние обработчики событий класса. Это означает, что когда вы кодируете класс, который, среди прочего, обнаруживает определенное событие, вы обычно вызываете метод, который: 1. делает то, что ваш класс должен делать в этом случае, 2. запускает внешнее событие.

Я считаю, что одна из основных причин, по которой это прижилось, заключалась в том, что в существующем виде вы не можете просто вызвать делегат события, чтобы запустить событие, вы всегда должны проверять, является ли указанный делегат нулевым. Итак, вы хотите инкапсулировать эту проверку в метод.

Короче говоря, если вы не пишете свой собственный класс с событием Load, вам не нужно думать о методе OnLoad.

person Danut Enachioiu    schedule 16.01.2009

Пока все очень важные моменты. Но не позволяйте этим парням вас напугать. Вы ничего не повредите, если захотите использовать метод OnLoad. Только не забудьте вызвать base.OnLoad ().

person Al W    schedule 16.01.2009
comment
Я действительно сделал то, о чем вы недавно упомянули, просто чтобы посмотреть, все ли работает. Но потом я задумался, следует ли мне сначала вызвать base.OnLoad () перед собственным кодом или наоборот. - person barneytron; 17.01.2009

В самом деле, если вы вернетесь к плохим старым временам разработки ASP.Net 1.1, вы действительно увидите, как происходит подключение, созданное для вас на каждой странице:

    #region Web Form Designer generated code
    override protected void OnInit(EventArgs e)
    {
        InitializeComponent();
        base.OnInit(e);
    }

    /// <summary>
    /// Required method for Designer support - do not modify
    /// the contents of this method with the code editor.
    /// </summary>
    private void InitializeComponent()
    {    
        this.Load += new System.EventHandler(this.Page_Load);
    }
    #endregion

И время от времени я делал что-то, из-за чего VS удалял эту маленькую строчку в InitializeComponent и не мог понять, почему моя страница перестала что-либо делать.

person Zhaph - Ben Duguid    schedule 16.01.2009