C# 7.2 の新機能What's new in C# 7.2

C# 7.2 は、便利な機能が多数追加された、もう 1 つのポイント リリースです。C# 7.2 is another point release that adds a number of useful features. このリリースのテーマの 1 つは、不要なコピーや割り当てを回避して、さまざまな値の型の操作をより効率的に行うことです。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:

この記事の残りでは、各機能の概要について説明します。The remainder of this article provides an overview of each feature. 機能ごとに、その背後にある論拠のほか、For each feature, you'll learn the reasoning behind it. 構文についても説明します。You'll learn the syntax. dotnet try グローバル ツールを使って、これらの機能をご自身の環境で調べることができます。You can explore these features in your environment using the dotnet try global tool:

  1. dotnet try グローバル ツールをインストールします。Install the dotnet-try global tool.
  2. dotnet/try-samples リポジトリを複製します。Clone the dotnet/try-samples repository.
  3. 現在のディレクトリを、try-samples リポジトリの csharp7 サブディレクトリに設定します。Set the current directory to the csharp7 subdirectory for the try-samples repository.
  4. dotnet try を実行します。Run dotnet try.

安全で効率的なコードの機能拡張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 修飾子を追加することは、ソース互換性がある変更です。Adding the ref readonly modifier is a source compatible change, if the return is assigned to a value. 既存の ref return ステートメントに readonly 修飾子を追加することは、互換性がない変更です。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. 既存の struct の宣言に ref 修飾子を追加することは、互換性がない変更です。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. 16 進とバイナリの数値リテラルの先頭に _ を使用できるようになりました。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. たとえば、次のように記述して、2 つの配列のいずれかに含まれる最初の要素の参照を取得できます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.