C# 7.2 – Новые возможности
Стала доступная вторая минорная версия C# под номером 7.2. Для использования новых возможностей необходимо обновить Visual Studio 2017 до версии 15.5 (Update 5).
Модификатор доступа private protected
Добавлен новый вариант модификаторов доступа: private protected (или protected private). Отмеченные им члены класса будут доступны для как внутри самого класса, так и для наследников, расположенных в той же сборке.
Именованные аргументы
Именованные аргументы разрешено использовать в начале или середине списка аргументов, при условии что они находятся на своей позиции. Например:
public User FindUser(string firstName, string lastName = null, int? age = null) { … }
client.FindUser(firstName: "John", "Doe", age: 30);
client.FindUser("John", lastName: "Doe", 30);
Нижнее подчеркивание в цифровых литералах
Допускается использование символа “нижнее подчеркивание” в начале шестнадцатеричных и бинарных литералов.
int binaryValue = 0b_0111_1101;
Новая семантика значимых типов
C# 7.2 позволяет определять следующие новые варианты поведения значимых типов:
in– указывает параметр метода, который используется как входящий и его значение будет передано по ссылке. Запрещено изменять это значение в теле метода.ref readonly– возвращает значение значимого типа по ссылке, но запрещает вызывающей стороне его изменять. Операция просвоения создает копию такого объекта, на которую запрет не распространяется.readonly struct– определяет неизменяемую структуру со свойствами доступными только для чтения. Компилятор выдаст ошибку про наличии изменяемых полей или свойств.ref struct– определяет структуру, которая может быть создана только в стеке и запрещает ее создание в куче. Из этого следует, что она:- не может быть подвержена боксингу;
- не может использоваться в качестве членов обычной структуры или класса;
- не может объявляться в асинхронных методах (но может быть в методах возвращающих
Task,Taskи обобщенные типы; - не может применяться в итераторах;
- не может быть захвачена в лямбда выражениях или локальных методах.
Примеры:
public struct Point
{
private static Point _zero = new Point() { X = 0, Y = 0 };
public static ref readonly Point Zero => ref _zero;
public int X { get; set; }
public int Y { get; set; }
public double DistanceFrom(in int x, in int y) {
x = 2; // эта строка вызовет ошибку компиляции
…
}
}
public readonly struct Vector
{
public int X { get; }
public int Y { get; }
public Vector(int x, int y)
{
this.X = x;
this.Y = y;
}
}
public ref struct Point3D { … }