.NET 4.0: что нового в базовых классах (BCL)? Подробный обзор

Visual Studio 2010 и .NET Framework 4 Beta 2 уже доступны для загрузки. .NET 4 Beta 2 содержит некоторое количество нового функционала и улучшений в базовых классах (BCL) в дополнение к тем, которые мы представили ранее в .NET 4 Beta 1. Многие эти улучшения были произведены благодаря отзывам и рекомендациям от клиентов, полученным через Microsoft Connect.

От переводчика: эта статья содержит описание изменений в базовых класса, которые были произведены от версии Beta 1 до Beta 2. В конце статьи я привел ссылку и краткий список того, что было добавлено в базовые классы .NET 4.0 ранее.

 

Общий список улучшений в .NET 4 Beta 2

  • Тип Complex;
  • Location;
  • IObservable<T>;
  • Stream.CopyTo;
  • Guid.TryParse, Version.TryParse, and Enum.TryParse<T>;
  • Enum.HasFlag;
  • перегруженные String.Concat и String.Join принимают IEnumerable<T>;
  • String.IsNullOrWhiteSpace;
  • дополнения в Environment.SpecialFolder;
  • Environment.Is64BitProcess и Environment.Is64BitOperatingSystem;
  • поддержка параметров Path.Combine;
  • глобализация при форматировании и разборе TimeSpan;
  • Stopwatch.Restart;
  • StringBuilder.Clear;
  • дополнения в IntPtr и UIntPtr и операторы Subtraction;
  • ServiceProcessInstaller.DelayedAutoStart;
  • тип ObservableCollection<T> перенесен в System.dll.

Тип Complex

 

прим. перев.: этот тип можно использовать подключив самостоятельно сборку System.Numerics.dll. Кроме того, еще немного информации можно почерпнуть в этой статье

 

Тип System.Numerics.Complex представляет собой комплексное число, включающее в себя значения вещественного числа и мнимого числа.  Complex поддерживает как декартовы координаты (вещественные и мнимые), так и полярные координаты (величина и период измеряются в радианах) и поддерживает арифметические и тригонометрические операции. Комплексные числа используются в ряде областей, включая высокопроизводительные вычисления, построениях графиков и диаграм, электронике (т.н. преобразования Фурье) и в других областях.

 

Location

 

System.Device.Location (который расположен в System.Device.dll) позволяет .NET-приложениям запущенным на Windows 7 определять текущую геолокацию (т.е. широту и долготу) устройства на котором приложение запущено. Windows 7 поддерживает ряд разнообразных датчиков местоположения, включая устройства GPS и радио WWAN (WWAN radios), и может автоматически переключаться между датчиками, когда они доступны, для получения наиболее точных данных в конкретной ситуации. .NET-приложения смогут использовать эти API для получения доступа к следующим данным: долгота, широта, высота, горизонтальная и вертикальная точность, направление, скорость и городской адрес (т.е. страну/регион, штат/область, город, почтовый индекс, улицу, номер дома, этаж).

Учтите, что мы планируем внести некоторые изменения в структуру location-API в следующем выпуске .NET RC

, так что имейте это в виду, когда соберетесь оценивать и использовать location-API beta 2 в своих приложениях. Мы расскажем побольше о запланированных изменениях в следующих статьях в этом блоге.

IObservable<T>

System.IObservable<T> и System.IObserver<T> реализуют основной механизм для push-уведомлений и могут исопльзоваться для создания push-коллекций или по-другому – наблюдаемых (observable) коллекций. Любой, кто знаком с паттернами, узнает в этих интерфейсах реализацию широкоизвестного паттернанаблюдатель(observer). IObservable<T> приоткрывает дверь для новых замечательных парадигм разработки на .NET основанных на событиях и асинхронном программировании. Отличный пример этому – Reactive Framework (RX), библиотека методов расширения (не входит в .NET 4), которая реализует операторы LINQ Standard Query Operators и другие полезные потокоизменяющие (stream transformation) функции  для IObservable<T>. События первого класса (first-class) F# [прим. перев.: больше о first-class событиях и чем они отличаются от событий .net можно почитать в этой заметке ] так же поддерживают IObservable<T> и, кроме того, F# содержит библиотеку операторов для обозревателей  похожую на RX. Представьте себе возможность создавать LINQ-запросы к событиям, это как раз то, что IObservable<T> позволяет делать. Для закрепления знаний о силе IObservable<T> я рекомендую посмотреть серию видео Эрика Мейджера “Знакомство с RX” (Erik Meijer introducing RX ) на Channel 9 и обсуждение discussing IObservable<T> in the BCL между Везом Дайером (Wes Dyer) и Ким Гамильтон (Kim Hamilton).

Вы могли подумать, что IObservable<T> приходит на замену событиям в .NET. Однако, ответ: “нет”, но вы и в самом деле можете использовать IObservable<T> вместо событий, если захотите. События – это хорошо известный механизм уведомлений в .NET и он отлично знаком .NET-разработчикам. Поэтому, мы рекомендуем продолжать использовтаь события как основной механизм уведомлений для .NET API. Одна из самых классных вещей в IObservable<T> – это то, что конвертация существующего события в IObservable<T> – простейший процесс. RX предосталяет для этого встроенные методы, а F# содержит встроенную поддержку на уровне языка. Оставайтесь с нашим блогом для большего количества новостей о RX в будущем.

Stream.CopyTo

Как часто вы писали следующий стеретипный код во время работы с типом Stream для чтения из одного потока и записи в другой?

 

Stream source = ...;
Stream destination = ...;
byte[] buffer = new byte[4096];
int read;
while ((read = source.Read(buffer, 0, buffer.Length)) != 0)
{
  destination.Write(buffer, 0, read);
}


* This source code was highlighted with Source Code Highlighter.

 

В .NET 4 вам больше не придется писать такой код. Мы добавили для Stream новый метод CopyTo, который позволит написать так:

 

Stream source = ...;
Stream destination = ...;
source.CopyTo(destination);


* This source code was highlighted with Source Code Highlighter.

 

Guid.TryParse, Version.TryParse, and Enum.TryParse<T>

 

Мы добавили метод TryParse в System.Guid, System.Version, и System.Enum. Enum.TryParse – это генерик (обобщение), приятное улучшение по сравнению с необобщенным методом Parse, которое позволяет писать более чистый код.

 

В предыдущих версиях .NET, чтобы распарсить значение перечисления, мы могли писать что-то вроде этого:

 

try {
  string value = Console.ReadLine();
  FileOptions fo = (FileOptions)Enum.Parse(typeof(FileOptions), value);
  // Success
}
catch {
  // Error
}


* This source code was highlighted with Source Code Highlighter.

 

В .NET 4 вы можете использовать обощенный метод TryParse:

 

string value = Console.ReadLine();
FileOptions fo;
if (Enum.TryParse(value, out fo))
{
  // Success
}


* This source code was highlighted with Source Code Highlighter.

 

Прим. перев.: здесь могло бы быть Enum.TryParse<FileOptions>(value, out fo), но C# великолепный язык, компилятор которого сам все понимает

 

Enum.HasFlag

 

Мы добавили новые удобные для использования методы в System.Enum, которые позволяет супер-просто определить установлен ли флаг в перечислении Flags без нужды вспоминать битовые операторы. Это так же помогает делать код более читаемым.

 

В VB:

 

Dim cm As ConsoleModifiers = ConsoleModifiers.Alt Or ConsoleModifiers.Shift
Dim hasAlt1 As Boolean = (cm And ConsoleModifiers.Alt) = ConsoleModifiers.Alt ' using bitwise operators
Dim hasAlt2 As Boolean = cm.HasFlag(ConsoleModifiers.Alt) ' using HasFlag


* This source code was highlighted with Source Code Highlighter.

 

В C#:

 

ConsoleModifiers cm = ConsoleModifiers.Alt | ConsoleModifiers.Shift;
bool hasAlt1 = (cm & ConsoleModifiers.Alt) == ConsoleModifiers.Alt; // using bitwise operators
bool hasAlt2 = cm.HasFlag(ConsoleModifiers.Alt); // using HasFlag


* This source code was highlighted with Source Code Highlighter.

 

Перегруженные String.Concat и String.Join принимают IEnumerable<T>

 

Мы добавили новые перегруженные версии String.Concat и String.Join, которые принимают IEnumerable в дополнение к существующим перегруженным методам, которые принимают массивы. Это означает, что вы можете передавать любую коллекцию, которая реализует IEnumerable<T> в эти API без лишней конвертации коллекции в массив. Мы так же добавили поддержку params в существующий перегруженный метод  String.Join основанный на массиве, который теперь позволяет вам писать более короткий код.

 

String.Join(", ", new string[] { "A", "B", "C", "D" }); // you used to have to write this
String.Join(", ", "A", "B", "C", "D"); // now you can write this


* This source code was highlighted with Source Code Highlighter.

 

String.IsNullOrWhiteSpace

 

Этот новый удобный метод похож на существующий метод IsNullOrEmpty, но в дополнение к проверке строки на null или пустое значение, он так же проверяет строку на то, содержит ли она одни только пробелы (точнее, символ определенный в Char.IsWhiteSpace). Этот метод может быть полезен при работе с контрактами кода.

 

Дополнения в Environment.SpecialFolder

 

Мы добавили несколько новых значений в перечисление Environment.SpecialFolder:

  • AdminTools
  • CDBurning
  • CommonAdminTools
  • CommonDesktopDirectory
  • CommonDocuments
  • CommonMusic
  • CommonOemLinks
  • CommonPictures
  • CommonProgramFilesX86
  • CommonPrograms
  • CommonStartMenu
  • CommonStartup
  • CommonTemplates
  • CommonVideos
  • Fonts
  • LocalizedResources
  • MyVideos
  • NetworkShortcuts
  • PrinterShortcuts
  • ProgramFilesX86
  • Resources
  • SystemX86
  • Templates
  • UserProfile
  • Windows

Кроме того, мы добавили новый перегруженный вариант метода Environment.GetFolderPath, который принимает перечисление SpecialFolderOption, позволяющее указать некоторые дополнительные опции, такие как “Create” (чтобы создать директорию, если она не существует) и “DoNotVerify” (для быстрого возврата пути без проверки на существование, что полезно когда директория является расшаренным в сети ресурсом).

 

Environment.Is64BitProcess и Environment.Is64BitOperatingSystem

 

Эти новые полезные API упрощают определение битности (bitness) текущего процесса и операционной системы. Environment.Is64BitProcess – это эквивалент вызову IntPtr.Size == 8. Environment.Is64BitOperatingSystem сообщит вам является текущая операционная системы 64-битной. Имейте в виду, что Environment.Is64BitProcess может вернуть false, а Environment.Is64BitOperatingSystem – true в 32-битном процессе запущенном на 64-битной системе под WOW64.

 

Поддержка параметров Path.Combine

 

Вы когда-нибудь делали вложенные вызовы Path.Combine вроде этих:

 

Path.Combine("dir1", Path.Combine("dir2", Path.Combine("dir3", "dir4")));

* This source code was highlighted with Source Code Highlighter.

 

С .NET 4.0 вы можете написать это проще:

 

Path.Combine("dir1", "dir2", "dir3", "dir4");

* This source code was highlighted with Source Code Highlighter.

 

Глобализация при парсинге и форматировании TimeSpan

 

В предыдущих версиях .NET тип TimeSpan поддерживался только для единственного культуро-независимого формата при форматировании и парсинге. Это означало, что когда вы вызывали ToString на французской машине вывод не совпадал с культурными настройками, что делало приложение неглобализованным. Чаще всего эта проблема возникала при отображении результатов из баз данных SQL, которые были представлены в широкоиспользуемом типе колонки Time. Это происходит потому, что Time из SQL отображается в тип TimeSpan в .NET. Например:

 

Thread.CurrentThread.CurrentCulture = new CultureInfo("fr-FR");
Console.WriteLine(new TimeSpan(0, 1, 1, 1, 1));
Console.WriteLine(12.34);


* This source code was highlighted with Source Code Highlighter.

 

Выходные данные:

 

01:01:01.0010000
12,34

 

Выходные данные от TimeSpan.ToString находятся в культуро-независимым формате, так что на выходе исопльзуется '.' (точка) как разделитель для десятичных типов, тогда как Double использует ',' (запятая) основываясь на текущих настройках культуры.

В .NET 4 System.TimeSpan теперь поддерживает форматирование и парсинг основанный на установках культуры через новые перегруженные методы ToString, Parse и TryParse, а так же новые методы ParseExact и TryParseExact. Поведение ToString по умолчанию останется предыдущим и для обратной совместимости будет выводить результаты в старом виде. Новые пергруженные методы позволят вам указывать формат в зависимости от культуры. Вы можете передать “g”-формат (general format) для того, чтобы новый перегруженный вариант ToString использовал культуро-чувствительный формат:

 

Thread.CurrentThread.CurrentCulture = new CultureInfo("fr-FR");
Console.WriteLine(new TimeSpan(0, 1, 1, 1, 1).ToString("g"));
Console.WriteLine(12.34);


* This source code was highlighted with Source Code Highlighter.

 

Выходные данные:

 

01:01:01,0010000
12,34

 

С этим новым форматом, выходные данные результатов TimeSpan совпадают с пользовательскими культурными настройками.

 

Stopwatch.Restart

 

Это новый полезный метод – эквивалент вызова Stopwatch.Reset с последующим Stopwatch.Start.

 

StringBuilder.Clear

 

В предыдущих версиях .NET вы могли очистить StringBuilder установив значение свойства Length в ноль. Это не совсем очевидно, поэтому мы добавили StringBuilder.Clear как более очевидный вариант.

 

IntPtr и UIntPtr и операторы Addition и Subtraction

 

Добавление смещения для IntPtr или UIntPtr могло привести к ошибкам и, елси не было произведено корректно, часто было источником изощренных багов на 64-битных машинах. .NET 4 влючает операции дополнения и уменьшения для этих типов с методами Add и Subtract, для предотвращения такого типа ошибок.

 

ServiceProcessInstaller.DelayedAutoStart

 

Сервисы основанные на .NET, которые запускаются автоматически, теперь могут устанавливать новое свойство DelayedAutoStart в true (рекомендуется), которое позволяет задержать старт сервиса пока загружаются остальные сервисы плюс установить коротку паузу для улучшения производительности загрузки системы при запуске на Vista и выше.

 

Тип ObservableCollection<T> перенесен в System.dll

 

Мы перенесли типы System.Collections.ObjectModel.ObservableCollection<T>, System.Collections.ObjectModel.ReadOnlyObservableCollection<T> и System.Collections.Specialized.INotifyCollectionChanged из WindowsBase.dll (WPF-сборка) в System.dll. Это позволит вам использовать эти типы без зависимости от сборок WPF и улучшит разделение между моделью и представлением.

 

Мы надеемся, что вам понравятся те нововведения, которые мы сделали в BCL в .NET 4 Beta 2. Скачивайте Visual Studio 2010 и .NET 4 Beta 2 сегодня. Дайте нам знать, что вы думаете о этих вещах и сообщайте о багах.


От переводчика:

Это был перевод статьи о нововведениях в .NET 4.0 Beta 2 по сравнению с Beta 1. Для того, чтобы ознакомится с новыми вещами, которые были добавлены в .NET 4 еще во время версий Beta 1 и CTP обратитесь к этой статье. Здесь я приведу только общий список нововведений:

  • Контракты кода (Code Contracts)
  • Параллельные расширения (Parallel Extensions)
  • BigInteger
  • Вариантные аннотации (Variance annotations)
  • Кортежи (Tuples)
  • SortedSet<T>
  • Улучшения в File System Enumeration
  • Отображаемые в памяти файлы (MemoryMappedFiles)
  • Улучшения в функцицонале по работе с реестром
  • Данные глобализации обновлены согласно Unicode 5.1
  • Улучшения в ResourceManager
  • Улучшения в классах сжатия


Источник: http://habrahabr.ru/



Опубликовал admin
26 Окт, Понедельник 2009г.



Программирование для чайников.