Достойная замена Visual Studio .NET. SharpDevelop
Достойная замена Visual Studio .NET. SharpDevelop
Если раньше Visual Studio .NET была единственной средой программирования для написания .NET-приложений, то в настоящее время появилось достаточное количество альтернативных разработок. Я буду останавливаться лишь на полноценных IDE, т.к. продвинутые редакторы, обладающие лишь функцией подсветки синтаксиса, в данном случае просто неконкурентоспособны.
Скачиваем
Первым ко мне на тестирование попал SharpDevelop. Программа распространяется с открытым исходным кодом по лицензии GPL. На сайте www.icsharpcode.net, кроме собственно #develop, есть ссылки и на другие open-source разработки. Одной из них является #ziplib. Это библиотека для работы с архивами gzip/zip, tar, bzip2. В доступный для скачивания архив входит документация и несколько примеров. Используя эту библиотеку, можно научить свое приложение работать с архивами различных форматов на манер того же Total Commander. Но сейчас речь не об этом.
Зайдем в раздел Downloads (www.icsharpcode.net/OpenSource/SD/Download). Здесь расположены ссылки на исходники и на установщик. Я решил скачать и то, и другое. Перед закачкой предлагается выбрать зеркало. В этом случае выбор, на мой взгляд, должен исходить из особенностей вашего провайдера. Так, по заявлениям Белтелекома, шлюз в Европу несколько шире, чем в Северную Америку, хотя еще не факт, что это каким-то образом отразится на скорости выкачивания архива. Я выбрал Бельгию — и примерно через час у меня на винчестере уже были исходники и установщик SharpDevelop.
Устанавливаем
Я сразу принялся за установку. На компьютере не должна быть установлена предыдущая версия программы, иначе установщик просто не запустится. Ход установки стандартен. Сперва нам предлагают ознакомиться с GNU General Public License. Если хотите установить SharpDevelop, то жмите I Agree. Дальше выбираем каталог установки. Непродолжительное время в списке пробегают строчки, отображающие текущее действие. Затем появляется консоль, из текста которой можно узнать, что сейчас собирается справка SharpDevelop, .NET Framework Reference, а также DirectX9, если таковая установлена на вашем компьютере. Наконец, установка завершена. Остается нажать кнопку Finish, и если был отмечен флажок Run #develop, то программа запустится автоматически.
Первый запуск
После запуска приложения нас встречает мастер, предлагающий настроить автозавершение кода. Intellisense работает только в C# и VB .NET. На остальных языках, поддерживаемых #develop, придется писать "вслепую". С этого момента весь текст будет на русском, что уже само по себе приятно.
На данном этапе нам необходимо выбрать, будем ли мы использовать уже существующую базу данных автозавершения кода или хотим создать новую. Можно вообще отказаться от этого удовольствия, но в этом случае мастер автоматически предложит свои услуги при следующем запуске среды разработки. Если раньше на вашем компьютере не был установлен SharpDevelop, значит, и никакой базы данных у вас нет. Поэтому остаются два последних варианта. Я бы вам порекомендовал сразу создать базу данных, чтобы чувствовать себя по крайней мере не хуже, чем в VS .NET, к тому же этот процесс непродолжительный.
Переходим на следующую страницу. Здесь нам предоставляется возможность указать путь к будущей базе данных. Можно задать месторасположение вручную либо воспользоваться двумя предустановленными вариантами — папки SharpDevelop и Application Data. Сам я пошел по первому пути. Во всяком случае, при переустановке #develop или даже всей системы целиком данные автозавершения останутся в целости и сохранности. Жмем Далее.
Теперь от создания базы данных нас отделяет всего лишь одно нажатие кнопки. Продолжительность этого процесса зависит от объема оперативной памяти. Если у вас она меньше 256 Mb, то должна уйти уйма времени (во всяком случае, так утверждает мастер). На Pentium 4 2.6 GHz с 1 Gb оперативки (видимо, на такой машине сидит главный разработчик, Майк Крюгер) на все про все требуется меньше 90 с. Так и есть: не прошло и двух минут, как база данных была успешно создана.
В целях экономии памяти SharpDevelop идет на перезагрузку. После создания базы процесс SharpDevelop.exe отожрал 79.476 Kb оперативной памяти. Как ни странно, по прошествии времени сборщик мусора так и не соизволил убрать весь этот хлам. В результате, после очередной загрузки, программа стала занимать немногим более 39 Mb памяти, что для .NET можно считать вполне приемлемым. (При работе с солидным проектом 80 Mb вовсе не является пределом, как и 100 Mb…)
Начинаем работать
После повторной загрузки появляется диалоговое окно Совет дня. От подобных вещей я обычно сразу отказываюсь (а заодно снимаю галочку Показывать при запуске) и иду дальше, но на этот раз решил почитать — меня привлек совет: "Вам следует следить за новыми версиями SharpDevelop и рассказывать всем своим друзьям, как классно создавать в нем программы на C#!" Решив посмотреть, что еще интересненького там есть, с удивлением заметил, что советов на каждый день всего лишь два. Ну да ладно, все равно я бы их не читал.
Появляется Стартовая страница а-ля VS StartPage. Предоставляю вам возможность самим ознакомиться с ее содержимым. А сейчас лучше создадим новое объединение (или combine, аналог solution в VS .NET). Я решил не изменять традициям и в качестве первого приложения создал всем известный HelloWorld. Жму на кнопку Новое объединение. Появляется диалоговое окно выбора типа проекта. Заодно давайте посмотрим, что нам может предложить SharpDevelop в виде готовых шаблонов для C#. Это стандартные консольное приложение и приложение WindowsForms, сервис, библиотеки классов и контролов, пустой проект. Вроде ничего необычного. Но остался один не упомянутый мной элемент списка. Это приложение Direct3D. При создании проекта такого типа в ваш код сразу добавится базовая логика. Проверить ее работу я не смог, так как у меня не установлен DirectX 9 SDK: компилятор ругается на отсутствие библиотек. Также в списке шаблонов напрочь отсутствует что-либо связанное с портативными и web-устройствами, но разработчики обещают в скором времени добавить поддержку ASP .NET. В категории Visual Basic .NET тот же набор шаблонов, а вот VC++ обидели — консоль, пустой проект и WinForms.
Сразу обращает на себя внимание категория ILAsm. Тут выбор еще меньше: только консоль. Но зато в VS .NET об этом нет и упоминания. А здесь можно сразу писать на IL с подсветкой синтаксиса и запускать программу на выполнение! Если бы еще и отладчик был… Раздел Setup может похвастаться одним пунктом — Installer, чего на первых порах более чем достаточно.
Плавно переходим к созданию вышеупомянутого консольного приложения. В заготовку автоматически добавился код, реализующий нехитрую функциональность HelloWorld. Поначалу я был удивлен, что программа сама распознала имя проекта и подхватила инициативу. Но не тут-то было: оказалось, что какое бы ни было имя, в метод Main автоматически добавляется Console.WriteLine("Hello, world!");, что причиняет некоторые неудобства — приходится каждый раз удалять ненужную строчку. "Отучить" SharpDevelop делать то, чего не просят, можно, подредактировав шаблон проекта консольного приложения. Файлы шаблонов для C# можно найти в папке /data/templates/project/CSharp/. Они имеют формат XML (даром что расширение у них другое — xpt), к тому же вставляемый код написан прямым текстом, поэтому разобраться в структуре файла не составит труда. При желании можно заставить программу автоматически создавать файл с определенным содержанием и помещать его в соответствующую папку на диске. Также в начало каждого созданного файла вставляется шапка, текст которой можно редактировать средствами самой среды разработки.
Примечательно, что запуская консольную программу из SharpDevelop, не нужно вставлять Console.ReadLine();, чтобы успеть увидеть результат работы. Программа сама выдает строчку Для продолжения нажмите любую клавишу... и мирно ждет вашего ответа. Такое поведение регулируется галочкой Параметры проекта > Конфигурации > Debug (Release) > Вывод > Пауза после завершения консольной программы.
Впечатления от использования
Интерфейс #develop во многом напоминает Visual Studio .NET: как режим TabbedMDI, так и пристыковывающиеся окна. Иногда логика окон начинает глючить, в результате чего, раз спрятавшись, они никак не хотят показываться обратно. Приходится перезагружать программу. У меня подобное наблюдалось с окнами Список задач и Вывод. Но стоит отметить, что SharpDevelop абсолютно корректно упорядочивает auto-hiding окна. Т.е. в каком порядке в группе они находятся в плавающем режиме, в таком они будут находиться и на узенькой панельке на краю формы в режиме auto-hide. В Visual Studio .NET почему-то этот процесс не контролируется, и нельзя узнать, как окна соберутся в следующий раз после поочередной смены режимов auto-hide/dock/auto-hide. Набор самих окон практически идентичен. Я остановлюсь лишь на некоторых интересных моментах.
Проекты. Это окно по своему назначению аналогично Solution Explorer в VS .NET, но немного отличается по функциональности. Однажды я решил исключить из объединения ставший ненужным мне файл: щелкнул по нему правой кнопкой мыши, но привычного пункта Exclude From Project не нашел. Тогда я нажал Удалить.
В ответ #develop выдал сообщение с тремя кнопками, две из которых были с текстом Удалить. При нажатии на первую из них происходит просто исключение файла из проекта, при нажатии на вторую — физическое удаление файла с диска. Появилась папка Файлы ресурсов, где можно в наглядной форме просмотреть и в случае чего подправить ресурсы вашего приложения.
Достоинством (или недостатком) организации иерархии проектов является тот факт, что в SharpDevelop главное объединение может содержать в свою очередь еще несколько объединений. Недостатком потому, что при экспорте проектов в формат Visual Studio 2003, где, как вы знаете, возможно существование лишь одного главного solution, возникают проблемы. В качестве эксперимента я решил экспортировать проект самого SharpDevelop. Главное объединение SharpDevelop включает еще ряд объединений, содержащих по несколько проектов, которые обладают своей иерархией файлов. В результате некоторые папки с файлами стали недоступны, а также какие-то данные, записанные в файл solution'a, не читались. Скорее всего, это поправимо, но я, честно говоря, пока еще не разбирался. Можно попробовать экспортировать проекты по одному и собирать их в одном solution'e.
Окно Инструменты обладает несколькими закладками. Первая — Таблица ASCII. Для конкретного символа приведен код в десятичном и в шестнадцатеричном представлении. В повседневной работе .NET-программиста данный список применения не находит, поэтому будем считать, что это просто бонус от разработчиков. Следующая закладка — Тэги документации C#. Если короткие тэги вроде <c> быстрее набрать вручную, то вот вставка чего-то вроде list-bullet существенно сэкономит время. Дальше идут Лицензии. Доступен текст лицензий BSD, GPL, LGPL, а также шапки GPL и LGPL. Если вы надумаете вставить в свой код текст выбранной лицензии, просто перетащите необходимый пункт меню на редактор кода — и все дела. SharpDevelop не добавляет контролы на форму при двойном клике по выбранному элементу управления — приходится перетаскивать.
Файлы. Данное окно содержит древовидную структуру вашего жесткого диска. Жалко, что файлы открываются только в текстовом виде. А я уже было понадеялся, что можно будет читать статьи в формате html, не покидая пределов самой программы (встроенный браузер прилагается).
Тесты. Функциональность тестов в SharpDevelop реализована силами библиотеки nunit.framework.dll. NUnit представляет собой самостоятельную среду для тестирования сборок. Особого смысла в тестах я не вижу, т.к. они тоже могут трапаться, как и сам тестируемый код. Отладчика им все равно не заменить.
В SharpDevelop интегрирован и инструмент для создания документации из XML файла — NDoc. Присутствует возможность задавать формат справки на выходе. Среди прочих присутствует и MSDN.
Переключение между Дизайнером и Редактором кода осуществляется посредством табов. В VS 2003 эти окна до сих пор живут сами по себе. У каждого подхода есть свои плюсы и минусы, но я думаю, что решение от Майкрософт является все-таки более оптимальным. Объясню почему. Раздельное существование редактора и дизайнера позволяет гибко изменять наличие последнего. Попробуйте средствами VS .NET создать приложение Windows Forms, а затем в редакторе кода стереть оставшуюся часть строки после объявления класса, т.е. удалить : System.Windows.Forms.Form. В окне Solution Explorer значок формы сразу сменится значком обычного класса, и кнопка переключения в режим дизайнера исчезнет. Если восстановить строчку обратно, то все вернется на свои места. В SharpDevelop, выбрав шаблон Windows Forms, мы уже обречены на вечное присутствие дизайнера (хотя нет, если перезагрузить SharpDevelop, то все станет на свои места). Конечно, можно удалить файл формы, а затем добавить просто класс, но это уже полумеры.
Раздельные окна дизайнера и редактора удобны и в повседневной жизни. Поначалу этот факт неочевиден, но, поработав в SharpDevelop, я заметил, что совершаю много лишних движений. Дело обстояло примерно так. У меня было открыто несколько окон, в частности, главная форма и еще несколько классов. Я писал "просто-класс" (да, наверное, в #develop все-таки нужно провести границу между "просто-классом" и классом-наследником Form), и тут мне потребовалось изменить объявление экземпляра класса в главной форме, так как я немного изменил сигнатуру его конструктора. Но в главной форме был активным режим Дизайнер. Мне пришлось переключаться в редактор кода. Затем я пошел обратно дописывать свой класс. Реализовав его, я решил бросить на форму кнопку и текстбокс, чтобы протестировать работу класса. На этот раз режим главной формы опять оказался некстати — мне пришлось переключаться в Дизайнер. А в VS я бы просто переключался между окнами без всяких проблем. С другой стороны, в VS .NET дизайнер вечно теряется в куче других окон. Его, конечно, можно расположить рядом с редактором, но надолго ли? В общем, однозначно отдать предпочтение в этом плане какой-либо среде разработки сложно, но VS .NET набрала больше баллов.
Расположение вкладок по умолчанию мне не понравилось. Поэтому я сразу же расположил их так, как до этого привык в VS .NET. Цветастость редактора мне тоже пришлась не по вкусу. Хорошо, что разработчики предусмотрели вариант с подсветкой на манер VS .NET (Режим файла > VS-C#). К сожалению, при следующем запуске выставляется прежняя подсветка — C#. Кстати, разработчики просят ответить на один вопрос: "Хотим ли мы еще большей цветастости, или нам вполне хватает нескольких цветов VS?" В этом же меню можно посмотреть и весь список поддерживаемых режимов подсветки. Среди них есть и один довольно интересный — C64C#. При этом поле для редактирования становится синим, а ключевые слова — белыми и желтыми. Сразу вспомнилось, как еще в школе за Искрой я писал свои первые программы на Turbo Pascal.
Если в VS .NET щелкнуть правой кнопкой мыши по панелям инструментов, то перед нами откроется все многообразие панелей инструментов. У себя я их вообще отключил — осталось только меню. Для часто используемых функций я запомнил сочетания клавиш, а ради всех остальных я не хочу терять целый сантиметр рабочего пространства. В SharpDevelop панель инструментов всего одна, причем не модифицируемая и не отключаемая. Хотя это и не причиняет больших неудобств: все необходимое присутствует.
Посмотрев на окно Базы данных, я решил посредством дизайнера установить соединение с одной моей базой данных и связать ее с dataSet'ом, а затем отобразить содержимое в dataGrid. Если к базе данных я подключился без особых проблем, то вот как связать ее с dataSet'ом, до меня не дошло. Возможно, у вас это получится лучше, чем у меня. Во всяком случае, через код я проделал поставленную задачу на ура.
Функциональность редактора
Нельзя сказать, что Intellisense в SharpDevelop работает безотказно. В некоторых случаях не выводится список доступных классов, свойств и методов. В частности, после слова as. Члены интерфейсов приходится также вбивать вручную. Но не будем сильно упрекать в этом #develop. И тому есть две причины. Во-первых, давайте вспомним, как VS 7.0 не хотела выводить подсказки после приведения типа (например, после конструкции ctrl as Button) и добавлять члены интерфейсов после указания, что класс реализует такой-то интерфейс. Во-вторых, VS до сих пор не показывает список доступных пространств имен после слова using. А SharpDevelop это умеет. Правда, иногда несколько кривовато. В одном своем тестовом приложении я реализовал TVPattern. Поместил его в пространство имен Nesterov.TVPattern (как советует Microsoft, глобальным пространством имен должно быть имя компании или разработчика), хотя правильней, наверное, было бы поместить его в пространство GI.TVPattern:-). Остальной же код у меня жил в пространстве Nesterov.Test. Чтобы каждый раз не вводить, скажем, TVPattern.IhandleEvent, я решил описать пространство имен TVPattern следующим образом: using Nesterov.TVPattern. Как только я набрал точку после Nesterov, отобразился, как и должно быть, список допустимых пространств имен. Сюда входили Test, TVPattern и некий TVP. Подумав немного, я определенно решил, что это либо глюк, либо какая-то неизвестная мне возможность. В любом случае решил попробовать, что это мне даст. Ничего! Компилятор выдает ошибку, а SharpDevelop не выводит список методов и свойств.
Если в VS для того, чтобы увидеть подсказку о предназначении класса, метода или свойства необходимо подвести курсор к соответствующей строчке, то в SharpDevelop автоматически отображается как список возможных вариантов, так и подсказка по выбранному в данный момент пункту. Здесь SharpDevelop мне нравится больше. После длительной работы в VS 2003 у меня сложилось такое впечатление, что в ее редакторе ведется статистика наиболее часто используемых функциональных членов, и в следующий раз они подсвечиваются первыми.
Если вам когда-нибудь доводилось писать на VB .NET, то наверняка знаете, как прекрасно там организована работа с кодом — не в пример лучше, чем в C#. Как только я напишу, скажем, Me.ButtonOk.FlatStyle =, сразу появится список, содержащий все члены перечисления System.Windows.Forms.FlatStyle. Поверьте, это сильно ускоряет работу. К тому же если в C# нужно активно работать с клавишей Shift, то в VB .NET пиши все с маленькой буквы — Intellisense сам поймет, о чем вы. Но это уже о вопросе немного другого сорта.
Также у VS .NET лучше организована работа по выявлению ошибок еще на этапе набора текста. Т.е. если я, скажем, в private-методе объявлю private-поле, то VS .NET сразу отреагирует. SharpDevelop спокойно проглотит, но зато после неуспешной компиляции выдаст целый букет ошибок, которые никак, прямо или косвенно, не указывают на первопричину происходящего (#develop, естественно, в этом не виноват: он всего лишь отображает сообщения об ошибках, полученные от компилятора).
С другой стороны, Visual Studio .NET навязывает свое собственное, к слову сказать, неправильное, форматирование кода. SharpDevelop в этом плане более демократичен, к тому же сам закрывает фигурные скобки, но зато не выводит подсказки к уже набранному тексту, да и отступы для вложений не увеличивает при появлении более глобального пространства имен. Обращает на себя внимание подсветка фигурных скобок. Т.е. когда курсор находится рядом с закрывающей скобкой, подсвечивается и соответствующая ей открывающая. Надо сказать, очень удобно, особенно при удалении кусков кода — не нужно "прицеливаться" и смотреть, до каких пор еще можно удалять закрывающие фигурные скобки.
SharpDevelop обладает рядом довольно интересных функций. Некоторые из них я готов реализовать в виде AddIns для Visual Studio .NET, весь необходимый исходный код уже имеется, так что дело за малым. Большинство из них расположены в меню Инструменты. Так, Выбор цвета… вызывает ColorDialog, где в наглядной форме можно выбрать необходимый цвет. Его код или название вставляется в текущую позицию курсора.
Иногда на форуме GotDotNet.ru проскакивают сообщения, где люди просят перевести кусок кода с VB на C# или наоборот. SharpDevelop не даст вам пропасть. Просто нужно набрать текст программы на вашем "родном" языке, а затем выбрать пункт Перевести буфер из C# в VB .NET (из VB .NET в C#), и откроется новое окно, где отобразится сгенерированный код, готовый к употреблению.
Мастер сообщений призван визуализировать процесс создания MessageBox'ов. Выбор данного пункта меню приводит к появлению окна мастера. Здесь можно задать заголовок будущего сообщения и текст, указать, какие кнопки и иконки должны присутствовать в сообщении, а также выбрать кнопку по умолчанию. Есть и предпросмотр. После нажатия кнопки Готово сгенерированный текст вставляется в текущую позицию курсора. Думаю, эта функция будет полезна лишь на первых порах изучения C# (да и VB .NET тоже), т.к. поможет научиться наглядно представлять, какой эффект дают те или иные значения параметров. Сам же я мастером не пользуюсь — быстрее набрать с клавиатуры, да и за мышкой лень руку тянуть.
Оригинально разработчики подошли к вопросу вставки кода по шаблону. При нажатии Ctrl-J появляется ListBox, из которого можно выбрать готовые куски кода для вставки. В списке можно обнаружить конструкции if, if/else if, try, try/catch и другие. Особенно порадовало то, что существует возможность удалять невостребованные элементы списка, а также добавлять свои. В эту же категорию можно отнести и Автоматическую кодогенерацию. Эта функция позволяет только с помощью мыши создавать свойства (с различным набором акцессоров), конструкторы, а также перегружаемые методы. Понравилось, что можно выбрать сразу несколько элементов из списка, т.е. можно за раз сгенерировать 5 различных перегрузок. Диалоговое окно автогенерации появляется в позиции курсора, но никак не проверяет, поместится ли его содержимое на экране. ( См. рис. вверху.) Иногда нижняя часть становится недоступной для просмотра, и приходится прокручивать текст вниз, чтобы увидеть содержимое окна полностью. При выборе пункта меню Краткая XML-документация появляется окошко, где можно увидеть, как та или иная подсказка будет интерпретирована Intellisense (работает, когда курсор установлен на XML-комментариях, что, в общем-то, правильно).
Выводы
SharpDevelop представляет из себя весьма достойный и не менее интересный продукт. Реализовано много оригинальных функций, аналогов которых в VS .NET не оказалось. Остается только восхититься, что в достаточно маленьком объеме реализована такая серьезная функциональность. С использованием SharpDevelop действительно можно разрабатывать программы. Огорчает отсутствие отладчика, что осложняет весь процесс проектирования (и именно поэтому #develop пока не сможет заменить Visual Studio 2003), но он обязательно появится. Я же теперь с уверенностью буду рассказывать всем своим друзьям, что в SharpDevelop создавать программы на C# действительно классно!
Продолжение следует
Если раньше Visual Studio .NET была единственной средой программирования для написания .NET-приложений, то в настоящее время появилось достаточное количество альтернативных разработок. Я буду останавливаться лишь на полноценных IDE, т.к. продвинутые редакторы, обладающие лишь функцией подсветки синтаксиса, в данном случае просто неконкурентоспособны.
Скачиваем
Первым ко мне на тестирование попал SharpDevelop. Программа распространяется с открытым исходным кодом по лицензии GPL. На сайте www.icsharpcode.net, кроме собственно #develop, есть ссылки и на другие open-source разработки. Одной из них является #ziplib. Это библиотека для работы с архивами gzip/zip, tar, bzip2. В доступный для скачивания архив входит документация и несколько примеров. Используя эту библиотеку, можно научить свое приложение работать с архивами различных форматов на манер того же Total Commander. Но сейчас речь не об этом.
Зайдем в раздел Downloads (www.icsharpcode.net/OpenSource/SD/Download). Здесь расположены ссылки на исходники и на установщик. Я решил скачать и то, и другое. Перед закачкой предлагается выбрать зеркало. В этом случае выбор, на мой взгляд, должен исходить из особенностей вашего провайдера. Так, по заявлениям Белтелекома, шлюз в Европу несколько шире, чем в Северную Америку, хотя еще не факт, что это каким-то образом отразится на скорости выкачивания архива. Я выбрал Бельгию — и примерно через час у меня на винчестере уже были исходники и установщик SharpDevelop.
Устанавливаем
Я сразу принялся за установку. На компьютере не должна быть установлена предыдущая версия программы, иначе установщик просто не запустится. Ход установки стандартен. Сперва нам предлагают ознакомиться с GNU General Public License. Если хотите установить SharpDevelop, то жмите I Agree. Дальше выбираем каталог установки. Непродолжительное время в списке пробегают строчки, отображающие текущее действие. Затем появляется консоль, из текста которой можно узнать, что сейчас собирается справка SharpDevelop, .NET Framework Reference, а также DirectX9, если таковая установлена на вашем компьютере. Наконец, установка завершена. Остается нажать кнопку Finish, и если был отмечен флажок Run #develop, то программа запустится автоматически.
Первый запуск
После запуска приложения нас встречает мастер, предлагающий настроить автозавершение кода. Intellisense работает только в C# и VB .NET. На остальных языках, поддерживаемых #develop, придется писать "вслепую". С этого момента весь текст будет на русском, что уже само по себе приятно.
На данном этапе нам необходимо выбрать, будем ли мы использовать уже существующую базу данных автозавершения кода или хотим создать новую. Можно вообще отказаться от этого удовольствия, но в этом случае мастер автоматически предложит свои услуги при следующем запуске среды разработки. Если раньше на вашем компьютере не был установлен SharpDevelop, значит, и никакой базы данных у вас нет. Поэтому остаются два последних варианта. Я бы вам порекомендовал сразу создать базу данных, чтобы чувствовать себя по крайней мере не хуже, чем в VS .NET, к тому же этот процесс непродолжительный.
Переходим на следующую страницу. Здесь нам предоставляется возможность указать путь к будущей базе данных. Можно задать месторасположение вручную либо воспользоваться двумя предустановленными вариантами — папки SharpDevelop и Application Data. Сам я пошел по первому пути. Во всяком случае, при переустановке #develop или даже всей системы целиком данные автозавершения останутся в целости и сохранности. Жмем Далее.
Теперь от создания базы данных нас отделяет всего лишь одно нажатие кнопки. Продолжительность этого процесса зависит от объема оперативной памяти. Если у вас она меньше 256 Mb, то должна уйти уйма времени (во всяком случае, так утверждает мастер). На Pentium 4 2.6 GHz с 1 Gb оперативки (видимо, на такой машине сидит главный разработчик, Майк Крюгер) на все про все требуется меньше 90 с. Так и есть: не прошло и двух минут, как база данных была успешно создана.
В целях экономии памяти SharpDevelop идет на перезагрузку. После создания базы процесс SharpDevelop.exe отожрал 79.476 Kb оперативной памяти. Как ни странно, по прошествии времени сборщик мусора так и не соизволил убрать весь этот хлам. В результате, после очередной загрузки, программа стала занимать немногим более 39 Mb памяти, что для .NET можно считать вполне приемлемым. (При работе с солидным проектом 80 Mb вовсе не является пределом, как и 100 Mb…)
Начинаем работать
После повторной загрузки появляется диалоговое окно Совет дня. От подобных вещей я обычно сразу отказываюсь (а заодно снимаю галочку Показывать при запуске) и иду дальше, но на этот раз решил почитать — меня привлек совет: "Вам следует следить за новыми версиями SharpDevelop и рассказывать всем своим друзьям, как классно создавать в нем программы на C#!" Решив посмотреть, что еще интересненького там есть, с удивлением заметил, что советов на каждый день всего лишь два. Ну да ладно, все равно я бы их не читал.
Появляется Стартовая страница а-ля VS StartPage. Предоставляю вам возможность самим ознакомиться с ее содержимым. А сейчас лучше создадим новое объединение (или combine, аналог solution в VS .NET). Я решил не изменять традициям и в качестве первого приложения создал всем известный HelloWorld. Жму на кнопку Новое объединение. Появляется диалоговое окно выбора типа проекта. Заодно давайте посмотрим, что нам может предложить SharpDevelop в виде готовых шаблонов для C#. Это стандартные консольное приложение и приложение WindowsForms, сервис, библиотеки классов и контролов, пустой проект. Вроде ничего необычного. Но остался один не упомянутый мной элемент списка. Это приложение Direct3D. При создании проекта такого типа в ваш код сразу добавится базовая логика. Проверить ее работу я не смог, так как у меня не установлен DirectX 9 SDK: компилятор ругается на отсутствие библиотек. Также в списке шаблонов напрочь отсутствует что-либо связанное с портативными и web-устройствами, но разработчики обещают в скором времени добавить поддержку ASP .NET. В категории Visual Basic .NET тот же набор шаблонов, а вот VC++ обидели — консоль, пустой проект и WinForms.
Сразу обращает на себя внимание категория ILAsm. Тут выбор еще меньше: только консоль. Но зато в VS .NET об этом нет и упоминания. А здесь можно сразу писать на IL с подсветкой синтаксиса и запускать программу на выполнение! Если бы еще и отладчик был… Раздел Setup может похвастаться одним пунктом — Installer, чего на первых порах более чем достаточно.
Плавно переходим к созданию вышеупомянутого консольного приложения. В заготовку автоматически добавился код, реализующий нехитрую функциональность HelloWorld. Поначалу я был удивлен, что программа сама распознала имя проекта и подхватила инициативу. Но не тут-то было: оказалось, что какое бы ни было имя, в метод Main автоматически добавляется Console.WriteLine("Hello, world!");, что причиняет некоторые неудобства — приходится каждый раз удалять ненужную строчку. "Отучить" SharpDevelop делать то, чего не просят, можно, подредактировав шаблон проекта консольного приложения. Файлы шаблонов для C# можно найти в папке /data/templates/project/CSharp/. Они имеют формат XML (даром что расширение у них другое — xpt), к тому же вставляемый код написан прямым текстом, поэтому разобраться в структуре файла не составит труда. При желании можно заставить программу автоматически создавать файл с определенным содержанием и помещать его в соответствующую папку на диске. Также в начало каждого созданного файла вставляется шапка, текст которой можно редактировать средствами самой среды разработки.
Примечательно, что запуская консольную программу из SharpDevelop, не нужно вставлять Console.ReadLine();, чтобы успеть увидеть результат работы. Программа сама выдает строчку Для продолжения нажмите любую клавишу... и мирно ждет вашего ответа. Такое поведение регулируется галочкой Параметры проекта > Конфигурации > Debug (Release) > Вывод > Пауза после завершения консольной программы.
Впечатления от использования
Интерфейс #develop во многом напоминает Visual Studio .NET: как режим TabbedMDI, так и пристыковывающиеся окна. Иногда логика окон начинает глючить, в результате чего, раз спрятавшись, они никак не хотят показываться обратно. Приходится перезагружать программу. У меня подобное наблюдалось с окнами Список задач и Вывод. Но стоит отметить, что SharpDevelop абсолютно корректно упорядочивает auto-hiding окна. Т.е. в каком порядке в группе они находятся в плавающем режиме, в таком они будут находиться и на узенькой панельке на краю формы в режиме auto-hide. В Visual Studio .NET почему-то этот процесс не контролируется, и нельзя узнать, как окна соберутся в следующий раз после поочередной смены режимов auto-hide/dock/auto-hide. Набор самих окон практически идентичен. Я остановлюсь лишь на некоторых интересных моментах.
Проекты. Это окно по своему назначению аналогично Solution Explorer в VS .NET, но немного отличается по функциональности. Однажды я решил исключить из объединения ставший ненужным мне файл: щелкнул по нему правой кнопкой мыши, но привычного пункта Exclude From Project не нашел. Тогда я нажал Удалить.
В ответ #develop выдал сообщение с тремя кнопками, две из которых были с текстом Удалить. При нажатии на первую из них происходит просто исключение файла из проекта, при нажатии на вторую — физическое удаление файла с диска. Появилась папка Файлы ресурсов, где можно в наглядной форме просмотреть и в случае чего подправить ресурсы вашего приложения.
Достоинством (или недостатком) организации иерархии проектов является тот факт, что в SharpDevelop главное объединение может содержать в свою очередь еще несколько объединений. Недостатком потому, что при экспорте проектов в формат Visual Studio 2003, где, как вы знаете, возможно существование лишь одного главного solution, возникают проблемы. В качестве эксперимента я решил экспортировать проект самого SharpDevelop. Главное объединение SharpDevelop включает еще ряд объединений, содержащих по несколько проектов, которые обладают своей иерархией файлов. В результате некоторые папки с файлами стали недоступны, а также какие-то данные, записанные в файл solution'a, не читались. Скорее всего, это поправимо, но я, честно говоря, пока еще не разбирался. Можно попробовать экспортировать проекты по одному и собирать их в одном solution'e.
Окно Инструменты обладает несколькими закладками. Первая — Таблица ASCII. Для конкретного символа приведен код в десятичном и в шестнадцатеричном представлении. В повседневной работе .NET-программиста данный список применения не находит, поэтому будем считать, что это просто бонус от разработчиков. Следующая закладка — Тэги документации C#. Если короткие тэги вроде <c> быстрее набрать вручную, то вот вставка чего-то вроде list-bullet существенно сэкономит время. Дальше идут Лицензии. Доступен текст лицензий BSD, GPL, LGPL, а также шапки GPL и LGPL. Если вы надумаете вставить в свой код текст выбранной лицензии, просто перетащите необходимый пункт меню на редактор кода — и все дела. SharpDevelop не добавляет контролы на форму при двойном клике по выбранному элементу управления — приходится перетаскивать.
Файлы. Данное окно содержит древовидную структуру вашего жесткого диска. Жалко, что файлы открываются только в текстовом виде. А я уже было понадеялся, что можно будет читать статьи в формате html, не покидая пределов самой программы (встроенный браузер прилагается).
Тесты. Функциональность тестов в SharpDevelop реализована силами библиотеки nunit.framework.dll. NUnit представляет собой самостоятельную среду для тестирования сборок. Особого смысла в тестах я не вижу, т.к. они тоже могут трапаться, как и сам тестируемый код. Отладчика им все равно не заменить.
В SharpDevelop интегрирован и инструмент для создания документации из XML файла — NDoc. Присутствует возможность задавать формат справки на выходе. Среди прочих присутствует и MSDN.
Переключение между Дизайнером и Редактором кода осуществляется посредством табов. В VS 2003 эти окна до сих пор живут сами по себе. У каждого подхода есть свои плюсы и минусы, но я думаю, что решение от Майкрософт является все-таки более оптимальным. Объясню почему. Раздельное существование редактора и дизайнера позволяет гибко изменять наличие последнего. Попробуйте средствами VS .NET создать приложение Windows Forms, а затем в редакторе кода стереть оставшуюся часть строки после объявления класса, т.е. удалить : System.Windows.Forms.Form. В окне Solution Explorer значок формы сразу сменится значком обычного класса, и кнопка переключения в режим дизайнера исчезнет. Если восстановить строчку обратно, то все вернется на свои места. В SharpDevelop, выбрав шаблон Windows Forms, мы уже обречены на вечное присутствие дизайнера (хотя нет, если перезагрузить SharpDevelop, то все станет на свои места). Конечно, можно удалить файл формы, а затем добавить просто класс, но это уже полумеры.
Раздельные окна дизайнера и редактора удобны и в повседневной жизни. Поначалу этот факт неочевиден, но, поработав в SharpDevelop, я заметил, что совершаю много лишних движений. Дело обстояло примерно так. У меня было открыто несколько окон, в частности, главная форма и еще несколько классов. Я писал "просто-класс" (да, наверное, в #develop все-таки нужно провести границу между "просто-классом" и классом-наследником Form), и тут мне потребовалось изменить объявление экземпляра класса в главной форме, так как я немного изменил сигнатуру его конструктора. Но в главной форме был активным режим Дизайнер. Мне пришлось переключаться в редактор кода. Затем я пошел обратно дописывать свой класс. Реализовав его, я решил бросить на форму кнопку и текстбокс, чтобы протестировать работу класса. На этот раз режим главной формы опять оказался некстати — мне пришлось переключаться в Дизайнер. А в VS я бы просто переключался между окнами без всяких проблем. С другой стороны, в VS .NET дизайнер вечно теряется в куче других окон. Его, конечно, можно расположить рядом с редактором, но надолго ли? В общем, однозначно отдать предпочтение в этом плане какой-либо среде разработки сложно, но VS .NET набрала больше баллов.
Расположение вкладок по умолчанию мне не понравилось. Поэтому я сразу же расположил их так, как до этого привык в VS .NET. Цветастость редактора мне тоже пришлась не по вкусу. Хорошо, что разработчики предусмотрели вариант с подсветкой на манер VS .NET (Режим файла > VS-C#). К сожалению, при следующем запуске выставляется прежняя подсветка — C#. Кстати, разработчики просят ответить на один вопрос: "Хотим ли мы еще большей цветастости, или нам вполне хватает нескольких цветов VS?" В этом же меню можно посмотреть и весь список поддерживаемых режимов подсветки. Среди них есть и один довольно интересный — C64C#. При этом поле для редактирования становится синим, а ключевые слова — белыми и желтыми. Сразу вспомнилось, как еще в школе за Искрой я писал свои первые программы на Turbo Pascal.
Если в VS .NET щелкнуть правой кнопкой мыши по панелям инструментов, то перед нами откроется все многообразие панелей инструментов. У себя я их вообще отключил — осталось только меню. Для часто используемых функций я запомнил сочетания клавиш, а ради всех остальных я не хочу терять целый сантиметр рабочего пространства. В SharpDevelop панель инструментов всего одна, причем не модифицируемая и не отключаемая. Хотя это и не причиняет больших неудобств: все необходимое присутствует.
Посмотрев на окно Базы данных, я решил посредством дизайнера установить соединение с одной моей базой данных и связать ее с dataSet'ом, а затем отобразить содержимое в dataGrid. Если к базе данных я подключился без особых проблем, то вот как связать ее с dataSet'ом, до меня не дошло. Возможно, у вас это получится лучше, чем у меня. Во всяком случае, через код я проделал поставленную задачу на ура.
Функциональность редактора
Нельзя сказать, что Intellisense в SharpDevelop работает безотказно. В некоторых случаях не выводится список доступных классов, свойств и методов. В частности, после слова as. Члены интерфейсов приходится также вбивать вручную. Но не будем сильно упрекать в этом #develop. И тому есть две причины. Во-первых, давайте вспомним, как VS 7.0 не хотела выводить подсказки после приведения типа (например, после конструкции ctrl as Button) и добавлять члены интерфейсов после указания, что класс реализует такой-то интерфейс. Во-вторых, VS до сих пор не показывает список доступных пространств имен после слова using. А SharpDevelop это умеет. Правда, иногда несколько кривовато. В одном своем тестовом приложении я реализовал TVPattern. Поместил его в пространство имен Nesterov.TVPattern (как советует Microsoft, глобальным пространством имен должно быть имя компании или разработчика), хотя правильней, наверное, было бы поместить его в пространство GI.TVPattern:-). Остальной же код у меня жил в пространстве Nesterov.Test. Чтобы каждый раз не вводить, скажем, TVPattern.IhandleEvent, я решил описать пространство имен TVPattern следующим образом: using Nesterov.TVPattern. Как только я набрал точку после Nesterov, отобразился, как и должно быть, список допустимых пространств имен. Сюда входили Test, TVPattern и некий TVP. Подумав немного, я определенно решил, что это либо глюк, либо какая-то неизвестная мне возможность. В любом случае решил попробовать, что это мне даст. Ничего! Компилятор выдает ошибку, а SharpDevelop не выводит список методов и свойств.
Если в VS для того, чтобы увидеть подсказку о предназначении класса, метода или свойства необходимо подвести курсор к соответствующей строчке, то в SharpDevelop автоматически отображается как список возможных вариантов, так и подсказка по выбранному в данный момент пункту. Здесь SharpDevelop мне нравится больше. После длительной работы в VS 2003 у меня сложилось такое впечатление, что в ее редакторе ведется статистика наиболее часто используемых функциональных членов, и в следующий раз они подсвечиваются первыми.
Если вам когда-нибудь доводилось писать на VB .NET, то наверняка знаете, как прекрасно там организована работа с кодом — не в пример лучше, чем в C#. Как только я напишу, скажем, Me.ButtonOk.FlatStyle =, сразу появится список, содержащий все члены перечисления System.Windows.Forms.FlatStyle. Поверьте, это сильно ускоряет работу. К тому же если в C# нужно активно работать с клавишей Shift, то в VB .NET пиши все с маленькой буквы — Intellisense сам поймет, о чем вы. Но это уже о вопросе немного другого сорта.
Также у VS .NET лучше организована работа по выявлению ошибок еще на этапе набора текста. Т.е. если я, скажем, в private-методе объявлю private-поле, то VS .NET сразу отреагирует. SharpDevelop спокойно проглотит, но зато после неуспешной компиляции выдаст целый букет ошибок, которые никак, прямо или косвенно, не указывают на первопричину происходящего (#develop, естественно, в этом не виноват: он всего лишь отображает сообщения об ошибках, полученные от компилятора).
С другой стороны, Visual Studio .NET навязывает свое собственное, к слову сказать, неправильное, форматирование кода. SharpDevelop в этом плане более демократичен, к тому же сам закрывает фигурные скобки, но зато не выводит подсказки к уже набранному тексту, да и отступы для вложений не увеличивает при появлении более глобального пространства имен. Обращает на себя внимание подсветка фигурных скобок. Т.е. когда курсор находится рядом с закрывающей скобкой, подсвечивается и соответствующая ей открывающая. Надо сказать, очень удобно, особенно при удалении кусков кода — не нужно "прицеливаться" и смотреть, до каких пор еще можно удалять закрывающие фигурные скобки.
SharpDevelop обладает рядом довольно интересных функций. Некоторые из них я готов реализовать в виде AddIns для Visual Studio .NET, весь необходимый исходный код уже имеется, так что дело за малым. Большинство из них расположены в меню Инструменты. Так, Выбор цвета… вызывает ColorDialog, где в наглядной форме можно выбрать необходимый цвет. Его код или название вставляется в текущую позицию курсора.
Иногда на форуме GotDotNet.ru проскакивают сообщения, где люди просят перевести кусок кода с VB на C# или наоборот. SharpDevelop не даст вам пропасть. Просто нужно набрать текст программы на вашем "родном" языке, а затем выбрать пункт Перевести буфер из C# в VB .NET (из VB .NET в C#), и откроется новое окно, где отобразится сгенерированный код, готовый к употреблению.
Мастер сообщений призван визуализировать процесс создания MessageBox'ов. Выбор данного пункта меню приводит к появлению окна мастера. Здесь можно задать заголовок будущего сообщения и текст, указать, какие кнопки и иконки должны присутствовать в сообщении, а также выбрать кнопку по умолчанию. Есть и предпросмотр. После нажатия кнопки Готово сгенерированный текст вставляется в текущую позицию курсора. Думаю, эта функция будет полезна лишь на первых порах изучения C# (да и VB .NET тоже), т.к. поможет научиться наглядно представлять, какой эффект дают те или иные значения параметров. Сам же я мастером не пользуюсь — быстрее набрать с клавиатуры, да и за мышкой лень руку тянуть.
Оригинально разработчики подошли к вопросу вставки кода по шаблону. При нажатии Ctrl-J появляется ListBox, из которого можно выбрать готовые куски кода для вставки. В списке можно обнаружить конструкции if, if/else if, try, try/catch и другие. Особенно порадовало то, что существует возможность удалять невостребованные элементы списка, а также добавлять свои. В эту же категорию можно отнести и Автоматическую кодогенерацию. Эта функция позволяет только с помощью мыши создавать свойства (с различным набором акцессоров), конструкторы, а также перегружаемые методы. Понравилось, что можно выбрать сразу несколько элементов из списка, т.е. можно за раз сгенерировать 5 различных перегрузок. Диалоговое окно автогенерации появляется в позиции курсора, но никак не проверяет, поместится ли его содержимое на экране. ( См. рис. вверху.) Иногда нижняя часть становится недоступной для просмотра, и приходится прокручивать текст вниз, чтобы увидеть содержимое окна полностью. При выборе пункта меню Краткая XML-документация появляется окошко, где можно увидеть, как та или иная подсказка будет интерпретирована Intellisense (работает, когда курсор установлен на XML-комментариях, что, в общем-то, правильно).
Выводы
SharpDevelop представляет из себя весьма достойный и не менее интересный продукт. Реализовано много оригинальных функций, аналогов которых в VS .NET не оказалось. Остается только восхититься, что в достаточно маленьком объеме реализована такая серьезная функциональность. С использованием SharpDevelop действительно можно разрабатывать программы. Огорчает отсутствие отладчика, что осложняет весь процесс проектирования (и именно поэтому #develop пока не сможет заменить Visual Studio 2003), но он обязательно появится. Я же теперь с уверенностью буду рассказывать всем своим друзьям, что в SharpDevelop создавать программы на C# действительно классно!
Продолжение следует
Компьютерная газета. Статья была опубликована в номере 31 за 2004 год в рубрике программирование :: разное