С выходом очередного обновления 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, что блокирует их загрузку вместо рабочих сборок в приложениях.