Visual Studio 2008 и .NET Framework 3.5 Beta 2

27-го июля Microsoft выпустила вторую бета версию Visual Studio 2008 и .NET Framework 3.5. По поводу окончательного релиза Doug Seven, Senior Product Manager for Visual Studio Team System пишет в своем блоге:

While the launch events are scheduled to kick off on February 27, 2008, Visual Studio 2008 will be released before the end of the year."

Т.е., имеется вероятность того, что в конце года мы сможем перейти на новую студию и фреймворк 3.5. Но уже сейчас можно использовать .NET Framework 3.5 в коммерческих приложениях, т.к. он распространяется под, так называемой, go-live лицензией.

Итак, какие же новые возможности появятся у разработчиков при переходе на новую версию?

Поддержка нескольких версий .NET Framework (Multi-Targeting Support)

VS 2008 позволяет выбирать версию .NET Framework для проекта. Это значит, что вы можете использовать VS 2008 для своих проектов на .NET Framework 2.0 (например). Учитывая новые возможности, о которых рассказывается дальше, это очень полезное свойство новой студии, т.к. позволяет безболезненно перейти на новую IDE.

Новый Web Designer с поддержкой CSS

В VS 2008 существенно улучшен HTML Web Designer:

  1. Появился режим редактирования Split View, в котором одновременно отображаются и html код и дизайн страницы (аналогично тому, как это сделано в Macromedia Dreamweaver).
  2. Новое "Manage Styles" tool window, которое отображает все CSS стили с соответствующими правилами для редактируемой страницы.
  3. При выделении HTML элемента или серверного ASP.NET контрола новое CSS property window отображает все CSS свойства выделенного элемента и позволяет их редактировать.
  4. Поддержка Intellisense для CSS стилей.
  5. Вложенные Master Pages.

Поддержка ASP.NET AJAX и JavaScript

.NET 3.5 включает в себя ASP.NET AJAX. VS 2008, также, поддерживает JavaScript и AJAX в ваших приложениях.

LINQ и улучшения языка

Самые интересные, на мой взгляд, "фичи". LINQ (language integrated query, интегрированный язык запросов, произносится как "линк") вносит новую идеологию в работу с данными. С его помощью, используя SQL подобные запросы, можно получать данные из различных источников: .NET коллекций (и вообще, из любых объектов, имплиментирующих интерфейс IEnumerable<T>), XML, БД.

Особый интерес представляют части LINQ, называемые LINQ to SQL и LINQ to Entitis. С их помощью можно наполнять данными объекты домена (domain objects), представляющие собой модель предметной области. По сути, эти компоненты выполняют те же задачи, что и широко распространенная библиотека NHibernate, но при этом более тесно интегрированы с другими частями фреймворка. При этом, LINQ to SQL позволяет создвать простые зависимости между БД и объектной моделью, а LINQ to Entitis более сложные. К сожалению, релиз LINQ to Entitis ожидается в 2008 году, после выхода .NET Framework 3.5.

Вместе с LINQ в язык добавлены новые конструкции:

  • автоматические свойства (Automatic Properties)
  • инициализация объектов (Object Initializer)
  • лямбда выражения (Lambda Expressions)
  • синтаксис запросов (Query Syntax)
  • расширяющие методы (Extension Methods)
  • анонимные типы (Anonymous Types)

Другие улучшения

Кроме выше описанных, имеется много других улучшений: WPF designer (для VS 2005 можно установить бесплатный Add-on), WCF и Workflow проекты и дизайнеры, значительные усовершенствования в разработке приложений под Office и много другого.

Permalink | Комментарии (0) | Post RSSRSS comment feed

Работа со строками в .NET

 

Хотя работа со строками довольно хорошо описана в книге Дж. Рихтера, я решил затронуть эту тему, т.к. не у всех есть возможность прочитать эту книгу, а неправильное использование строк является частой ошибкой и ведет к снижению производительности приложения. К тому же, в книге имеется одна небольшая неточность по работе класса StringBuilder.

В .NET все строки являются экземплярами класса System.String (алиас string в C#). Он неявно наследуется от System.Object и реализует интерфейсы IComparable, ICloneable, IConvertible, IEnumerable:

 

[Serializable]
public sealed class String : IComparable, ICloneable, IConvertible, IEnumerable

C# рассматривает String как примитивный тип, поэтому для инициализации строковой переменной литералом следует использовать такой синтаксис:

 

String s = "This is a string.";

Компилятор размещает строковые литералы в метаданных модуля, а доступ к ним в run-time происходит с использованием так называемого механизма интернирования строк (string interning). Об интернировании я расскажу немного позже.
Так работать не будет:

String s = new String("This is a string.");

Т.к. String не имеет конструктора, принимающего String. Конструкторы String позволяют создать экземпляр из символа (char) или массива символов (char[]). При вызове из C++ with Managed Extensions или небезопасного кода C# (использующего указатели) применяются конструкторы, принимающие char* или sbyte*.
C# использует синтаксис С++ для задания специальных символов типа перевода строки или табуляции:

String s = "Line\r\nNew Line";

При выводе, например, с помощью Console.Write(s), "New Line" будет выведено на новой строке.
"\r\n" соответствует константе vbCrLf в Visual Basic 6.0. Но существует более правильный способ перевода строки. Класс System.Environment содержит read-only свойство NewLine, возвращающее соответствующую строку, в зависимости от платформы.

String s = "Line" + Environment.NewLine + "New Line";

Например, на платформе UNIX Environment.NewLine вернет \n.

String s = "Column1\tColumn2";

Column1 и Column2 будут разделены табуляцией.
Символ обратной косой черты ("\") является служебным и при использовании внутри строки его необходимо удваивать:

String path = "c:\\Program Files\\Microsoft Visual Studio 2003\\";

Однако, при помощи символа @ (коммерческое эт) можно определить так называемые "дословные строки" (verbatim strings). В этом случае компилятор воспринимает обратную косую черту как обычный символ. Этот код эквивалентен предыдущему:

String path = @"c:\Program Files\Microsoft Visual Studio 2003\";

Важнейшим свойством строк в .NET является их неизменяемость (immutable). Это означает что созданную строку невозможно изменить. Следствием этого является то, что любой метод класса String не изменяет его. Например:

string s = "Some String"; Console.WriteLine(s.ToUpper());

В этом примере создается строковый объект s, у которого вызывается метод ToUpper(). Это приводит к созданию нового строкового объекта ("SOME STRING"), который выводится на консоль. При этом s не изменилось.  Часто, для достижения результата, приходится вызывать последовательно несколько методов класса String:

string newString = s.Trim().Substring(10, 20).ToLower();

Этот код создает 3 новых строки, две из которых сразу становятся мусором. Не стоит особо беспокоиться об этом, т.к. такие кратковременно живущие объекты легко уничтожаются сборщиком мусора.
Однако, если вам необходимо часто формировать строки в своем приложении, то множество промежуточных строковых объектов все же может сказаться на производительности.
Для этого в .NET Framework имеется специальный класс StringBuilder. Он позволяет модифицировать содержащуюся в нем строку без потери производительности (не создавая промежуточных объектов).
Для этого используются следующме методы класса: Append, AppendFormat, Insert, Remove, Replace.
Как же работает класс StringBuilder? Джеффри Рихтер в своей книге "Программирование на платформе .NET FRAMEWORK" пишет:
У объекта StringBuilder предусмотрено поле с ссылкой на массив структур Char. Используя члены StringBuilder, вы можете эффективно манипулировать этим массивом, сокращая строку и изменяя символы строки. При увеличении строки, представляющей ранее выделенный массив символов, StringBuilder автоматически выделит память для нового, большего по размеру массива, скопирует символы и приступит к работе с новым массивом. Прежний массив станет мусором.
Возможно, что в бета версии .NET, по которой Рихтер писал свою книгу, так и было. Но давайте заглянем сами в класс StringBuilder (с помощью утилиты .NET Reflector). Класс содержит следующее объявление:

internal string m_StringValue;

Как вы помните, модификатор доступа internal (внутренний) эквивалентен public для классов той же сборки и private для классов других сборок.
Далее, методы, модифицирующие строку, вызывают внутренние небезопасные (internal unsafe) методы класса String, которые манипулируют строкой напрямую:

internal unsafe void ReplaceCharInPlace(char oldChar, char newChar, int startIndex, int count, int currentLength)
{
int num1 = startIndex + count;
fixed (char* local1 = &this.m_firstChar)
{
    for (int num2 = startIndex; num2 < num1; num2++)
    {
     if (local1[num2] == oldChar)
     {
        local1[num2] = newChar;
     }
    }
}
}

Благодаря модификатору доступа internal эти методы могут вызывать только классы сборки mscorlib, что исключает проблемы, присущие неуправляемым приложениям.
В заключение, хотелось бы рассказать немного об очень полезном методе Format класса String. Он, также, как и метод AppendFormat класса StringBuilder позволяет эффективно сформировать строку из строки со спецификаторами формата и строковых представлениях объектов. На самом деле, в методе Format создается объект StringBuilder и вызывается его метод AppendFormat. Это позволяет вам сэкономить несколько строк кода.
Вот одна из наиболее часто используемых перегрузок метода Format:

public static string Format( string format, params object[] args );

Вот как правильнее написать пример с переводом строки:

String s = String.Format("Line{0}New Line", Environment.NewLine);

Вот еще один пример:

int x = 10; int y = 20; String s = String.Format("{0} + {1} = {2}", x, y, x + y);

Если вы не знакомы со спецификаторами формата, обязательно прочтите о них в MSDN. Это очень удобное и эффективное средство для форматирования строк.
На этом краткий обзор строк в .NET пока завершен. Я многого не рассказал, но для первого знакомства этого вполне достаточно.

Permalink | Комментарии (2) | Post RSSRSS comment feed
Реклама
TNX.net - уникальный международный сервис для вебмастеров и оптимизаторов

Подписка
toodoo Читать в Яндекс.Ленте Добавить в Google Reader или Homepage

Статистика
]]>
  • PR0CY.com - сервис проверки доменов
  • BlogMemes.ru
]]>





]]>

]]>