概要
「変数と式」で少し言葉としては出しましたが、 プログラミング言語の構文には大きく分けて式(expression)とステートメント(statement: 文、平叙文)という2種類のものがあります。
最近のプログラミング言語ほど式の比率が高くなっています。 C#でも、バージョンを重ねるごとに、式になっている構文が増えています。
式とステートメント
「基礎」と「構造化」のセクションで、C#の式とステートメントの結構な割合を紹介しました。ここで1度、この式とステートメントの区別についての話をしておきます。
式とステートメントは、大まかに言うと以下のようなものです。
- 式(expression): 割とどこにでも書ける代わりに戻り値が必須
- ステートメント(statement): 戻り値がなくてもいい代わりに書ける場所がブロック内に限られている
式
式(expression: 表現、語句、(数学用語で)式)は、 以下のような特徴がある構文です。
- 書ける場所が多い
- 必ず何かしらの値を返す
- いろいろ組み合わせて書ける

名前からして数学用語の「式」がもとになっていますが、
名前通り、x + 1 というような数式みたいなものが多いです。
いかにも数式っぽいもの以外にも、x.PropertyNameやawait x なども式です。
組み合わせて書けるというのは、例えば、
await Task.Run(() => new[] { "abc" }[0].Length) みたいなものも式になっています。
この式は、以下のような式を組み合わせた結果です。
"abc"… 文字列リテラル- "new [] { x }` 配列生成
x[0]… インデックス アクセスx.Length… メンバー アクセス() => x… ラムダ式Task.Run… メンバー アクセスx(y)… メソッド呼び出しawait x… 非同期処理の完了待ち
組み合わせて書ける分、1つ1つはシンプルなものが多いです。
ステートメント
一方、ステートメント(statement: 文、声明)は、 以下のような特徴がある構文です。
- ブロックの内側にしか書けない
- 組み合わせが効かない
- 1つ1つが大きい
- 戻り値がない

if などの条件分岐や、for などの反復処理をはじめ、制御構文が多いです。
式との比較をまとめます。
| 式 | ステートメント(文) |
|---|---|
| 数式っぽい構文が多い | 制御構文が多い |
| どこにでも書ける | ブロック内(関数本体の中など)にしか書けない |
| いろいろ組み合わせて書ける | そんなに組み合わせの幅はない |
| 戻り値が必須 | 戻り値がない |
式やステートメント(文)の一覧は、「C# の式と文の一覧」にまとめてあります。
式は増加傾向にある
近年では、ステートメントよりも式の方が好まれる傾向があります。 C# でも、バージョンアップを重ねるたびに、式の比率が増えています。
ステートメントだとそもそも書けない場所も多くて困ることがあります。 なので、以前でもステートメントを使って書けたものを、 式で書き直せるような構文の追加が結構あります。 また、式を使いやすくするような構文も増えています。
以下に例を挙げていきます。
C# 2.0
| 構文 | 新しい書き方 | 以前の書き方 |
|---|---|---|
| null 合体演算子 |
|
|
| 匿名メソッド式 |
|
|
C# 3.0
| 構文 | 新しい書き方 | 以前の書き方 |
|---|---|---|
| オブジェクト初期化子 |
|
|
| コレクション初期化子 |
|
|
| ラムダ式 |
|
|
C# 6.0
| 構文 | 新しい書き方 | 以前の書き方 |
|---|---|---|
| null条件演算子 |
|
|
| インデックス初期化子 |
|
|
| 式形式メンバー |
|
|
C# 7.0
| 構文 | 新しい書き方 | 以前の書き方 |
|---|---|---|
| 式形式メンバー(追加) |
|
|
| throw 式 |
|
|
| 出力変数宣言 |
|
|
| 宣言パターン |
|
|
C# 8.0
| 構文 | 新しい書き方 | 以前の書き方 |
|---|---|---|
| switch 式 |
|
|
