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

LXF87-88:Mono

Материал из Linuxformat
(Различия между версиями)
Перейти к: навигация, поиск
(Новая: {{Цикл/Mono}} == Mono: Написать Hello, World! == ''Хотите научиться программировать? Имеете шанс: '''Пол Хадсон''' начин...)
 
м (Mono: Написать Hello, World!)
 
(не показаны 2 промежуточные версии 2 участников)
Строка 61: Строка 61:
 
следовать этому руководству. И, пожалуйста,
 
следовать этому руководству. И, пожалуйста,
 
не стесняйтесь задавать вопросы на форуме
 
не стесняйтесь задавать вопросы на форуме
Linux Format по адресу http://www.linuxforum.ru.
+
Linux Format по адресу http://unixforum.org.
 
|Ширина=200px}}
 
|Ширина=200px}}
 
На программировании держится мой мир, и я хочу, чтобы оно
 
На программировании держится мой мир, и я хочу, чтобы оно
 
поддержало и ваш. Если вы сроду не программировали, то
 
поддержало и ваш. Если вы сроду не программировали, то
 
эта серия для вас: я попытаюсь рассказать, как стать профессиональным программистом, и сделаю все, чтобы этот процесс был
 
эта серия для вас: я попытаюсь рассказать, как стать профессиональным программистом, и сделаю все, чтобы этот процесс был
увлекательным и интересным. Мы будем использовать Mono – открытую программную платформу, совместимую с Microsoft .NET. Если
+
увлекательным и интересным. Мы будем использовать Mono — открытую программную платформу, совместимую с Microsoft .NET. Если
вы никогда о таком не слышали, ничего страшного – мы рассмотрим
+
вы никогда о таком не слышали, ничего страшного — мы рассмотрим
 
теорию позже.
 
теорию позже.
  
На этом уроке мы начнем с установки Mono, разрешим его зависимости и напишем программу Hello World: как вы, возможно, догадались, цель этого проекта – заставить Mono вывести на экран строку
+
На этом уроке мы начнем с установки Mono, разрешим его зависимости и напишем программу Hello World: как вы, возможно, догадались, цель этого проекта — заставить Mono вывести на экран строку
 
‘Hello World!’. В качестве базового дистрибутива для этого учебника я
 
‘Hello World!’. В качестве базового дистрибутива для этого учебника я
 
взял Fedora Core 6. Он включает все необходимое, чтобы научиться
 
взял Fedora Core 6. Он включает все необходимое, чтобы научиться
Строка 80: Строка 80:
 
появится окно, выберите режим просмотра в виде Списка (List view).
 
появится окно, выберите режим просмотра в виде Списка (List view).
 
Проверьте, что помечены все пакеты, указанные во врезке Пакеты, нужные для установки Mono (см. выше). Некоторые из них уже установлены, но большинство необходимо выбрать самому. Пометив их, нажмите кнопку Apply (Применить), чтобы Fedora скачала последние версии
 
Проверьте, что помечены все пакеты, указанные во врезке Пакеты, нужные для установки Mono (см. выше). Некоторые из них уже установлены, но большинство необходимо выбрать самому. Пометив их, нажмите кнопку Apply (Применить), чтобы Fedora скачала последние версии
этих пакетов и установила их – на это может уйти несколько минут.
+
этих пакетов и установила их — на это может уйти несколько минут.
  
 
Итак, мы установили Mono, и теперь вы можете получить доступ к
 
Итак, мы установили Mono, и теперь вы можете получить доступ к
Строка 91: Строка 91:
 
для .NET: например, пакет foo-sharp позволяет использовать с Mono
 
для .NET: например, пакет foo-sharp позволяет использовать с Mono
 
библиотеку foo. ‘Sharp’ используется потому, что самый популярный
 
библиотеку foo. ‘Sharp’ используется потому, что самый популярный
язык программирования для .NET – это С#; музыканты читают С# как
+
язык программирования для .NET — это С#; музыканты читают С# как
 
«си-диез», а по-английски это произносится «си-шарп».
 
«си-диез», а по-английски это произносится «си-шарп».
  
Самый важный установленный пакет – MonoDevelop, главная
+
Самый важный установленный пакет — MonoDevelop, главная
 
среда разработки приложений в Mono. Программы можно набирать и в обычном текстовом редакторе, но зачем заниматься ерундой? В MonoDevelop множество полезных инструментов, которые
 
среда разработки приложений в Mono. Программы можно набирать и в обычном текстовом редакторе, но зачем заниматься ерундой? В MonoDevelop множество полезных инструментов, которые
 
сэкономят вашу энергию. Тем более, все эти пакеты уже скачаны и
 
сэкономят вашу энергию. Тем более, все эти пакеты уже скачаны и
Строка 114: Строка 114:
 
программы.
 
программы.
 
|Ширина=150px}}
 
|Ширина=150px}}
MonoDevelop – интегрированная среда разработки (IDE) для программистов на Mono. Концепция IDE – включить в одно приложение необходимые инструменты, чтобы выполнять больше работы с минимумом
+
MonoDevelop — интегрированная среда разработки (IDE) для программистов на Mono. Концепция IDE — включить в одно приложение необходимые инструменты, чтобы выполнять больше работы с минимумом
 
трудностей. В MonoDevelop мы будем производить и кодирование, и
 
трудностей. В MonoDevelop мы будем производить и кодирование, и
компиляцию, и отладку – это мощнейшая среда разработки! Правда,
+
компиляцию, и отладку — это мощнейшая среда разработки! Правда,
оборотной стороной её «мощи» является «трудность в обучении» – на
+
оборотной стороной её «мощи» является «трудность в обучении» — на
 
первый раз MonoDevelop выглядит немного ошеломляюще, но большую часть функций вы пока можете игнорировать. Я буду объяснять
 
первый раз MonoDevelop выглядит немного ошеломляюще, но большую часть функций вы пока можете игнорировать. Я буду объяснять
 
новые возможности по ходу их надобности.
 
новые возможности по ходу их надобности.
Строка 140: Строка 140:
 
Итак, в меню File выберите New Project. При появлении нового окна
 
Итак, в меню File выберите New Project. При появлении нового окна
 
выберите в левой панели C#, затем Console Project на правой панели. В разделе Location (Местоположение) назовите проект HelloWorld.
 
выберите в левой панели C#, затем Console Project на правой панели. В разделе Location (Местоположение) назовите проект HelloWorld.
Поместите его в каталог, где будете сохранять свою работу – я обычно
+
Поместите его в каталог, где будете сохранять свою работу — я обычно
использую каталог sandbox [англ. «ящик с песком» – на таких проигрывают тактику военных операций, прим. ред.], но вы вольны выбирать сами. Убедитесь, что не выбран пункт Create Separate Solution
+
использую каталог sandbox [англ. «ящик с песком» — на таких проигрывают тактику военных операций, — прим. ред.], но вы вольны выбирать сами. Убедитесь, что не выбран пункт Create Separate Solution
 
Subdirectory, и все: нажмите New, и MonoDevelop создаст скелет
 
Subdirectory, и все: нажмите New, и MonoDevelop создаст скелет
 
проекта.
 
проекта.
Строка 147: Строка 147:
 
Несколько секунд жужжания жесткого диска, и MonoDevelop
 
Несколько секунд жужжания жесткого диска, и MonoDevelop
 
оживает: слева вы увидите несколько файлов (включая Main.cs и
 
оживает: слева вы увидите несколько файлов (включая Main.cs и
AssemblyInfo.cs), а справа – код. Пока не обращайте на него внимания:
+
AssemblyInfo.cs), а справа — код. Пока не обращайте на него внимания:
 
нажмите F5. Для MonoDevelop это значит, что вы хотите запустить программу; он тут же компилирует код и запускает его.
 
нажмите F5. Для MonoDevelop это значит, что вы хотите запустить программу; он тут же компилирует код и запускает его.
  
Строка 174: Строка 174:
 
Первая строка начинается с двух слэшей (//), они означают, что строка
 
Первая строка начинается с двух слэшей (//), они означают, что строка
 
является комментарием. Преобразуя исходный код в нечто исполнимое
 
является комментарием. Преобразуя исходный код в нечто исполнимое
компьютером (именно это и называется «компиляцией»), Mono удаляет все комментарии. Напишите в программе хоть тысячу строк комментариев – они никак не повлияют на скорость ее исполнения, потому
+
компьютером (именно это и называется «компиляцией»), Mono удаляет все комментарии. Напишите в программе хоть тысячу строк комментариев — они никак не повлияют на скорость ее исполнения, потому
 
что компилятором просто игнорируются. Комментарии полезны лично
 
что компилятором просто игнорируются. Комментарии полезны лично
 
нам: с их помощью мы поясняем, как работает программа или почему
 
нам: с их помощью мы поясняем, как работает программа или почему
мы написали именно так. Этот комментарий MonoDevelop вставил автоматически, чтобы пометить, когда был создан проект – проку от него
+
мы написали именно так. Этот комментарий MonoDevelop вставил автоматически, чтобы пометить, когда был создан проект — проку от него
 
мало, поэтому можете удалить эту строку, если хотите.
 
мало, поэтому можете удалить эту строку, если хотите.
  
Строка 186: Строка 186:
 
образом загрузить ее.
 
образом загрузить ее.
  
System – это пространство имен, включающее базовые вещи .NET,
+
System — это пространство имен, включающее базовые вещи .NET,
 
в том числе возможность выводить на консоль сообщение ‘Hello
 
в том числе возможность выводить на консоль сообщение ‘Hello
 
World!’. Не будь строки using System;, строка, начинающаяся с Console.
 
World!’. Не будь строки using System;, строка, начинающаяся с Console.
Строка 210: Строка 210:
 
В коде есть еще четыре открывающих и закрывающих скобки,
 
В коде есть еще четыре открывающих и закрывающих скобки,
 
каждая из которых помечает начало и конец соответствующего блока. Компилятору неважно, насколько аккуратно расставлены скобки,
 
каждая из которых помечает начало и конец соответствующего блока. Компилятору неважно, насколько аккуратно расставлены скобки,
однако выравнивание положений открывающей и закрывающей скобок облегчает чтение – чтобы найти конец блока, достаточно проследовать по вертикали вниз. Заметим, что после скобок не нужна точка
+
однако выравнивание положений открывающей и закрывающей скобок облегчает чтение — чтобы найти конец блока, достаточно проследовать по вертикали вниз. Заметим, что после скобок не нужна точка
 
с запятой: скобки ничего не делают в коде, а просто представляют
 
с запятой: скобки ничего не делают в коде, а просто представляют
 
структуру.
 
структуру.
Строка 227: Строка 227:
 
объектами), и совершать над ними некие операции. Например, если вы
 
объектами), и совершать над ними некие операции. Например, если вы
 
пишете игру про гонки, вы создаёте класс Car (Машина), затем создаёте десять объектов этого класса и помещаете их на трассу. У каждой
 
пишете игру про гонки, вы создаёте класс Car (Машина), затем создаёте десять объектов этого класса и помещаете их на трассу. У каждой
машины своя позиция и скорость – это данные объекта. Внутри нашего пространства имени находится один класс – MonoDevelop назвал
+
машины своя позиция и скорость — это данные объекта. Внутри нашего пространства имени находится один класс — MonoDevelop назвал
 
его безликим именем MainClass: ведь неизвестно, что мы собрались
 
его безликим именем MainClass: ведь неизвестно, что мы собрались
 
запрограммировать.
 
запрограммировать.
  
 
MainClass не содержит собственных данных, но содержит метод
 
MainClass не содержит собственных данных, но содержит метод
Main. Методы – это действия, которые вы хотите заставить объект
+
Main. Методы — это действия, которые вы хотите заставить объект
 
выполнять по вашей команде. Так, в примере с машиной вам понадобятся методы Accelerate [Ускориться], Decelerate [Снизить скорость],
 
выполнять по вашей команде. Так, в примере с машиной вам понадобятся методы Accelerate [Ускориться], Decelerate [Снизить скорость],
 
ChangeGear [сменить передачу] и Crash [сломаться]. (Имена не могут
 
ChangeGear [сменить передачу] и Crash [сломаться]. (Имена не могут
 
содержать пробелов, но допускают знаки подчеркивания). Эти методы
 
содержать пробелов, но допускают знаки подчеркивания). Эти методы
заставляют объекты совершать действия – в случае с Accelerate произойдет увеличение скорости машины.
+
заставляют объекты совершать действия — в случае с Accelerate произойдет увеличение скорости машины.
  
 
Метод Main выглядит довольно коряво, потому что предварен аж
 
Метод Main выглядит довольно коряво, потому что предварен аж
Строка 242: Строка 242:
 
покое. Кроме того, в скобках метода Main стоит string[] args, нагоняя
 
покое. Кроме того, в скобках метода Main стоит string[] args, нагоняя
 
еще больше страху. Но этим мы тоже займемся попозже. Надеюсь, вы
 
еще больше страху. Но этим мы тоже займемся попозже. Надеюсь, вы
заметили открывающую скобку на следующей строчке – она отмечает
+
заметили открывающую скобку на следующей строчке — она отмечает
 
начало метода.
 
начало метода.
  
Последняя заслуживающая внимания строка – Console.WriteLine.
+
Последняя заслуживающая внимания строка — Console.WriteLine.
Console – это объект, который представляет консоль, в которой работает наша программа и куда направится весь вывод. WriteLine – метод
+
Console — это объект, который представляет консоль, в которой работает наша программа и куда направится весь вывод. WriteLine — метод
 
этого объекта, выводящий текст на консоль. Чтобы вызвать WriteLine
 
этого объекта, выводящий текст на консоль. Чтобы вызвать WriteLine
(«вызвать» – то есть исполнить код), мы просто передаем ему строку
+
(«вызвать» — то есть исполнить код), мы просто передаем ему строку
 
текста, заключенную в кавычки, например так:
 
текста, заключенную в кавычки, например так:
 
<source lang="csharp">Console.WriteLine("Hello World!");</source>
 
<source lang="csharp">Console.WriteLine("Hello World!");</source>
Скобки – ( и ) используются, чтобы сообщить Mono, что мы вызываем метод WriteLine; без них он не будет знать, что делать.
+
Скобки — (и) — используются, чтобы сообщить Mono, что мы вызываем метод WriteLine; без них он не будет знать, что делать.
  
 
Всего 13 строк кода, а сколько объяснений! Зато вы уже впитали
 
Всего 13 строк кода, а сколько объяснений! Зато вы уже впитали
Строка 264: Строка 264:
 
Попытавшись набрать этот текст в MonoDevelop, вы увидите, что
 
Попытавшись набрать этот текст в MonoDevelop, вы увидите, что
 
MonoDevelop выделяет текст красным цветом. Точнее, вы увидите,
 
MonoDevelop выделяет текст красным цветом. Точнее, вы увидите,
что Затем Эффи сказал выделено красным цветом, затем Я зануда – черное, а затем , и вправду так и думал. выделено опять красным.
+
что Затем Эффи сказал выделено красным цветом, затем Я зануда — черное, а затем, и вправду так и думал. выделено опять красным.
 
Подумайте: если в Mono кавычки помечают начало и конец текста, то
 
Подумайте: если в Mono кавычки помечают начало и конец текста, то
 
как он сможет уловить разницу между кавычкой, которую вы хотите
 
как он сможет уловить разницу между кавычкой, которую вы хотите
 
вывести, и кавычкой, означающей конец текста? Да никак. Поэтому он
 
вывести, и кавычкой, означающей конец текста? Да никак. Поэтому он
сочтет, что выводимая строка текста –’Затем Эффи сказал’, а следующая часть, ‘Я зануда’, уже код C#. Mono это не понравится.
+
сочтет, что выводимая строка текста — ’Затем Эффи сказал’, а следующая часть, ‘Я зануда’, — уже код C#. Mono это не понравится.
  
 
Если вы хотите включить кавычки в ваш текст, предупредите
 
Если вы хотите включить кавычки в ваш текст, предупредите
Строка 291: Строка 291:
 
например, так:
 
например, так:
 
<source lang="csharp">
 
<source lang="csharp">
Console.WriteLine("Фонарный столб он кулаком "\n);
+
Console.Write("Фонарный столб он кулаком \n");
Console.WriteLine("Ударил что есть сил,"\n);
+
Console.Write("Ударил что есть сил,\n");
Console.WriteLine("И гордо заявил потом,"\n);
+
Console.Write("И гордо заявил потом,\n");
Console.WriteLine("Что призрака сразил."\n);
+
Console.Write("Что призрака сразил.\n");
 
</source>
 
</source>
  
Строка 300: Строка 300:
 
Взгляните на часть string args[] в методе Main. Каждое определение метода должно заканчиваться открывающей и закрывающей
 
Взгляните на часть string args[] в методе Main. Каждое определение метода должно заканчиваться открывающей и закрывающей
 
круглой скобкой. Между этими скобками мы можем определить, какие
 
круглой скобкой. Между этими скобками мы можем определить, какие
данные – если надо – мы будем передавать методу. Вспомним пример
+
данные — если надо — мы будем передавать методу. Вспомним пример
 
с машиной: как метод ChangeGear узнает, на какую передачу надо переключиться? Ответ очевиден: указать ему номер передачи. Вот это и есть
 
с машиной: как метод ChangeGear узнает, на какую передачу надо переключиться? Ответ очевиден: указать ему номер передачи. Вот это и есть
 
параметр. Мы определяем параметры, которые должен получать наш
 
параметр. Мы определяем параметры, которые должен получать наш
Строка 312: Строка 312:
 
скобки). Строкой называется просто текст: любая последовательность
 
скобки). Строкой называется просто текст: любая последовательность
 
символов, начинающаяся и заканчивающаяся символом двойной
 
символов, начинающаяся и заканчивающаяся символом двойной
кавычки. То есть “Hello World!” – это строка. Массив – это группа объектов одного типа, а значит, параметр args может быть пустым, может
+
кавычки. То есть «Hello World!» — это строка. Массив — это группа объектов одного типа, а значит, параметр args может быть пустым, может
содержать одну строку или 100 строк – все зависит того, что передается в метод при его вызове.
+
содержать одну строку или 100 строк — все зависит того, что передается в метод при его вызове.
  
 
Если вы программируете впервые, то, возможно, не поняли того,
 
Если вы программируете впервые, то, возможно, не поняли того,
 
что я сказал, поэтому я очерчу проблему: где мы в действительности
 
что я сказал, поэтому я очерчу проблему: где мы в действительности
 
вызываем метод Main? Ответ: мы его НЕ вызываем! Однако же ‘Hello
 
вызываем метод Main? Ответ: мы его НЕ вызываем! Однако же ‘Hello
World!’ выводится на экран? Дело в том, что метод ‘Main’ – особый
+
World!’ выводится на экран? Дело в том, что метод ‘Main’ — особый
 
метод. Когда запускается наша программа, Mono автоматически ищет
 
метод. Когда запускается наша программа, Mono автоматически ищет
 
и вызывает метод Main, а также передает ему параметры командной
 
и вызывает метод Main, а также передает ему параметры командной
Строка 341: Строка 341:
 
|Ширина=200px}}
 
|Ширина=200px}}
 
Создайте новый проект (выберите File > New Project > C# > Console
 
Создайте новый проект (выберите File > New Project > C# > Console
Project и уберите там дурацкую галочку) и назовите его “ParamPrint”.
+
Project и уберите там дурацкую галочку) и назовите его «ParamPrint».
 
Программа будет принимать один входной параметр командной строки
 
Программа будет принимать один входной параметр командной строки
 
и выводить его вместе со строкой ‘Hello World!’.
 
и выводить его вместе со строкой ‘Hello World!’.
Строка 348: Строка 348:
 
WriteLine на следующую строку:
 
WriteLine на следующую строку:
 
<source lang="csharp">Console.WriteLine("Hello World: " + args[0]);</source>
 
<source lang="csharp">Console.WriteLine("Hello World: " + args[0]);</source>
Так как переменная args – это массив строк, то необходимо сообщить C#, который элемент массива мы хотим вывести. Элементы массива нумеруются, начиная с 0, который обозначает первый элемент, 1 – второй элемент и т.д.; чтобы напечатать первый переданный параметр,
+
Так как переменная args — это массив строк, то необходимо сообщить C#, который элемент массива мы хотим вывести. Элементы массива нумеруются, начиная с 0, который обозначает первый элемент, 1 — второй элемент и т. д.; чтобы напечатать первый переданный параметр,
 
необходимо написать args[0]. Знак + нужен для соединения строки
 
необходимо написать args[0]. Знак + нужен для соединения строки
“Hello World!и первого параметра.
+
«Hello World!» и первого параметра.
  
 
{{Врезка
 
{{Врезка
Строка 362: Строка 362:
 
Если вы теперь нажмете F5, то увидите нечто страшное: вместо вывода сообщения, как в предыдущем примере, приложение
 
Если вы теперь нажмете F5, то увидите нечто страшное: вместо вывода сообщения, как в предыдущем примере, приложение
 
MonoDevelop выдаст что-то вроде ‘Unhandled exception: System.Index OutOfRangeException’ [Необработанное исключение: Выход за границы массива]. Так получилось потому, что args[0] ссылается на первый передаваемый в программу параметр, а в действительности мы
 
MonoDevelop выдаст что-то вроде ‘Unhandled exception: System.Index OutOfRangeException’ [Необработанное исключение: Выход за границы массива]. Так получилось потому, что args[0] ссылается на первый передаваемый в программу параметр, а в действительности мы
его не передаем – ведь MonoDevelop просто запустил программу без
+
его не передаем — ведь MonoDevelop просто запустил программу без
 
параметров.
 
параметров.
  
Строка 378: Строка 378:
 
на экран выведется только ‘Hello World: Linux’. Строка не выведется
 
на экран выведется только ‘Hello World: Linux’. Строка не выведется
 
целиком, так как каждый параметр считается отдельной строкой в массиве args, а параметры разделяются пробелом. В приведенном выше
 
целиком, так как каждый параметр считается отдельной строкой в массиве args, а параметры разделяются пробелом. В приведенном выше
примере Linux – это args[0], а Format – это args[1]. Если хотите вывести
+
примере Linux — это args[0], а Format — это args[1]. Если хотите вывести
 
всю строку, то наберите команду вот так:
 
всю строку, то наберите команду вот так:
 
<source lang="bash">mono ParamPrint.exe "Linux Format"</source>
 
<source lang="bash">mono ParamPrint.exe "Linux Format"</source>
 
Кавычки сообщают Bash (это программа-оболочка), что Linux
 
Кавычки сообщают Bash (это программа-оболочка), что Linux
Format – это один параметр.
+
Format — это один параметр.
  
 
=== Пока все хорошо ===
 
=== Пока все хорошо ===
 
На этом уроке было дано введение в MonoDevelop, вы узнали о пространствах имен и методах, какова структура кода C# и как выводить
 
На этом уроке было дано введение в MonoDevelop, вы узнали о пространствах имен и методах, какова структура кода C# и как выводить
 
сообщения на экран. Также мы затронули объектно-ориентированное
 
сообщения на экран. Также мы затронули объектно-ориентированное
программирование, довольно сложный для изучения вопрос. Но главное – вы написали первую программу. Она не делает ничего полезного,
+
программирование, довольно сложный для изучения вопрос. Но главное — вы написали первую программу. Она не делает ничего полезного,
 
но научила вас, как приступить к программированию. В следующий раз
 
но научила вас, как приступить к программированию. В следующий раз
 
мы рассмотрим задачи посерьезнее, тогда-то и начнется веселье.
 
мы рассмотрим задачи посерьезнее, тогда-то и начнется веселье.

Текущая версия на 17:30, 14 марта 2010

Содержание

[править] 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# и как выводить сообщения на экран. Также мы затронули объектно-ориентированное программирование, довольно сложный для изучения вопрос. Но главное — вы написали первую программу. Она не делает ничего полезного, но научила вас, как приступить к программированию. В следующий раз мы рассмотрим задачи посерьезнее, тогда-то и начнется веселье.

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