Новые возможности в C# 7.1

C# logoС выходом очередного обновления Visual Studio 2017 до версии 15.3 (Update 3) стала доступна первая минорная версия C# под номером 7.1. Посмотрим что нового появилось в языке с ее появлением.

Асинхронный метод Main

В C# 7.1 стало возможно объявлять асинхронный метод Main(…) в консольных приложениях. Доступны следующие варианты:

static [async] Task Main()

static [async] Task<int> Main()

static [async] Task Main(string[])

static [async] Task<int> Main(string[])

Не смотря на то, что Main(…) теперь может возвращать Task, его имя осталось без суффикса Async.

При этом компилятор генерирует следующую обертку для асинхронного метода:

public static async Task Main()
{
    ...
}

[SpecialName]
private static void <Main>()
{
    Program.Main().GetAwaiter().GetResult();
}

Автоматический вывод имен свойств в кортежах

Компилятор может автоматически вывести имена свойств в кортежах (тип Tuple). Теперь можно написать следующий код:

public class User
{
    public int Id { get; set; }
    public string Name { get; set; }
    // Другие свойства здесь
}

var activeUsers = users.Select(u => (u.Id, u.Name)).OrderBy(u => u.Id);

В предыдущих версиях в вызове OrderBy(…) были доступны только стандартные свойства Item1 и Item2, т.к. имена свойств не были заданы явно.

Допускается указание имен отдельных свойств. Например, в следующем примере автоматически будет выведено только имя свойства Name.

var activeUsers = users.Select(u => (UserId: u.Id, u.Name)).OrderBy(u => u.UserId);

Упрощенная запись default(T)

Теперь можно использовать ключевое слово default без указания типа. Например:

int userId = default; // эквивалентно int userId = default(int);
bool isDefault = int.Equals(userId, default); // эквивалентно int.Equals(userId, default(Object));

Во второй строке default будет использовать тип Object т.к. это тип параметра вызываемого метода:

public static bool Equals(Object objA, Object objB)

Использование обобщённых типов при сопоставлении с образцом

Начиная с C# версии 7.1 разрешено использование обобщённых (generic) типов при сопоставлении с образцом (pattern matching). Например следующий код не скомпилируется в C# 7.0, но рабочим в C# 7.1:

public interface ICompany { … }
public class ForeignCompany : ICompany { … }
public class LocalCompany : ICompany { … }

public void ProcessCompnayData<T>(T company)
    where T : ICompany
{
    switch (company) {
        case ForeignCompany foreignCompany:
            break;

        case LocalCompany localCompany:
            break;

        default:
            throw new ArgumentException("Unknown company type");
    }
}

Ссылочные сборки

Ссылочные сборки (Reference assemblies или Ref assemblies) это сборки содержащие только метаданные. В них

  • сохранены
    • зависимости от других библиотек;
    • публичные типы и их публичные методы, но при этом тела этих методов заменены на throw null;
    • приватные и сложенные классы;
    • виртуальные методы;
    • явные реализации интерфейсов, свойств и событий.
    • атрибуты, включая внутренние (internal);
    • структуры и их поля.
  • удалены
    • приватные методы всех типов.

Для создания такой сборки добавлено два взаимоисключающих ключа компилятора:

  • /refout – указывает путь до файла, в котором будет сохранена ссылочная сборка. Рекомендуется чтобы имя файла совпадало с именем рабочей сборки, а сам находился в папке ref отно��ительно нее. Сама рабочая сборка при этом так же создается.
  • /refonly – создает только ссылочную сборку, на месте рабочей.

Ссылочные сборки содержат атрибут ReferenceAssembly, что блокирует их загрузку вместо рабочих сборок в приложениях.

Добавить комментарий