Дополнительный код в C#

Мы завершили сравнение процедур обработки событий в C# и VB. В процессе обсуждения мы много узнали о синтаксических различиях между этими языками. Фактически была показана большая часть базового синтаксиса C#. Мы также впервые столкнулись с тем фактом, что все в C# является классом. Однако, если загрузить код нашего примера с web-сайта издательства Wrox, и просмотреть его, то почти наверняка можно будет заметить, что мы тщательно избегали какого-либо обсуждения наиболее очевидного различия между двумя примерами: в примере на C# в действительности код намного длиннее и включает не только обработчик событий. Для версии VB примера SquareRoot код обработчика событий, который здесь представлен, представляет весь исходный код этого проекта. Напротив, в версии C# этот обработчик событий является только одним методом в огромном файле исходного кода.

Причина, по которой код в проекте C# такой большой, связана с тем, что Visual Basic IDE большая часть того, что делается в программе, исходит от программиста. В Visual Basic требовалось написать только обработчик событий, но фактически выполняется значительно больше: запускается пример, выводится форма на экране, посылается информация Windows, зависящая от того, что желательно делать с событиями, и по окончании пример завершается. В Visual Basic программист не имеет доступа к коду, который делает все. C#, напротив, использует совершенно другую философию, и оставляет весь этот код открытым. Это может сделать внешний вид исходного кода более сложным. Но имеется одно преимущество: если код доступен, то его можно редактировать и это обеспечивает значительно большую гибкость в решении того, как должно себя вести приложение.

Фактически Visual Basic настолько успешно скрывает почти все, что происходит в программе, что очень легко стать профессиональным программистом и создавать достаточно сложные приложения, не имея на самом деле никакого представления о полной структуре компьютерной программы. В следующем разделе будет рассмотрено, что же происходит в любой такой программе, и таким образом мы будем готовы взглянуть на весь дополнительный код, который содержится в версии C# программы SquareRoot.

Что происходит при выполнении программы

Любая программа содержит точную последовательность выполнения. Когда приложение запускается, будет существовать определенное место в исполнимом коде, с которого, как знает компьютер, он должен начать выполнение кода, другими словами, инструкция, которая выполняется первой. Затем будет идти следующая инструкция, и следующая, и следующая и так далее. Некоторые из этих команд прикажут компьютеру перепрыгнуть к другой инструкции, возможно в зависимости от значений, которые содержатся в некоторых переменных. Очень часто компьютер будет перепрыгивать назад и выполнять ту же самую инструкцию снова. Однако всегда существует эта непрерывная последовательность выполнения следующей инструкции, пока компьютер не встретит команду, которая прикажет ему прекратить выполнение кода. Такая линейная последовательность справедлива для любой программы. Некоторые программы могут быть мультипоточными, и в этом случае существует несколько последовательностей выполнения (потоков выполнения), но каждый поток по-прежнему будет следовать от начальной инструкции до остановки программы.

Конечно, эта последовательность не та, которую можно видеть при написании исполнимой программы VB. В VB6 по сути пишется набор обработчиков событий — набор подпрограмм, каждая из которых вызывается, когда пользователь что-то сделает. Не существует единственного начала программы, хотя обработчик события Form_Load близко подходит к этому по своей концепции. Даже в этом случае Form_Load является на самом деле только еще одним обработчиком для события, которое возникает, когда загружается форма, и значит, оно будет первым выполняющимся событием. Аналогично, если вместо исполнимого кода пишется элемент управления или объект класса, то нет начальной точки. Просто задается класс и к нему добавляется множество методов и свойств. Каждый метод или свойство будет выполняться, если или когда код клиента его вызывает.

В действительности приведенный выше абзац не совсем справедлив. В VB существует процедура Sub Main(), которая действует как точка входа программы, но она не часто используется. Поскольку здесь сравнивается типичная программа C# с типичной программой VB, то точка зрения, констатирующая, что программы VB в действительности показывают код только для событие в общем оказывается правильной.

Чтобы увидеть, как можно связать две идеи программирования, давайте выясним, что реально происходит, когда выполняется любое приложение Visual Basic или любое приложение GUI Windows, не важно на каком языке оно написано. Это более ограниченное рассмотрение, чем в случае приложении, которые упоминались перед этим, так как теперь мы сосредоточимся только на приложениях Windows API (другими словами, нет консолей, служб и т.д.).

Как обычно, выполнение начинается в некоторой вполне определенной точке. Команды будут вовлекать в работу некоторые окна и элементы управления, а также вывод этих элементов управления на экран. В этом месте программа делает затем что-то, что называют входом в цикл сообщений. На самом деле программа засыпает и приказывает Windows разбудить себя, когда произойдет что-то интересное, о чем ей необходимо знать. Эти 'интересные' вещи являются событиями, для которых необходимо написать обработчики событий, а также существует достаточно много событий, для которых не требуется писать свои собственные обработчики событий, так как если обработчик для определенного события написан не будет, то VB IDE спокойно представляет готовый по умолчанию. Хорошим примером этого являются обработчики, которые имеют дело с изменением размера формы. Исходный код для него никогда не показывается в VB, но приложение VB может правильно отреагировать, когда пользователь попытается изменить размер, поскольку VB IDE незаметно добавляет в проект обработчики событий, которые правильно управляют этой ситуацией.

Когда происходит событие, Windows пробуждает приложение и вызывает соответствующим обработчик событий, именно в этот момент может начать выполняться код программиста. Когда процедура обработчика событий заканчивается, приложение снова переведет себя в спящий режим, приказывая Windows разбудить себя, когда произойдет другое интересное событие. Наконец, предполагая, что ничего не произошло разрушительного и неверного, в некоторый момент Windows разбудит приложение и проинформирует его, что необходимо прекратить работу. В этот момент приложение предпримет все необходимые действия — например, выведет окно сообщения, спрашивающего у пользователя, не хочет ли он сохранить файл и затем спокойно завершится. Снова большая часть кода, который это делает, добавляется в проект неявно VB IDE, и программист никогда его не видит.

Поток выполнения в типичном приложении GUI Windows выглядит примерно следующим образом:

На этой диаграмме рамка с пунктирной границей указывает ту часть исполнимого кода, к которой VB IDE предоставляет программисту доступ и для которого можно писать исходный код,— это несколько обработчиков событий. Остальная часть кода недоступна для программиста, хотя его можно в некоторой степени определить, выбирая тип приложения при запросе к VB на создание проекта. Для нового проекта в VB появляется диалоговое окно, запрашивающее тип приложения, которое требуется создать,— стандартный EXE, ActiveX EXE, ActiveX DLL и т.д. После выбора VB IDE использует его для генерации всего необходимого кода в той части программы, которая находится вне пунктирной рамки на приведенной выше

Добавить отзыв
ВСЕ ОТЗЫВЫ О КНИГЕ В ИЗБРАННОЕ

0

Вы можете отметить интересные вам фрагменты текста, которые будут доступны по уникальной ссылке в адресной строке браузера.

Отметить Добавить цитату