Ведущий продукт Microsoft для разработчиков ПО, Visual Studio 2010, содержит существенные усовершенствования по сравнению с версией Visual Studio 2008. Это касается как основных функций пакета, так и его возможностей для работы с ASP.NET, C#, C++ и VB. Надо отметить также, что параллельно с выпуском VS 2010 корпорация Microsoft обновила .NET Framework до версии 4.

Новинка произвела на меня очень хорошее впечатление, так что я хочу поскорее перевести на нее свои проекты с версии VS 2008 (а некоторые еще с VS 2005). Вместе с тем я считаю, что ряда элементов ASP.NET в среде разработки (IDE) не хватает: нет основных средств AJAX, а те расширения AJAX, которые все же имеются, кажутся не слишком удачными. В последнее время в Web-разработках большая роль отводится операциям на стороне клиента, и хотя в Visual Studio имеется весьма солидная поддержка JavaScript, подозреваю, что многие Web-разработчики по-прежнему будут использовать и другие инструменты.

Я тестировал Visual Studio 2010 Professional Edition, стоимость этого варианта составляет 799 долл. за полную версию и 549 долл. при переходе с более ранней версии.

Базовая функциональность

Одно из усовершенствований в среде IDE VS 2010, сразу привлекшее мое внимание, — система навигации по иерархии вызовов. В течение долгих лет многие из нас пользовались командами меню Go to Definition (перейти к определению) и Find All References (найти все упоминания), с помощью которых можно быстро перемещаться по дебрям программного кода. И все же нам часто приходилось выполнять много операций по поиску, когда надо было отследить тот или иной участок кода при разработке. Окно Call Hierarchy (иерархия вызовов) существенно расширяет возможности такого рода, позволяя визуально проследить всю последовательность вызовов, с указаниями типа “вызывает...” и “вызывается из...”.

В редакторе кода появилось множество усовершенствований, в частности потому, что новая версия использует WPF (Windows Presentation Framework, среда презентации Windows). Хорошее впечатление оставляет функция масштабирования — теперь вы можете быстро уменьшать или увеличивать масштаб, как если бы вы работали в текстовом процессоре вроде Microsoft Word. А по щелчку на переменной или на идентификаторе программа выделяет все вхождения этого элемента в тексте.

Очень интересной показалась мне функция Generate fr om Usage (сгенерировать по примеру использования). В прежних версиях Visual Studio был удобный инструмент Generate Method Stub (создать болванку метода). Его можно было вызвать через всплывающее меню при вводе вызова еще не существующей функции. Так, если вы набирали “myfunc(2)”, под первой буквой появлялась полоска, которая разворачивалась в меню с командой “Создать”. Эта команда создавала пустой метод с учетом типов данных в вызове функции — например, в случае с myfunc(2) создаваемая функция должна была получать один целочисленный параметр. Так вот, данный инструмент был расширен и теперь позволяет работать не только с методами, но и с другими объектами.

К примеру, я вводил: “anothervar = 10”; под начальной буквой “a” появлялась полоска для вызова меню с двумя командами, Generate Property Stub, и Generate Field Stub. Первая создает свойство (с методами get и set), вторая — приватный член — переменную, скажем:

public int anothervar { get; set; }

и

private int anothervar;

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

C# 4.0 и .NET 4.0

Версия C# 4.0 поддерживает позднее связывание, эквивалентность типов, а также ковариантность и контравариантность. Поддержка эквивалентности типов очень важна, поскольку с ее помощью вы можете встраивать типы из чужого кода непосредственно в свой код, так что потом можно будет ссылаться на эти типы, не ссылаясь на чужой код на этапе исполнения. Какие преимущества это дает? Вы можете линковать на этапе исполнения другие версии этого чужого кода, что раньше было очень трудно сделать.

Четвертая версия .NET сама по себе также содержит немало усовершенствований. В частности, появился новый класс под названием Tuple (кортеж), существенно упрощающий жизнь тем, кто привык работать с языками типа Python. Вот пример кода на C#: var primes = Tuple.Create(2, 3, 5, 7, 11, 13, 17, 19). Это выглядит не так изящно, как использование кортежей в Python и подобных ему языках: primes = (2, 3, 5, 7, 11, 13, 17, 19).

Разница, разумеется, в том, что кортежи в Python встроены непосредственно в язык. В C# вы можете использовать класс Tuple. Правда, он позволяет передавать конструктору всего восемь объектов, поскольку именно столько перегрузок имеется у конструктора. Однако вы можете добавлять большее число объектов в Tuple после создания этого класса. Конечно, это идет вразрез с концепцией кортежей в Python и других языках, так как там предполагается неизменность числа элементов. Но в разных языках действуют разные правила.

Я с удивлением увидел, что в список новых возможностей входит работа с файлами, проецируемыми в память. Такие файлы издавна использовались разработчиками на платформе Win32 как для манипуляций с большими объемами виртуальной памяти, так и для создания собственных специфических файловых форматов. Формально в .NET всегда была возможность работать с файлами, проецируемыми в память, напрямую вызывая функции Win32 API. Но теперь специально для этой цели имеется .NET-класс под названием MemoryMappedFile.

Если у вас есть опыт работы с более ранними языками Си/Си++, вы можете себе представить, какое облегчение приносят классы ввода-вывода .NET, особенно такие, как File, Directory и Path. По тем или иным причинам манипуляции с файлами и подкаталогами всегда были довольно неудобными. Я помню свои мучения при программировании поиска файлов на Си и их ужасными аналогами из Win32 API. Microsoft упростила такие манипуляции с помощью классов .NET (то же самое сделали и создатели других языков, в частности Python). А сейчас в новой версии .NET все стало еще проще. В новейшей редакции класс Directory включает методы, возвращающие перечисления. Это значит, что с ними можно работать с помощью LINQ.

В плане архитектуры в .NET также появилось множество усовершенствований. Скажем, была добавлена целая группа классов, обеспечивающих поддержку многоядерных технологий, параллельных вычислений и даже LINQ. Я поработал с этими классами и остался очень доволен. Например, там есть метод Parallel.For, функционирующий во многом подобно традиционному циклу for, только в данном случае код внутри цикла выполняется в распараллеленном режиме, а не последовательно. И действительно, я создавал параллельные циклы for с множеством повторений и с помощью средств трассировки убеждался, что выполнение моего кода распределяется между отдельными ядрами моего процессора.

Есть в .NET и множество сравнительно мелких улучшений. Некоторые дополнительные классы теперь обеспечивают поддержку Parse и метода TryParse, подобно тому как это уже делается в Int32 и др. (примеры включают Enum, что весьма полезно, а также Guid, что также иногда может понадобиться). Появился новый общий класс SortedSet для коллекций (с точки зрения математики название звучит как оксюморон, но идея понятна).

ASP.NET

В ASP.NET тоже немало усовершенствований. Механизм кэширования улучшен, в него включены расширения провайдеров кэша, позволяющие вам (или третьим лицам) создавать, как сказано в документации, “более интеллектуальные стратегии кэширования вывода для Web-сайтов”. Если вы когда-либо занимались разработкой сайтов, то можете представить себе, как это важно для поддержания высокопроизводительного, оптимизированного сервера.

Далее в ASP.NET был, похоже, исправлен один аспект, давно вызывавший у меня недовольство. Раньше, если сервер ASP.NET некоторое время проводил в бездействии, то после первого запроса ему требовалось значительное время, чтобы “проснуться”. Для коммерческого сервера это очень плохо по нескольким причинам. Прежде всего, потенциальный клиент может счесть, что сайт работает медленно; хуже того, если посетитель разбирается в технологиях, он поймет, что на сайт в течение нескольких минут (а то и дней или недель!) никто не заходил. Чтобы решить эту проблему, в новой версии ASP.NET используется предварительная загрузка Web-приложений при условии, что вы работаете с IIS (Internet Information Services) 7.5 с операционной системой не ниже Windows Server 2008 R2.

Другие улучшения касаются постоянного перенаправления страниц, компрессии данных о состоянии сессии, оптимизации работы с CSS и даже встраивания средства просмотра состояния (view state) отдельных элементов управления. Это расширяет ваши возможности контроля за состоянием элементов. Помимо этого класс HttpBrowserCapabilities был усовершенствован — теперь он распознает несколько новых браузеров, в том числе для платформы iPhone, так что вы можете писать код, специально адаптированный и для этих браузеров.

Программистам, использующим LINQ в сочетании с ASP.NET, может пригодиться новый элемент управления QueryExtender, помогающий работать с фильтрами и конструкциями WH ERE. А еще теперь нет необходимости дополнительно загружать MVC — соответствующие средства встроены в новую версию.

Весьма интересное усовершенствование касается динамических данных и автогенерации (scaffolding). Эти технологии сами по себе не новы, они появились два года назад в ASP.NET 3.5 Extensions в качестве отдельно загружаемого модуля. Новым стало то, что они теперь встроены в Visual Studio 2010 и готовы к использованию. Я назвал их интересными, поскольку они позволяют быстро создавать приложения ASP.NET, работающие с табличными данными в режиме прямого доступа к данным.

Надеюсь, разработчики не станут наскоро лепить в ASP.NET такие приложения “по умолчанию”, чтобы предлагать их в этом виде как есть. Ведь можно модифицировать предлагаемые шаблоны и добавлять их в код при разработке более интеллектуальных приложений. Впрочем, если брать продукт в целом, то мы имеем дело с вполне традиционной системой ASP.NET; в частности, таблицы не поддерживают AJAX.

Язык C++

В Visual Studio язык C++ представлен двояко. Есть “родной” C++, компилируемый в родной для Intel ассемблерный код (для создания приложений Win32), а есть еще и “управляемый” C++, компилируемый в промежуточный код для исполнения в среде .NET.

Компилятор C++ теперь поддерживает многие возможности языка C++0x, который скоро должен стать общим стандартом. К примеру, отныне вы можете использовать в своем коде на C++ лямбда-функции.

Далее, библиотека MFC по-прежнему жива, и теперь в ней реализована поддержка Windows 7 и новых функций Office, включая ленточный интерфейс (так что даже возникает желание после долгих лет снова вернуться к MFC, но, пожалуй, не слишком сильное). А кто помнит библиотеку ATL? Как выразился Гомер Симпсон: “Неужели эта штука до сих пор существует?” Да, существует. Однако не забудем и стандартную библиотеку C++, в которой теперь представлено много функций C++0x (почему “много”, а не “все”? — потому что стандарт C++0x пока не утвержден окончательно).

WPF

Активно участвуя последние два года в жизни сообщества Visual Studio, я убедился, что большинство программистов по тем или иным причинам игнорируют WPF, хотя эта среда существенно упрощает создание графических приложений по сравнению с прежними вариантами .NET. Но факт есть факт: инструментарий WPF непопулярен. Не исключено, что ситуация изменится с появлением Visual Studio 2010, особенно если учесть, что значительная часть Visual Studio 2010 переоснащалась с помощью собственно WPF.

Сейчас среда WPF получила номер версии 4, и в комплекте с нею поставляются новые элементы управления, включая Calendar, DataGrid, DatePicker и WebBrowser. Имеются усовершенствования, связанные с поддержанием пользовательского интерфейса и сенсорного ввода. Значительно улучшены средства отображения текста. Возвращаясь к среде разработки, отмечу, что она также была существенно доработана; помимо прочего это касается поддержки XAML в WPF и Silverlight.

Отладчик

Отладчик в Visual Studio очень заметно усовершенствован. Вы получаете более мощные возможности контроля за точками останова, в частности их можно снабжать метками, а затем экспортировать или импортировать. Удобнее стало работать и в окне отладки программных потоков (тредов).

В окнах просмотра переменных также есть любопытные новшества. Раньше в таких окнах можно было вызывать функции — это дает определенные удобства, но может вызывать и проблемы, если функции изменяют состояние программы (меняют значения переменных и т. п.). Теперь в окнах просмотра помещается значок, предупреждающий вас в случае изменения значений, которые могут отразиться на работе других потоков и вызвать побочный эффект.

Сильно улучшены средства отладки параллельных вычислений. Современные процессоры имеют многоядерную архитектуру, и это позволяет работать с программами на базе параллельных процессов. Инструментарий Visual Studio стал лучше приспособлен для отладки таких программ.

Язык F#

Microsoft весьма активно продвигает свой новый язык F#. Тут у меня нет никаких претензий. Этот язык включается в состав Visual Studio, а не поставляется как отдельный продукт. Если вас интересуют современные языки программирования, основанные на действительно потрясающих технологиях (ML и OCaml), вам стоит ознакомиться с этим.