本サイトからスピンオフした姉妹サイトです。2015正式版のリリースで利用可能になったC#言語の最新バージョン「6.0」の新機能を解説する。5→正式版に合わせて改訂。2015*1で利用可能になっている。Platform」(コード名:“Roslyn”)と呼ばれる新しいコンパイラーが導入されており、静的解析APIの提供など、コンパイラーまわりに大きな変更が行われている。5.0に比べると、一つ一つの新機能自体は小さい。それらはプログラムをより書きやすくするための機能なので、C#開発者にとってはやはり重要なアップデートとなっている。これらの新機能に関する議論は、2014年4月より公開された場所(今年1月まではCodePlex、それ以降はGitHub)で行われていた。Notesの結果がGitHubのIssueに投稿されており、今後さらにオープンにしていくことが検討されている)。6.0の新しい言語機能を解説する。正式版にリリースに合わせて、内容を見直し、最新の情報に改訂したものである。自動実装プロパティの初期値を記述できるようになった。初期値はフィールドに直接代入され、Setterが実行されるわけではない。その他のインスタンスフィールド同様、記述された順に実行される。他のフィールド同様、thisで自身のインスタンスを参照することはできない(※thisをつけずに参照しても同じである)。全てのフィールドの初期化が完了してから、オブジェクトの初期化が完了し、thisで参照できるようになるからである。BI_1_2_Person(){}}Getterのみの自動プロパティ自動実装プロパティに初期値を渡して初期化できるようになった。Getterのみの自動プロパティは、バッキングフィールドがreadonlyとして扱われるのだが、先に紹介した「自動プロパティの初期化」による初期値を与える方法(B)、もしくはコンストラクター内での初期値の代入によって(A)、初期化ができるようになった。5.0までは、readonlyなプロパティを作成するときには自動実装プロパティは使えなかった。Immutableなクラス(=不変クラス。オブジェクトを初期化した時点でプロパティやフィールドの値が確定し、変更されないクラス)を実装したいときは、自動実装プロパティが使えなかった。この機能により、ImmutableなクラスでもMutableなクラス同様、自動実装プロパティにより実装できる。members(ラムダ式本体によるメンバーの記述)式形式のラムダ式の本体(=ラムダ演算子=>の右側が{}でくくられるステートメントではなく、式であるものの、式本体)を、メソッドやプロパティの本体の記述に使えるようになった。voidの場合も記述できる。p.Y);}ラムダ式本体によるメソッドの記述メソッド本体の記述として、ラムダ式本体を利用できる。サンプルコードにあるように、基本的には副作用が生じず、何か値を返すだけのメソッドで利用することが想定されている。このような想定があるため、コンストラクター/イベント/デストラクターでは使えない。members(ラムダ式本体によるプロパティの記述)メソッドだけではなく、プロパティやインデクサー本体の記述にもラムダ式本体が利用できる。この記述方法を使った場合、自動的にGetterのみとなり、getキーワードは不要である。staticディレクティブを使って定義すると、クラス名を指定せず、メソッドのみを記述できるようになった。System.ConsoleクラスやSystem.Mathクラスなどが代表的な利用対象だろう。staticではなく通常の名前空間と同じusingキーワードだった)。staticは使えない。staticすることができる。operatorsになるようである。?.という演算子を導入し、機能としては、?.の前がnullであればnullを返し、nullでなければ後続の処理結果を返す、という機能である。}}}Null条件演算子Null条件演算子の返す方は、右辺の返す型がオブジェクトであればそのまま、値型や構造体であればNull許容型(例えばint?など)になる。delegate型のオブジェクトに対してはInvokeメソッドを通じて、そのデリゲートのメソッドを実行できる。一度、ローカル変数に格納した上で、nullチェックをして実行されるため、スレッドセーフな呼び出しになる。5.0までは「ローカル変数への格納」「nullチェック」「メソッド呼び出し」と3行の記述が必要だったのが、Null条件演算子を使うと1行で簡潔に記述できるようなった。interpolationはstring(あるいはIFormattable)型の値を、文字列リテラルだけで完結して記述するための機能である。5.0まではString.Formatメソッドで同様のことができていたが、文字列内の置換変数と置換対象が離れており分かりづらいのに加えて、置換変数のインデックスと、置換対象の可変長引数の順番や数が一致しないバグが起きやすかった。interpolationが導入された。使い方は、それぞれ下の行に書いている同等の意味を持つ「string.Formatを使った記述方法」と比べてほしい。文字列リテラルの引用符(")の前に$を付けて記述する。逐語的文字列リテラルと併用することも可能で、その場合は@の前に$をつける。string.Formatでは{0}と可変長引数のインデックスを指定したところを、直接NameやPriceといったプロパティ名(およびフィールド変数名やローカル変数名など)を指定して記述する。右揃えや通貨形式といった書式指定をすることもできる。文字列としての{や}を記述したい場合は、{{や}}のように2つ重ねることでエスケープ指定する。)でくくると三項演算子として解釈されるようになる。4.6でのみ利用可能な機能がある。"でくくられたリテラルは通常、string型のインスタンスとなる。4.6で、かつ代入先の変数の型をIFormattableにすると、その変数はIFormattableインターフェースを実装した型のインスタンスになる。この機能を利用すると、以下のようにカルチャを指定した書式変換ができるようになる。現在のカルチャで変換。operators(nameof演算子)nameof演算子は式を与えて、その式の名前を文字列で返す演算子である。単純には、変数やプロパティ、メソッドなどの式をnameof演算子に与えると、それらの名前を文字列として取得できる。実際に指定できるものは式になるが、一見、式のように見えて式ではないためnameof演算子に使えないものもある。具体的には下記のサンプルコードを見てほしい。pointerは使えないConsole.WriteLine(nameof(Buffer*));}nameof演算子System.Int32は指定できるが、組み込み型であるintは指定できない。bool、objectなども同様である。以前までは型制約を空白にして指定したものが使えなくなり、具体的な型を指定しないといけないようになった。nameof演算子の主な目的は、変数名の文字列が必要な場所で今まで文字列を指定していたため、IDEのリファクタリング機能などが使えなかったところを使えるようにすることである。いくつかnameofを活用できる例を挙げてみる。TValue>に代表されるインデックスアクセス可能なオブジェクトを初期化する際に使える、新しい記法が導入された。これにより、通常のオブジェクト初期化子によるプロパティの初期化と同じ記法で初期化できるようになった。コレクション初期化子も今まで通り利用可能。filtersが実装された。例外処理のcatch節にwhen節を記述すると。if節の条件がtrueの場合のみ、そのcatchブロック内が実行される。filtersはStackTraceを変更しないので、例外をキャッチ&リスローするより都合のいいことがある。5時点ではcatchの条件を指定するのにif節を使ったが、when節に変更されているので注意してほしい。WebExceptionStatus.RequestCanceled){Console.WriteLine("リクエストがキャンセルされました");}catch{Console.WriteLine("その他のエラー");}}例外フィルターwhen節には条件しか書けないが、bool値を返すメソッド内で副作用を伴う処理も実行できる。filtersで副作用を伴うのは分かりづらくなることもあるが、StackTraceを変更しない点を活用してロギングに用いることもできる。5.0で導入されたasync/awaitだが、catchおよびfinallyブロック内でawaitできないという仕様があった。このため、非同期メソッド(下記の例ではSendAsyncメソッド)で例外発生時に、非同期メソッド(例ではRetryAsyncメソッド)でリトライしたい場合や、リソース解放処理が非同期メソッド(例ではCloseAsyncメソッド)になっている場合には、catchおよびfinallyブロック内でそういった非同期メソッドを呼ばないように工夫をする必要があった。6.0ではcatchおよびfinallyブロック内でawaitできるようになったので、非同期メソッドが呼び出せる。5時点では新機能として実装されていたが、正式版では実装が見送られることになった。initializers(コレクション初期化子内でのAdd拡張メソッドの利用)コレクション初期化子で追加される要素は、(その内部では)Addメソッドを実行して追加処理が行われる。そのため、Addメソッドを持たないクラスは、コレクション初期化子で初期化できなかった。6.0でこの挙動が変更され、拡張メソッドが定義されていればコレクション初期化子が利用できるようになった。resolution(オーバーロード解決の向上)「定義されたオーバーロードメソッドのうち、どのメソッドを実行するか決定するオーバーロード解決を向上した」と記述されている。どのように向上して、挙動がどう変わったかについての詳細な言及は今のところ公式には確認できていない(※本節の以下の説明は2015/7/24に追記しました)。このオーバーロード解決の向上は、C#のバージョンが上がるたびに行われており、より「優れている(betterness)」ように改善されている。6.0で改善されていることが指摘されている。6.0)ではコンパイルできる。6.0でコンパイルエラーが出ないように、オーバーロード解決が向上した。5.0では、メソッドグループを引数に指定したところ、ActionとFunc<int>の間の解決があいまいになり、かつActionの場合の返り値がvoidであるため、メソッドの結果を変数に代入しているところでもエラーになる。6.0では、返り値の型まで参照して、より良いFunc<int>にオーバーロードが解決されている。Disable(#pragmaによるユーザー定義コンパイラー警告の抑止)“Roslyn”と呼ばれる新しいコンパイラープラットフォームにより、誰でもコンパイラー警告を増やせるようになった。「#pragma(プラグマ)」と呼ばれる機能でコンパイラー警告を抑止する機能があったが、この機能をユーザーが定義したコンパイラー警告に対しても利用できるようにした。6.0で追加された新機能である。“Roslyn”が2014年4月にリリースされた時点で予定されていた機能と比べると、少なく・小ぶりになっているのに気付かれた方もいるかもしれない。これは、最新バージョンのC#および.NETの最大の目標が“Roslyn”という新しいコンパイラープラットフォームを導入することにあり、安定した“Roslyn”のリリースを優先しているためでもある。Studio」というIDEでの新機能の支援まで対応してからリリースしている。これは、「C#」という言語の特徴だといえるだろう。2015正式版のリリースで利用可能になったC#言語の最新バージョン「6.0」の新機能を解説する。5→正式版に合わせて改訂。Codeで利用可能になったC#言語の新バージョン「7.0」の新機能を、公開されている議論を基に解説。前編として「データ中心設計」に関連する4つの新機能を説明する。Codeで利用可能になったC#言語の新バージョン「7.0」の新機能を、公開されている議論を基に解説。前編として「パフォーマンス向上」と「コード記述の単純化」に関連する6つの新機能を説明する。機械学習エンジニアを目指す人~初中級者のための技術情報サイトです。「機械学習&AI」「クラウド&ビッグデータ」「IoTデバイス」のネット記事情報を共有中。開発者のためのSlackチーム、作りました:「機械学習&AI」「クラウド&ビッグデータ」「IoTデバイス」のネット記事情報を共有中。2020最適なビューへの切り替えを推奨します:スマートフォン用表示に。