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;
- Stream.CopyTo;
- Guid.TryParse, Version.TryParse, and Enum.TryParse;
- Enum.HasFlag;
- перегруженные String.Concat и String.Join принимают IEnumerable;
- String.IsNullOrWhiteSpace;
- дополнения в Environment.SpecialFolder;
- Environment.Is64BitProcess и Environment.Is64BitOperatingSystem;
- поддержка параметров Path.Combine;
- глобализация при форматировании и разборе TimeSpan;
- Stopwatch.Restart;
- StringBuilder.Clear;
- дополнения в IntPtr и UIntPtr и операторы Subtraction;
- ServiceProcessInstaller.DelayedAutoStart;
- тип ObservableCollection перенесен в 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
System.IObservable и System.IObserver реализуют основной механизм для push-уведомлений и могут исопльзоваться для создания push-коллекций или по-другому – наблюдаемых (observable) коллекций. Любой, кто знаком с паттернами, узнает в этих интерфейсах реализацию широкоизвестного паттерна наблюдатель (observer). IObservable приоткрывает дверь для новых замечательных парадигм разработки на .NET основанных на событиях и асинхронном программировании. Отличный пример этому – Reactive Framework (RX), библиотека методов расширения (не входит в .NET 4), которая реализует операторы LINQ Standard Query Operators и другие полезные потокоизменяющие (stream transformation) функции для IObservable. События первого класса (first-class) F# [прим. перев.: больше о first-class событиях и чем они отличаются от событий .net можно почитать в этой заметке] так же поддерживают IObservable и, кроме того, F# содержит библиотеку операторов для обозревателей похожую на RX. Представьте себе возможность создавать LINQ-запросы к событиям, это как раз то, что IObservable позволяет делать. Для закрепления знаний о силе IObservable я рекомендую посмотреть серию видео Эрика Мейджера “Знакомство с RX” (Erik Meijer introducing RX) на Channel 9 и обсуждение discussing IObservable in the BCL между Везом Дайером (Wes Dyer) и Ким Гамильтон (Kim Hamilton).
Вы могли подумать, что IObservable приходит на замену событиям в .NET. Однако, ответ: “нет”, но вы и в самом деле можете использовать IObservable вместо событий, если захотите. События – это хорошо известный механизм уведомлений в .NET и он отлично знаком .NET-разработчикам. Поэтому, мы рекомендуем продолжать использовтаь события как основной механизм уведомлений для .NET API. Одна из самых классных вещей в IObservable – это то, что конвертация существующего события в IObservable – простейший процесс. 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
Мы добавили метод 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(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
Мы добавили новые перегруженные версии String.Concat и String.Join, которые принимают IEnumerable в дополнение к существующим перегруженным методам, которые принимают массивы. Это означает, что вы можете передавать любую коллекцию, которая реализует IEnumerable в эти 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.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 перенесен в System.dll
Мы перенесли типы System.Collections.ObjectModel.ObservableCollection, System.Collections.ObjectModel.ReadOnlyObservableCollection и 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
- Улучшения в File System Enumeration
- Отображаемые в памяти файлы (MemoryMappedFiles)
- Улучшения в функцицонале по работе с реестром
- Данные глобализации обновлены согласно Unicode 5.1
- Улучшения в ResourceManager
- Улучшения в классах сжатия