6の言語仕様自体はオープン化前から大筋が決まっていました。7は、仕様を決めるかなり早い段階からすべてがオープンとなる初めてのバージョンになります。7以降のC#の大きなテーマとしては以下のようなものがあります。7にはその最初の一歩となる機能がいろいろと追加されています。この大きなテーマ以外にも、こまごまとして改善が何点かあります。7の仕様策定・実装の真っ最中です。状況は以下のページで確認できます。伝統的なオブジェクト指向的な発想は多くの場面で有用ですが、別の発想を持つ方が好ましい場面もあります。オブジェクト指向では、具体的なデータは隠蔽し、メソッド越しにデータを操作します。振る舞い中心(behavior-centric)な設計になります。一方で、関数型言語では、純粋なデータ(C#でいうとpublicなフィールドだけの構造体とか)を最初に用意して、そのデータを変化させる関数を作ったりします。データ中心(data-centric)な設計です。この2者は相補的なものです。C#はまだまだ前者(振る舞い中心)に寄っているので、もっと後者(データ中心)になじむ構文が必要になります。7では、タプルや型スイッチなどの機能が入ります。8以降で検討されている機能につながっていきます。型には常によい名前が付くわけではなく、名無しにしておきたいことがあります。7で導入されたタプル(tuple)です。タプルの最大の用途は多値戻り値です。関数の戻り値は引数と対になるものなので、タプルの書き心地は引数に近くなるように設計されています。以下のように書けます。}}詳しくは「タプル」で説明します。分解タプルは、メンバー名だけ見ればその型が何を意味するか分かるからこそ型に名前が付かないわけです。このとき、その型を受け取る変数にも、よい名前が浮かばなくなるはずです。実際、前節ではtという特に意味のない名前の変数で値を受け取っています。sumに分解して戻り値を受け取りたいです。7では、そのための分解構文(deconstruction)も追加されました。前節のコードを、分解を使うように書き換えると以下のようになります。Tally(data);Console.WriteLine($"{sum}/{count}");ちなみに、分解はタプル専用の構文ではなく、以下のように、Deconstructという名前のメソッド(拡張メソッドでも可)を持っている型なら何にでも使うことができます。出力変数宣言タプルが入るまで、複数の戻り値を返すためには出力引数を使っていました。7では既存の出力引数にも利便性向上のための機能が追加されました。declaration。out-var)です。以下のように、out引数を受け取ると同時に、式の中で変数宣言できるようになりました。いう意味では、出力変数宣言はタプルと相補的な関係にあります。マッチングというより大きな機能に発展するものです。詳しくは「出力変数宣言」で説明します。7で、is演算子やswitchステートメントのcaseが拡張されて、以下のような機能が入りました。switch)と呼びます。以下のような書き方ができます。break;}詳しくは「型スイッチ」で説明します。演算子の拡張と[出力変数宣言]では、式の中で変数宣言ができます。式は割かしどこにでも書けるものなので、実質的に、ほぼどこででも変数宣言できるようになりました。そこで問題になるのは、式の中で宣言した変数のスコープがどうなるかです。case内」ということになっています。詳しくは「is演算子の拡張と出力変数宣言で作った変数のスコープ」を参照してください。受け取る必要のない余剰の値が生まれたりします。分解では、複数の値のうち、1つだけを受け取りたい場合があったとします。いう場合に、_を使うことで、値を受け取らずに無視することができます。11);}同様の機能は、型スイッチや出力変数宣言でも使えます。詳しくは「値の破棄」を参照してください。パフォーマンス改善C#にとって一番重要視しているのは生産性の高さで、書きやすさ、読みやすさなどが一番大事です。パフォーマンスへの配慮も大事です。書きやすくても、出来上がったものがあまりにも遅いと言語の魅力は半減するでしょう。近年では、C#の用途も増え、パフォーマンスが求められる場面が増えています。次期C#とパフォーマンス向上それに、生産性を損なわずとも、パフォーマンス向上に関してできることもまだまだあるはずです。7では、パフォーマンス向上を目的とした新機能がいくつか入っています。いくつかは、かつてマイクロソフト内で動いていた、Midoriという研究プロジェクトの成果から来ているようです。コードをベースとしたOSを作ろうというプロジェクトでした。OSのような低レイヤーのソフトウェアを作る以上、パフォーマンスは非常に重要です。プロジェクト自体は閉じられましたが、その成果は、.NETやC#に取り込まれようとしています。7で入るものの多くが、値型と参照渡しを活用したメモリ管理の効率化になります。戻り値とローカル変数でも参照渡しを使えるようになりました。書き方はほぼ参照引数と同じです。戻り値の型の前、値を渡す側、値を受ける側それぞれにref修飾子を付けます。うち、大きい方の参照を返す。