Новые возможности C# 7.2What's new in C# 7.2

В очередной версии C# 7.2 реализован ряд новых полезных возможностей.C# 7.2 is another point release that adds a number of useful features. Одной из основных задач этого выпуска стало повышение эффективности работы с типами значений за счет исключения избыточных операций копирования и выделения памяти.One theme for this release is working more efficiently with value types by avoiding unnecessary copies or allocations.

Остальные нововведения реализованы преимущественно для удобства.The remaining features are small, nice-to-have features.

В C# 7.2 предусмотрен элемент управления выбором версии языка, с помощью которого можно задать версию языка компилятора.C# 7.2 uses the language version selection configuration element to select the compiler language version.

Новые языковые функции в этом выпускеThe new language features in this release are:

Улучшения для написания безопасного и эффективного кодаSafe efficient code enhancements

Представленные в версии 7.2 языковые функции обеспечивают работу с типами значений с использованием семантики ссылок.Language features introduced in 7.2 let you work with value types while using reference semantics. Благодаря этому удается повысить производительность за счет использования минимального числа операций копирования типов значений без выделения памяти в связи с применением ссылочных типов.They are designed to increase performance by minimizing copying value types without incurring the memory allocations associated with using reference types. В число новых возможностей входят:The features include:

  • модификатор in для параметров, указывающий, что аргумент передается по ссылке, но не изменяется вызываемым методом;The in modifier on parameters, to specify that an argument is passed by reference but not modified by the called method. Добавление модификатора in к аргументу является изменением, совместимым на уровне исходного кода.Adding the in modifier to an argument is a source compatible change.
  • модификатор ref readonly для возвращаемого значения метода, указывающий, что метод возвращает значение по ссылке, но не допускает операции записи в соответствующий объект;The ref readonly modifier on method returns, to indicate that a method returns its value by reference but doesn't allow writes to that object. Добавление модификатора ref readonly к аргументу является изменением, совместимым на уровне исходного кода, если оператору return присваивается значение.Adding the ref readonly modifier is a source compatible change, if the return is assigned to a value. Добавление модификатора readonly к существующему оператору return ref является несовместимым изменением.Adding the readonly modifier to an existing ref return statement is an incompatible change. Требуется указать вызывающие объекты, чтобы добавить модификатор readonly в объявление локальных переменных ref.It requires callers to update the declaration of ref local variables to include the readonly modifier.
  • объявление readonly struct, указывающее, что структура является неизменяемой и должна передаваться в методы члена как параметр in;The readonly struct declaration, to indicate that a struct is immutable and should be passed as an in parameter to its member methods. Добавление модификатора readonly к существующему объявлению структуры является двоично совместимым изменением.Adding the readonly modifier to an existing struct declaration is a binary compatible change.
  • объявление ref struct, указывающее, что тип структуры обращается напрямую к управляемой памяти и всегда должен обрабатываться с выделением стека.The ref struct declaration, to indicate that a struct type accesses managed memory directly and must always be stack allocated. Добавление модификатора ref к существующему объявлению struct является двоично совместимым изменением.Adding the ref modifier to an existing struct declaration is an incompatible change. Объект ref struct не может быть членом класса или использоваться в других местах, где он может выделяться в куче.A ref struct cannot be a member of a class or used in other locations where it may be allocated on the heap.

Дополнительные сведения обо всех эти изменениях см. в статье о том, как писать безопасный и эффективный код.You can read more about all these changes in Write safe efficient code.

Неконечные именованные аргументыNon-trailing named arguments

В вызовах методов после находящихся в правильной позиции именованных аргументов теперь можно использовать позиционные аргументы.Method calls may now use named arguments that precede positional arguments when those named arguments are in the correct positions. Дополнительные сведения см. в разделе Именованные и необязательные аргументы.For more information see Named and optional arguments.

Начальные символы подчеркивания в числовых литералахLeading underscores in numeric literals

Из-за того, как в версии C# 7.0 была реализована поддержка разделителей между знаками, в качестве первого знака в значении литерала нельзя было использовать символ _.The implementation of support for digit separators in C# 7.0 didn't allow the _ to be the first character of the literal value. Теперь шестнадцатеричные и двоичные числовые литералы могут начинаться со знака _.Hex and binary numeric literals may now begin with an _.

Например:For example:

int binaryValue = 0b_0101_0101;

private protected — модификатор доступаprivate protected access modifier

Новый составной модификатор доступа private protected указывает, что доступ к члену может осуществляться содержащим классом или производными классами, которые объявлены в рамках одной сборки.A new compound access modifier: private protected indicates that a member may be accessed by containing class or derived classes that are declared in the same assembly. В отличие от модификатора protected internal, который разрешает доступ производным классам или классам из той же сборки, private protected ограничивает доступ только для производных классов, объявленных в рамках одной сборки.While protected internal allows access by derived classes or classes that are in the same assembly, private protected limits access to derived types declared in the same assembly.

Дополнительные сведения см. в разделе Модификаторы доступа в справочнике по языку.For more information see access modifiers in the language reference.

Условные выражения refConditional ref expressions

Результат условного выражения может быть ссылкой, а не значением.Finally, the conditional expression may produce a ref result instead of a value result. Например, можно написать следующий код, чтобы получить ссылку на первый элемент в одном из двух массивов:For example, you would write the following to retrieve a reference to the first element in one of two arrays:

ref var r = ref (arr != null ? ref arr[0] : ref otherArr[0]);

Переменная r — это ссылка на первое значение в arr или otherArr.The variable r is a reference to the first value in either arr or otherArr.

Дополнительные сведения см. в описании условного оператора (?:) в справочнике по языку.For more information, see conditional operator (?:) in the language reference.