Небольшие, но полезные возможности .NET 4.0

четверг, 13 мая 2010, Александр Краковецкий

Много материалов было посвящено главным нововведениям (так называемым 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.IObserver<T>.

Для "ленивых" появился новый тип 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 Украина


Сайт:
http://www.microsoft.com/ukr/ua/

Microsoft Украина Украинское подразделение компании Microsoft.

Ищите нас в интернетах!

Комментарии

Свежие вакансии