Менеджер расширений Visual Studio 2010В апреле 2010 г. вместе с финальным выпуском .NET Framework 4.0 вышла новая среда разработки — Visual Studio 2010. Первоначальная дата выпуска была отложена из-за недостатков, выявленных во время бета-тестирования.

Microsoft Visual Studio 2010

Данный выпуск можно справедливо назвать революционным. Сначала несколько ремарок по поводу .NET Framework 4.0. Сама по себе платформа .NET Framework давно не считается вершиной айсберга технологий корпорации Microsoft, потому что разработчики платформы предоставляют возможности сразу нескольких мощных технологий более высокого уровня абстрагирования, оптимизирующих процесс прикладного программирования:

Windows Presentation Foundation — графическая презентационная подсистема;

Windows Workflow Foundation — технология для выполнения и управления рабочими процессами;

Windows Communication Foundation — подсистема, используемая для обмена данными между приложениями.

Именно эти технологии оказались в авангарде предоставляемых возможностей и фактически развились в отдельную реальность, уже не так сильно связанную с прежними представлениями о прикладном программировании. Разработчики платформы помнят о простых смертных: на компонентном уровне гарантируется максимальная программная совместимость между версиями .NET 4.0 и .NET 3.5 SP1. До настоящего времени программа Microsoft Visual Studio базировалась на технологиях, заложенных еще во времена Visual C++ 6. Теперь это не так — новая среда разработки базируется на WPF 4.0, что лишний раз должно подчеркнуть как богатство средств, так и стабильность данной технологии.

Усилия по переносу среды разработки на WPF наверняка можно считать оправданными. Вот перечень интересных новшеств WPF 4.0 для примера:

  • Поддержка системы Windows 7 на уровне элементов управления — интеграция с Панелью задач, поддержка одиозного элемента управления Office Ribbon.
  • Появившиеся возможности работы с графикой — функции упрощения (Easing Functions) для работы с анимацией.
  • Новый программный стек для прорисовки текста: явные успехи в битве за неизменно хорошее качество отображения текста. Речь идет как об оптимизации качества отображения, так и о возможности произвольного выбора режимов отображения.

Улучшился и редактор кода — стало возможным плавно изменять масштаб текста программы, а также выносить окна среды разработки за рамки программы, однако, чтобы поставить окно на место, нужно включать мозги… Кому-то самой интересной особенностью новой версии Visual Studio покажется менеджер расширений (Extension Manager), который позволяет разработчику буквально достраивать свою копию среды разработки, пользуясь собственными или чужими расширениями.

Менеджер расширений

Важным нововведением языка С# 4.0 следует считать ключевое слово dynamic. Вот простой пример его использования:

static void Main(string[ ] args)

dynamic Значение1 = «Привет тебе MSVS»;

dynamic Значение2 = 2010;

System.Console.WriteLine(Значение1 + Значение2);

System.Console.ReadKey();

Такая конструкция называется поддержкой динамического типа. А приведенную ниже конструкцию кода компилятор также пропустит:

class МойКласс

{public void МойМетод(object КакойТоОбъект){

dynamic Объект = КакойТоОбъект;

Объект.МетодКоторогоМожетНеБыть();

};

Выглядит подозрительно, но компилятор это пропускает в надежде на лучшее...Из Интернета легко узнать, что создатели C# 4.0 якобы пытались решить с помощью такого нововведения конкретную задачу — упростить интеграцию программной платформы средствами MS Office. Но и это новшество также может пригодиться, если относиться к нему внимательно и не доводить дело до появления программных исключений в режиме запуска.

Обсуждая новые средства .NET 4.0, нужно обязательно упомянуть PLINQ (Parallel Language-Integrated Query). Уже из названия нетрудно догадаться, что данная технология, которая давно разрабатывалась в Microsoft, позволяет максимально эффективно выполнять LINQ-запросы для многопроцессорных и распределенных систем. Чтобы проверить возможности этой технологии, возьмем из Интернета первый попавшийся пример кода (www.intuit.ru/department/supercomputing/ppmcp/7/) и дополним его наглядным средством измерения времени вычисления:

private static bool IsDivisibleBy5(int p)

// Цикл для увеличения времени

// вычисления

for (int i = 0; i < 1000000; i++){ i++; i--; }

//Проверяем делимость целого числа на 5

return p % 5 == 0;

static void Main(string[ ] args)

//Стартовая временная точка

var gtс1 = DateTime.Now;

IEnumerable arr = Enumerable.Range(1, 1000);

var q =

from n in arr.AsParallel() V

//Вся суть в указании метода AsParallel()

where IsDivisibleBy5(n)

select n;

List list = q.ToList();

Console.WriteLine(list.Count.ToString());

//Здесь .NET наглядно отобразит общую

//длительность вычислений

Console.WriteLine((DateTime.Now — gtс1).ToString());

Console.ReadKey();

Для AMD Phenom 9850 Quard-Core 2.51 (MS Windows XP SP3) получились следующие результаты:

  • без применения PLINQ (стираем из кода метод AsParallel): 00:00:08.8125000
  • с использованием PLINQ: 00:00:02.1406250

Получилось четырехкратное преимущество от технологии PLINQ для четырехъядерного процессора, что вполне логично.Это не первый случай, когда платформа, предложенная Microsoft, дарит программисту возможность использовать аппаратные средства с максимальным эффектом!

Delphi 2010

А сейчас выясним, чему могут порадоваться вечные оппоненты — дельфийцы. В общем-то, после выхода Delphi Prism называть их оппонентами уже язык не поворачивается. Но еще большую психологическую пользу это принесло разработчикам настоящего классического платформенного Delphi: закрыв (в смысле успешного конца страданий) не простую эпопею «поддержки .NET», они занялись делом. Самыми интересными результатами стали поддержка атрибутов и новая удобная программная модель RTTI для использования в приложениях.

Теперь по порядку. Начнем с RTTI (Run-Time Type Information — информация о типах в режиме исполнения). Если в предыдущих версиях под ней программист понимал трудночитаемый код и целую кучу загадочных указателей на объекты, «перепахав» которые он мог сам собой гордиться, то с выходом Delphi 2010 использовать RTTI становится не только полезно и интересно, но и просто.

Возьмем простой пример и напишем следующий обработчик для кнопки на форме:

uses RTTI;

var context:TRTTIContext;

procedure TForm1.Button1Click(Sender: TObject);

begin

ShowMessage(

context.GetType(self.ClassType).GetProperty(‘Caption’).GetValue(self).ToString

); );

end;

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

В основу этой новой модели была положена запись (а фактически — статический класс) TValue. Интересующиеся могут познакомиться с TValue в файле RTTI.pas.

Как раз благодаря TValue стало возможным написать такой код:

var Значение1,Значение2:TValue;

begin

Значение1:=’Привет тебе Delphi ‘;

Значение2:=2010;

WriteLn(Значение1.toString+Значение2.toString);

Readln;

end.

Сведущие люди могут испытать запоздалое умиление по поводу метода toString. Разницу между методами asString и toString несложно узнать там же, в файле RTTI.pas.

Теперь в качестве передышки рассмотрим новый модуль IOUtils. В нем есть статические классы, такие как IOUtils.TDirectory, IOUtils.TPath и IOUtils.TDirectory. Догадаться об их назначении просто — работа с файловой системой. Приятно, что у авторов Delphi 2010 наконец-то дошли руки и до полезных мелочей вроде систематизации и улучшения простейших операций. И пусть даже это теперь напоминает .NET, но появилось именно то, чего давно уже не хватало в Delphi.

Возвращаясь к более сложным вещам, посмотрим, как в Delphi 2010 работать с атрибутами. Быстро исследуем соответствующие возможности. Для этого попробуем откомпилировать класс:

[ВЧемБылСмыслЭтихБуквЯНеПомнюХотьУбей]

[212.805]

[MyTest]МойКласс = class

end;

При этом компилятор «огрызнется» на тему несоответствия моих записей языковым возможностям ([DCC Warning] Project1.dpr(10): W1025 Unsupported language feature: ‘custom attribute’), но сам код будет успешно скомпилирован. А вдруг это уже и есть те самые атрибуты? Проверим!

var attributes: TArray;

attrib:TCustomAttribute;

context:TRTTIContext;

МойОбъект:МойКласс;

begin

МойОбъект:=МойКласс.Create;

attributes:=context.GetType(МойОбъект.ClassType).GetAttributes;

for attrib in attributes do WriteLn(attrib.ClassName);

Readln;

end.

И ничего...

Зато в случае, если над определением класса добавить

MyTestAttribute = class(TCustomAttribute)end,

то программа действительно подтвердит наличие MyTestAttribute.

Общее впечатление от двух инструментов программирования следующее: современные средства компании Microsoft ушли далеко вперед с той поры, когда под ними понимались Windows Forms и ASP .NET, причем сохранилось и развилось традиционное направление классических средств программирования. А вот в Delphi дело обстоит не так просто: после многострадального Kylix и почти неродного Delphi Prism разработчики Delphi в очередной раз пробуют замахнуться на кросс-платформенность. Уже сейчас в исходных текстах из поставки Delphi 2010 встречаются такие записи:

uses

{$IFDEF MSWINDOWS}

Windows,

{$ENDIF}

{$IFDEF POSIX}

Types,

{$IFDEF MACOSX}

MiniLibc,

{$ELSE!MACOSX}

Libc,

{$ENDIF!MACOSX}{$ENDIF}

Значит, впереди нас еще ждет много нового!