Небольшие, но полезные возможности .NET 4.0
Много материалов было посвящено главным нововведениям (так называемым kill features) .NET 4.0 - DLR, многопоточность, ко- и контрвариантность, именованные параметры, улучшения с COM объектами, Code Contracts и другое. Я уже хочу рассказать о некоторых менее убойных, но все-таки полезных возможностях, которые появились в новой версии .NET 4.0.
ParseExact, TryParseExact для TimeSpan
Для поддержки различных культур, структура TimeSpan обзавелась новыми методами ParseExact и TryParseExact, а также получила новые перегруженные методы для ToString и TryParse. Они позволяют указать культуру (например, CultureInfo.CurrentCulture).
Пример:
CultureInfo culture = CultureInfo.CurrentCulture; // Parse hours:minute.second value with "G" specifier // and current (en-US) culture. string intervalString = "17:14:48.153"; string format = "G"; if (TimeSpan.TryParseExact(intervalString, format, culture, out interval)) Console.WriteLine("'{0}' --> {1}", intervalString, interval); else Console.WriteLine("Unable to parse {0}", intervalString);
Методами TryParse и TryParseExact также обзавелся тип Guid.
String и StringBuilder
String.isNullOrWhiteSpace позволяет проверить, является ли заданная строка null либо содержит лишь пробелы:
public class Example { public static void Main() { string[] values = { null, String.Empty, "ABCDE", new String(' ', 20), " \t ", new String('\u2000', 10) }; foreach (string value in values) Console.WriteLine(String.IsNullOrWhiteSpace(value)); } } // The example displays the following output: // True // True // False // True // True // True
String.Concat тепер позволяет проводить конкатенацию строк в коллекции элементов без необходимости приведения их к типу string:
List animals = new List(); animals.Add(new Animal("Squirrel", "Rodent")); animals.Add(new Animal("Gray Wolf", "Carnivora")); animals.Add(new Animal("Capybara", "Rodent")); string output = String.Concat(animals.Where( animal => (animal.Order == "Rodent"))); Console.WriteLine(output); // The example displays the following output: // SquirrelCapybara
Новый метод StringBuilder.Clear() очищает текущий объект.
Enums
У emuns появился новое свойство HasFlag для работы с битовыми флагами (чему я лично очень рад, так как раньше приходилось писать отдельную функцию для этого).
Пример:
[Flags] public enum DinnerItems { None = 0, Entree = 1, Appetizer = 2, Side = 4, Dessert = 8, Beverage = 16, BarBeverage = 32 } public class Example { public static void Main() { DinnerItems myOrder = DinnerItems.Appetizer | DinnerItems.Entree | DinnerItems.Beverage | DinnerItems.Dessert; DinnerItems flagValue = DinnerItems.Entree | DinnerItems.Beverage; Console.WriteLine("{0} includes {1}: {2}", myOrder, flagValue, myOrder.HasFlag(flagValue)); } } // The example displays the following output: // Entree, Appetizer, Dessert, Beverage includes Entree, Beverage: True
Раньше надо было использовать что-то типа:
public static bool IsSet(this Enum input, Enum matchTo) { return (Convert.ToUInt32(input) & Convert.ToUInt32(matchTo)) != 0; }
Кроме того, появился новый метод TryParse, что также поможет уменьшить количество телодвижений.
Path.Combine
Просто классное нововведение, которое позволяет соединять любое количество частей пути (я уже давно использую в проектах специальный метод-расширение для этого, но радуюсь встроенной поддержке).
string[] paths = {@"d:\archives", "2001", "media", "images"}; string fullPath = Path.Combine(paths); Console.WriteLine(fullPath);
Согласитесь, так намного лучше чем
string fullPath = Path.Combine(@"d:\archives", Path.Combine("2001", Path.Combine("media", "images"))); Console.WriteLine(fullPath);
или (спасибо, Dmitri)
public static string PathCombine(this string[] paths) { var result = string.Empty; foreach (var path in paths) result = Path.Combine(result, path); return result; }
64-битные системы и процессы
Теперь можно легко узнать тип системы или процесса (x64 или x86) с помощью свойств Environment.Is64BitOperatingSystem и Environment.Is64BitProcess.
А Microsoft.Win32.RegistryView позволит указывать соответствующий ключ при работе с реестром. Кстати, теперь ключи реестра не ограничены длиной в 255 символов.
System.IO.Stream...
...обзавелся (наконец) простым методом записи с одного потока в другой с помощью метода CopyTo.
System.Environment.SpecialFolder заимел новые значения, например, следующий код выведет на экран полный путь к папке System32:
Console.WriteLine("GetFolderPath: {0}", Environment.GetFolderPath(Environment.SpecialFolder.System));
Push Notifications и Lazy
Приложения, использующие механизм push notifications, могут
использовать новые интерфейсы System.IObservable
Для "ленивых" появился новый тип System.Lazy
// Initialize by using default Lazy constructor. The // Orders array itself is not created yet. Lazy _orders = new Lazy(); // Initialize by invoking a specific constructor on Order when Value // property is accessed Lazy _orders = new Lazy(() => new Orders(100));
Сжатие данных
Были улучшены алгоритмы сжатия для классов System.IO.Compression.DeflateStream и System.IO.Compression.GZipStream и убрано ограничение на 4-гигабайтный размер файла.
Это не все "минорные" нововведения, но, если тема интересная, то, думаю, мы к ней еще вернемся.
Компании из статьи
Microsoft Украина | Украинское подразделение компании Microsoft. |