C# 7思い出話

C# によるプログラミング入門に、ちらほらとC# 7の話題を書き始めたわけですが。

まあ、入門なんで仕様として固まったものだけを書いていくつもりです。ある程度固まりそうな段階まで書かないし、結局予定から漏れたものは修正したり。

一方で、その仕様が固まるまでにあった流れなんかも、ブログに残しといてもいいかなぁとか思ったり。

ってことで、「C# 7思い出話」なんていうカテゴリー付けて、ブログでも書いてみようというのが今回の話。 さしあたって、今、入門に書いたのが、

の2つなので、今日はこの2つ。

2進数リテラルと数字区切り文字

こういう機能。

var million = 1_000_000;
var abcd = 0b1010_1011_1100_1101; // 特に2進数リテラルで有用
var abcd2 = 0xab_cd;              // 16進数リテラルにも使える
var x = 1.123_456_789;            // 浮動小数点数リテラルにも使える

2進数リテラルと数字区切り文字の2つはセットですね。 2進数って普通に書いたらむちゃくちゃ大きな桁数になりますし。 そりゃ、区切らないと読めた代物じゃない。

この2つの機能、「C# 7」としては「気が付いたらいつの間にか実装があった」って感じです。 特に「実装したよ」アナウンスもなく、pull-requestも見かけず。

そもそも、「C# 7の最初の設計ミーティング」でちょこっと「ページ内検索してみたら確かに書かれてる」程度の地味な取り上げられ方してただけ。機能的にも小さなものなので、提案ページもすごく簡素。

それも当然でして、この機能はC# 6の頃からあったから。 要するに、「C# 6の頃から試験的な実装あったけど、結局C# 6には入れなった」というもの。 仕様的に何か問題があったわけでもなくて、単純に「優先度低、スケジュール的に後回し」。 という話が、今稼働してるGitHubのリポジトリじゃなくて、昔懐かしCodePlex時代にありました。

まあ、こういう、低コスト・低リターン機能は後回しになりがち。

実装するのは低コストと言っても、仕様的に問題ないかをよく考えたり、実際試してみる期間を設けるのはそれなりに大変です。 CodePlex上で、以下のようなディスカッションがあった記憶があります。

  • 区切り文字は _ でいいの?
  • 1010 1100みたいにスペースで区切らせてよ
    • それは字句解析的に面倒で、コストかかりすぎる
  • 8進数リテラルも入れてよ
    • あっても使わないだろ、実際
      • chmodで使うよ
    • C言語の0始まりは紛らわしいし、octalだからって0o (ゼロ、オー)も0とoが区別つきにくいし
  • そもそも、16進数リテラルの0xもなんなの、Xって。hexの3文字目って

簡単な機能であっても、なかなかめんどくさい感じの話に。