やってみる

アウトプットすべく己を導くためのブログ。その試行錯誤すらたれ流す。

C#構文におけるセミコロンの不統一性

 必要だったり、つけたらダメだったりする。}の後ろでも必須だったり、つけたらダメだったり。

前回まで

 C#コードを構築するコードを書いた。次は;の付与を実装したいのだが、統一性がないように思えた。

情報源

セミコロンは文の終わりにつける」という嘘

 if文の最後に;つけないじゃん。

int a; // 宣言式に必要
if (true) {}; // if文につけるとエラー!
while(true) {}; // if文につけるとエラー!
for (int i=0; i<5; i++) {} // 初期化, 条件式 に必要
interface {
    void M(); // 仮想メソッドの末尾に必要
}
class {
    void M() {}; // インスタンスメソッド定義につけるとエラー!
}
int a = 0;
int b = a switch => {
    _ => 1;
}; // switch式に必要
Point p = new Point { x=0, y=1 }; // オブジェクト初期化子の末尾}の後ろに;必須

 まるで統一性がないように見える。

ブロック文

 if文も文である。セミコロンが文末につけるものであるなら、if文末に;がないのはおかしい。

 じつは文にはセミコロンがつく文と、つかない文がある。if文は{}で囲む。これをブロック文(複合文)という。ブロック文の末尾にはセミコロンをつけない。代わりにブロック文の内部はセミコロンで区切った文を複数含めることができる。

 厄介なのは{}があるからといってブロック文とは限らないということ。lambda式やswitch式がそれ。() => {};, a switch => { _ => 0; };{}があるのに、その文末に;がついている。

所感

 たかがセミコロンを末尾につけるか否かだけで、どれだけ構文の勉強をしなければいけないの?

 その構文の違いをクラス化してやれば、自動的に;の有無をうまいことやってくれる。それはいいのだが、コードを書くときに「こういうときはどのクラスだっけ?」となってしまうのが辛い。それならもう直にコード書いたほうが早いよ。だからCodeDomはパッと見わかりにくかった。

 セミコロン付与の実装はやめようかな。

対象環境

$ uname -a
Linux raspberrypi 4.19.42-v7+ #1218 SMP Tue May 14 00:48:17 BST 2019 armv7l GNU/Linux