Журнал LinuxFormat - перейти на главную

LXF87-88:Mono

Материал из Linuxformat
Перейти к: навигация, поиск

Содержание

Mono: Написать Hello, World!

Хотите научиться программировать? Имеете шанс: Пол Хадсон начинает новую серию руководств по Mono, C# и .NET. На этом уроке: первая программка.


На программировании держится мой мир, и я хочу, чтобы оно поддержало и ваш. Если вы сроду не программировали, то эта серия для вас: я попытаюсь рассказать, как стать профессиональным программистом, и сделаю все, чтобы этот процесс был увлекательным и интересным. Мы будем использовать Mono — открытую программную платформу, совместимую с Microsoft .NET. Если вы никогда о таком не слышали, ничего страшного — мы рассмотрим теорию позже.

На этом уроке мы начнем с установки Mono, разрешим его зависимости и напишем программу Hello World: как вы, возможно, догадались, цель этого проекта — заставить Mono вывести на экран строку ‘Hello World!’. В качестве базового дистрибутива для этого учебника я взял Fedora Core 6. Он включает все необходимое, чтобы научиться программировать в Mono, и если вы используете ту же версию, то можете в точности следовать моим инструкциям; если нет, то можете посмотреть врезку В помощь Fedora-ненавистникам.

В FC6 большая часть работы уже проделана за вас, но чтобы получить от этого учебника все, необходимо добавить несколько дополнительных пакетов. Выберите пункт Add/Remove Software (Добавить/Удалить Программы) из меню Applications (Приложения), а когда появится окно, выберите режим просмотра в виде Списка (List view). Проверьте, что помечены все пакеты, указанные во врезке Пакеты, нужные для установки Mono (см. выше). Некоторые из них уже установлены, но большинство необходимо выбрать самому. Пометив их, нажмите кнопку Apply (Применить), чтобы Fedora скачала последние версии этих пакетов и установила их — на это может уйти несколько минут.

Итак, мы установили Mono, и теперь вы можете получить доступ к разным частям системы. Возможно, на наших уроках пригодится лишь небольшое подмножество этих пакетов, зато потом вы сможете приняться за задачи по своему вкусу. В список включен Evolution-sharp для доступа к почте и календарю Evolution; gecko-sharp, для встраивания в ваши приложения web-браузера Gecko/Mozilla; ipod-sharp для написания программ доступа к iPod.

Суффикс ‘sharp’ означает, что данная библиотека предназначена для .NET: например, пакет foo-sharp позволяет использовать с Mono библиотеку foo. ‘Sharp’ используется потому, что самый популярный язык программирования для .NET — это С#; музыканты читают С# как «си-диез», а по-английски это произносится «си-шарп».

Самый важный установленный пакет — MonoDevelop, главная среда разработки приложений в Mono. Программы можно набирать и в обычном текстовом редакторе, но зачем заниматься ерундой? В MonoDevelop множество полезных инструментов, которые сэкономят вашу энергию. Тем более, все эти пакеты уже скачаны и установлены, а Fedora добавила в меню специальный пункт запуска MonoDevelop: выберите Applications (Приложения), затем Programming (Программирование), и щелкните по ярлыку MonoDevelop.

Все об интеграции

MonoDevelop — интегрированная среда разработки (IDE) для программистов на Mono. Концепция IDE — включить в одно приложение необходимые инструменты, чтобы выполнять больше работы с минимумом трудностей. В MonoDevelop мы будем производить и кодирование, и компиляцию, и отладку — это мощнейшая среда разработки! Правда, оборотной стороной её «мощи» является «трудность в обучении» — на первый раз MonoDevelop выглядит немного ошеломляюще, но большую часть функций вы пока можете игнорировать. Я буду объяснять новые возможности по ходу их надобности.

Займемся нашим первым проектом: Hello World. Это простая задача, и она даст нам прочную основу для дальнейшей разработки других программ.


Итак, в меню File выберите New Project. При появлении нового окна выберите в левой панели C#, затем Console Project на правой панели. В разделе Location (Местоположение) назовите проект HelloWorld. Поместите его в каталог, где будете сохранять свою работу — я обычно использую каталог sandbox [англ. «ящик с песком» — на таких проигрывают тактику военных операций, — прим. ред.], но вы вольны выбирать сами. Убедитесь, что не выбран пункт Create Separate Solution Subdirectory, и все: нажмите New, и MonoDevelop создаст скелет проекта.

Несколько секунд жужжания жесткого диска, и MonoDevelop оживает: слева вы увидите несколько файлов (включая Main.cs и AssemblyInfo.cs), а справа — код. Пока не обращайте на него внимания: нажмите F5. Для MonoDevelop это значит, что вы хотите запустить программу; он тут же компилирует код и запускает его.

Под панелью с кодом написано ‘Application Output’ (Вывод приложения), и после нажатия F5 на экране появится надпись ‘Hello World!’. Миссия выполнена! Ну, не шибко-то радуйтесь: я немного слукавил. MonoDevelop поставляется с уже готовым проектом Hello World!, а на самом деле мы ничего не кодировали. Зато код проекта можно редактировать; вот и попробуем. MonoDevelop сгенерировал 13 строчек кода, из которых только 5 представляют интерес. Вот что у нас есть:

// project created on 11/15/2006 at 1:59 PM
using System;
namespace HelloWorld
{
  class MainClass
  {
    public static void Main(string[] args)
    {
      Console.WriteLine("Hello World!");
    }
  }
}

Разбираем программу

Первая строка начинается с двух слэшей (//), они означают, что строка является комментарием. Преобразуя исходный код в нечто исполнимое компьютером (именно это и называется «компиляцией»), Mono удаляет все комментарии. Напишите в программе хоть тысячу строк комментариев — они никак не повлияют на скорость ее исполнения, потому что компилятором просто игнорируются. Комментарии полезны лично нам: с их помощью мы поясняем, как работает программа или почему мы написали именно так. Этот комментарий MonoDevelop вставил автоматически, чтобы пометить, когда был создан проект — проку от него мало, поэтому можете удалить эту строку, если хотите.

Следующие две строки касаются первой части нашей теории: пространств имен. Платформа .NET велика. Очень велика! Здесь умещаются библиотеки для работы с XML, графикой, сетью, пользовательским интерфейсом, файлами, безопасностью… и пр. На свете есть тысячи библиотек разработчиков, которые вы можете скачать и включить в собственный код. Каждая из них дает своим компонентам свои собственные имена, поэтому если загрузить их одновременно, то возможности именования в вашей программе будут серьезно ограничены. C# решает эту проблему с помощью пространств имен: каждая библиотека находится где-то в иерархии .NET, куда вам необходимо явным образом загрузить ее.

System — это пространство имен, включающее базовые вещи .NET, в том числе возможность выводить на консоль сообщение ‘Hello World!’. Не будь строки using System;, строка, начинающаяся с Console. WriteLine, не сработала бы: Mono не знал бы, где искать ‘Console’. Нам пришлось бы явно указать, что мы имели в виду Console из библиотеки System, изменив строку на следующую: System.Console.WriteLine. Написав using System;, мы просто сокращаем работу по набору кода. Заметим, что строка кода заканчивается точкой с запятой: для Mono это признак окончания строки.

После строки с using мы определяем свое собственное пространство имен: HelloWorld. И снова, это гарантирует, что наш новый код не будет конфликтовать с наличным кодом Mono. Если имена в ваших проектах сугубо экзотические, без пространств имен можно обойтись, но все же рекомендую оставить эту строку.

Сразу после объявления пространства имен следует открывающая фигурная скобка ({). Вообще-то в коде полно { и }, поэтому вы, вероятно, хотите узнать, зачем они нужны. В C# фигурные скобки используются как метки начала и конца блока кода. В приведенном выше примере, открывающая фигурная скобка сразу после namespace HelloWorld говорит «пространство имен начинается здесь». В конце кода находится закрывающая скобка, означающая, что «пространство HelloWorld заканчивается здесь». Все, что находится между открывающей и закрывающей скобкой, является частью пространства имен HelloWorld.

В коде есть еще четыре открывающих и закрывающих скобки, каждая из которых помечает начало и конец соответствующего блока. Компилятору неважно, насколько аккуратно расставлены скобки, однако выравнивание положений открывающей и закрывающей скобок облегчает чтение — чтобы найти конец блока, достаточно проследовать по вертикали вниз. Заметим, что после скобок не нужна точка с запятой: скобки ничего не делают в коде, а просто представляют структуру.


С# реализует концепции объектно-ориентированного программирования, то есть в коде можно определить сущности (называемые классами), затем создать экземпляры этих сущностей (называемые объектами), и совершать над ними некие операции. Например, если вы пишете игру про гонки, вы создаёте класс Car (Машина), затем создаёте десять объектов этого класса и помещаете их на трассу. У каждой машины своя позиция и скорость — это данные объекта. Внутри нашего пространства имени находится один класс — MonoDevelop назвал его безликим именем MainClass: ведь неизвестно, что мы собрались запрограммировать.

MainClass не содержит собственных данных, но содержит метод Main. Методы — это действия, которые вы хотите заставить объект выполнять по вашей команде. Так, в примере с машиной вам понадобятся методы Accelerate [Ускориться], Decelerate [Снизить скорость], ChangeGear [сменить передачу] и Crash [сломаться]. (Имена не могут содержать пробелов, но допускают знаки подчеркивания). Эти методы заставляют объекты совершать действия — в случае с Accelerate произойдет увеличение скорости машины.

Метод Main выглядит довольно коряво, потому что предварен аж тремя ключевыми словами: public, static и void. Пока оставим их в покое. Кроме того, в скобках метода Main стоит string[] args, нагоняя еще больше страху. Но этим мы тоже займемся попозже. Надеюсь, вы заметили открывающую скобку на следующей строчке — она отмечает начало метода.

Последняя заслуживающая внимания строка — Console.WriteLine. Console — это объект, который представляет консоль, в которой работает наша программа и куда направится весь вывод. WriteLine — метод этого объекта, выводящий текст на консоль. Чтобы вызвать WriteLine («вызвать» — то есть исполнить код), мы просто передаем ему строку текста, заключенную в кавычки, например так:

Console.WriteLine("Hello World!");

Скобки — (и) — используются, чтобы сообщить Mono, что мы вызываем метод WriteLine; без них он не будет знать, что делать.

Всего 13 строк кода, а сколько объяснений! Зато вы уже впитали довольно много теории.

Изучаем возможности WriteLine()

Текст ‘Hello World!’ не особо нов, но внутри кавычек можно поместить любую другую строку для вывода (не забывайте нажимать F5, что-бы MonoDevelop перекомпилировал и выполнил ваш код). Любой-то любой, но есть одно исключение, если в тексте имеются кавычки:

Console.WriteLine("Затем Эффи сказал "Я зануда", и вправду так и думал.");

Попытавшись набрать этот текст в MonoDevelop, вы увидите, что MonoDevelop выделяет текст красным цветом. Точнее, вы увидите, что Затем Эффи сказал выделено красным цветом, затем Я зануда — черное, а затем, и вправду так и думал. выделено опять красным. Подумайте: если в Mono кавычки помечают начало и конец текста, то как он сможет уловить разницу между кавычкой, которую вы хотите вывести, и кавычкой, означающей конец текста? Да никак. Поэтому он сочтет, что выводимая строка текста — ’Затем Эффи сказал’, а следующая часть, ‘Я зануда’, — уже код C#. Mono это не понравится.

Если вы хотите включить кавычки в ваш текст, предупредите Mono, что кавычку надо вывести, а не считать её концом текста. В C# это можно сделать с помощью специального модификатора [escape character]: \. Модификатор сообщает C#, что следующий за ним символ интерпретируется особым образом. Если вы хотите вывести кавычки, необходимо поместить перед кавычкой модификатор:

Console.WriteLine("Затем Эффи сказал, \"Я зануда!\", и вправду так и думал.");

Другими модификаторами являются \n, означающий «начало следующей строки»; и \\, означающий «вывод обратного слэша» (то есть знак \ выводится, а не считается модификатором). Вообще-то модификатор \n не так уж и нужен, потому что метод WriteLine автоматически добавляет символ новой строки в конец каждой выводимой строки. Например, если бы вы изменили код на следующий:

Console.WriteLine("Фонарный столб он кулаком ");
Console.WriteLine("Ударил что есть сил,");
Console.WriteLine("И гордо заявил потом,");
Console.WriteLine("Что призрака сразил.");

то на каждой строке напечаталось бы по одной строке текста. Управлять переносом строки самостоятельно позволяет метод Console.Write, например, так:

Console.Write("Фонарный столб он кулаком \n");
Console.Write("Ударил что есть сил,\n");
Console.Write("И гордо заявил потом,\n");
Console.Write("Что призрака сразил.\n");

Параметр номер 0

Взгляните на часть string args[] в методе Main. Каждое определение метода должно заканчиваться открывающей и закрывающей круглой скобкой. Между этими скобками мы можем определить, какие данные — если надо — мы будем передавать методу. Вспомним пример с машиной: как метод ChangeGear узнает, на какую передачу надо переключиться? Ответ очевиден: указать ему номер передачи. Вот это и есть параметр. Мы определяем параметры, которые должен получать наш метод, а C# проверяет, что при вызове метода использованы правильные данные. У каждого параметра есть тип и имя, по которому к нему будет происходить обращение в методе.

В случае с string args[] наш код утверждает три вещи: методу Main будет передан строго один параметр; доступ к нему из метода Main будет осуществлен через имя args; это будет массив строк (массив обозначается символом [], открывающая и закрывающая квадратные скобки). Строкой называется просто текст: любая последовательность символов, начинающаяся и заканчивающаяся символом двойной кавычки. То есть «Hello World!» — это строка. Массив — это группа объектов одного типа, а значит, параметр args может быть пустым, может содержать одну строку или 100 строк — все зависит того, что передается в метод при его вызове.

Если вы программируете впервые, то, возможно, не поняли того, что я сказал, поэтому я очерчу проблему: где мы в действительности вызываем метод Main? Ответ: мы его НЕ вызываем! Однако же ‘Hello World!’ выводится на экран? Дело в том, что метод ‘Main’ — особый метод. Когда запускается наша программа, Mono автоматически ищет и вызывает метод Main, а также передает ему параметры командной строки. Мы привыкли набирать cd /usr/bin, чтобы сменить каталог; /usr/bin является параметром команды cd. Когда Mono вызывает метод Main, он посылает эти параметры в виде массива строк args, а это значит, что мы можем сделать нашу первую полезную программу: ввод данных пользователем для их дальнейшего применения.


Создайте новый проект (выберите File > New Project > C# > Console Project и уберите там дурацкую галочку) и назовите его «ParamPrint». Программа будет принимать один входной параметр командной строки и выводить его вместе со строкой ‘Hello World!’.

В новом коде, который сгенерирует MonoDevelop, измените Console. WriteLine на следующую строку:

Console.WriteLine("Hello World: " + args[0]);

Так как переменная args — это массив строк, то необходимо сообщить C#, который элемент массива мы хотим вывести. Элементы массива нумеруются, начиная с 0, который обозначает первый элемент, 1 — второй элемент и т. д.; чтобы напечатать первый переданный параметр, необходимо написать args[0]. Знак + нужен для соединения строки «Hello World!» и первого параметра.


Если вы теперь нажмете F5, то увидите нечто страшное: вместо вывода сообщения, как в предыдущем примере, приложение MonoDevelop выдаст что-то вроде ‘Unhandled exception: System.Index OutOfRangeException’ [Необработанное исключение: Выход за границы массива]. Так получилось потому, что args[0] ссылается на первый передаваемый в программу параметр, а в действительности мы его не передаем — ведь MonoDevelop просто запустил программу без параметров.

Решение состоит в том, чтобы открыть терминал и задать программе параметры вручную. В меню Applications (Приложения), выберите Accessories (Дополнительные), затем Terminal (Терминал). Теперь измените каталог на тот, в котором находится ваш проект. Внутри каталога вы увидите каталог bin, а также каталог Debug, куда MonoDevelop помещает исполняемые файлы, когда мы работаем над проектом. Внутри этого каталога будет находится ваша программа: ParamPrint. exe. Чтобы запустить ее, наберите команду:

mono ParamPrint.exe

Вы увидите то же сообщение об ошибке на консоли; а теперь попробуйте добавить параметр:

mono ParamPrint.exe LXF

На экран выведется ‘Hello World: LXF’. А если вы попробуете

mono ParamPrint.exe Linux Format

на экран выведется только ‘Hello World: Linux’. Строка не выведется целиком, так как каждый параметр считается отдельной строкой в массиве args, а параметры разделяются пробелом. В приведенном выше примере Linux — это args[0], а Format — это args[1]. Если хотите вывести всю строку, то наберите команду вот так:

mono ParamPrint.exe "Linux Format"

Кавычки сообщают Bash (это программа-оболочка), что Linux Format — это один параметр.

Пока все хорошо

На этом уроке было дано введение в MonoDevelop, вы узнали о пространствах имен и методах, какова структура кода C# и как выводить сообщения на экран. Также мы затронули объектно-ориентированное программирование, довольно сложный для изучения вопрос. Но главное — вы написали первую программу. Она не делает ничего полезного, но научила вас, как приступить к программированию. В следующий раз мы рассмотрим задачи посерьезнее, тогда-то и начнется веселье.

Персональные инструменты
купить
подписаться
Яндекс.Метрика