11 декабря 2017
Возможности C#
Стала доступная вторая минорная версия 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<T> и обобщенные типы;
- не может применяться в итераторах;
- не может быть захвачена в лямбда выражениях или локальных методах.
Примеры:
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 { … }