++C++; // 未確認飛行 C ブログ

http://ufcpp.net/

Archive for 2月 4th, 2015

C# 7に向けて(4): C# 6に漏れた分

with 2 comments

元々、C# 6として(Visual Studio 2015と同じスケジュールで)入る予定だった機能のうちのいくつかは、期間的な問題でいったん仕様から外れました。そのうちいくつかは本当に単なる工数の問題で、ほぼ当時の仕様そのままに、C# 7に入りそうです。そういった類の機能に関する話も、今日、GitHub 上の issue 化されました。

あと、InternalImplementationOnly 属性ってのが、追加で(こちらはC# 6に間に合わせて)入りそうです。

もう1個、昨日、pattern matching と record types の仕様も issue になったみたいですが、これは CodePlex 時代から少し仕様が変わっているみたい。大きな機能なので別途1記事使って何か書く予定。今日はこの話はスルー。

Binary literal

2進数リテラルを入れたいという話。現状の16進数リテラルとほぼ同じ構文で、x/X が b/B に変わるだけ。0b00010101 みたいな。

構文解析の実装コストが少々かかる程度で、特に大きな問題もないはず。知らない人が見て一瞬「b って何だ?」って思う程度で、まあ、すぐになじめそうですし。

むしろなぜこんなちょろそうな機能が「期間的な問題でいったん外す」判定を受けたのか…

Digit separators

同上。ちょろい機能その2。10進、16進、2進問わず、数字の間に _ を挟んでも OK になるという機能。33_554_432、0x1b_a0_44_fe, 0b_1001_1010_0001_0100 など、好きなところに _ を挟んでください。

2進数リテラル以上に実装コストが低い(数値解釈の文脈に入ったら _ を無視するだけ)。

議論の余地があるとしたら、科学表記リテラル(1.2e-10 みたいなやつ)で使えるの?というあたり。

追記: あと、issue についているコメントを見ていると、区切り文字を何にするかももめそう。というか「(できるかはわからないけど)スペース区切りを認めてくれ」という話が。さすがに、スペースで区切られた複数トークンで1リテラルとかキモイというか、他の構文との兼ね合いで問題出そうというか。

Declaration Expressions

変数宣言を式のど真ん中に書けるようにしようっていうやつ。用途や構文が少し被り気味の pattern matching が入ることになったので、そっちとの兼ね合いでいったん外すことになったもの(pattern matching がC# 7での実装送りになったので、それと同じスケジュールに)。

構文自体は割ともう固まっているんですが、問題は、これで作った変数のスコープをどこまでにするか。if-else の条件式のところで書いたものは else 句内で使えるべきかとか、そういう辺りが中々難しい問題で、結構難航しそう。

InternalImplementationOnly 属性

インターフェイスには、後から実装を足すと、利用者側に破壊的変更を引き起こすという欠点があります。一度 public にしたら、(少なくともユーザーが付いてしまったら)変更できません。既存機能を壊すような変更はおろか、単純な追加さえできません。

これは、第三者がインターフェイスを実装すると起きる問題なわけですが。一方で、たまに、「赤の他人に実装してほしいわけじゃなくて、自分が書いた実装クラスの詳細を隠したいから一段階インターフェイスを挟んでいるだけ。他の人には実装させたくない」というようなインターフェイスの使い方をします。この場合、

  • 実装を隠す意図なので、実装が変わった時にインターフェイスの側も修正したい
  • 他人に実装させる気はないので、これを禁止できれば、インターフェイスも変更し放題

という要求が生じます。

この「禁止」のために、新たに InternalImplementationOnly 属性を定義して、これが付いているインターフェイスは同一アセンブリ内でしか実装できないように、C#/VB コンパイラーに手を入れたいとのこと。

これは、C# 6/Visual Studio 2015 に間に合わせたいそうです。というのも、Roslyn 中でまさにこういうインターフェイスの使い方(ISynbol インターフェイス)をしていて、こいつの第三者による実装が生まれてしまうと困るので、Roslyn 正式リリース(= Visual Studio 2015 正式リリース)までの対応が必要。

Written by ufcpp

2015年2月4日 at 21:09

カテゴリー: C#

Tagged with