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

C# logoСтала доступная вторая минорная версия 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 { … }


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