目次

概要

機能別索引&概要。 C# で使える式と文の一覧を先に示しておきます。

式

式: int x = ... とか f(...) の ... の部分に書けるもの。 x + y みたいな演算子適用が主。 その他、メンバー アクセスとかラムダ式とかクエリ式とか。

一覧(優先度順):

カテゴリー 式 参考
基本式 x.m メンバー アクセス:「クラス」
x(…) メソッド呼び出し:「関数」「デリゲート」
x[…] インデックス アクセス:「配列」「インデクサー」
x?.m
x?[...]
null 条件演算子:「null の取り扱い」
x++

x--
「インクリメント・デクリメント」(後置き)
x! 「null 免除演算子」
new T(…)

new T(…){…}

new {…}

new T[…]
オブジェクトの生成:「クラス」「コンストラクター」
typeof(T) 「実行時型情報」型情報の取得
checked(x)

unchecked(x)
「オーバーフローのチェック」
default(T) 「既定値」
delegate{…} 「匿名関数」
nameof(x) 「nameof演算子」
stackalloc T[...] 「スタック上への配列の確保」、「安全な stackalloc」
p->m ポインター アクセス:「unsafe」
sizeof(T) 「unsafe」
単項演算 +x

-x
「算術演算子」
!x 「論理演算子」
~x 「論理演算子」
^x 「Index」
++x

--x
「インクリメント・デクリメント」(前置き)
(T)x 型変換(キャスト):「明示的な型変換」「ダウンキャスト」
await x 非同期処理の完了待ち:「非同期処理」
x true/false 式:「演算子のオーバーロード」
*p ポインター間接参照:「unsafe」
&p ポインター化:「unsafe」
範囲 x..y 「Range」
switch 式 x switch { ... } 「switch 式」
x with { ... } 「with 式」
乗除算 x * y

x / y

x % y
「算術演算子」
加減算 x + y

x – y
「算術演算子」
シフト x << y

x >> y
「シフト」
関係式/型検査 x < y

x > y

x <= y

x >= y
「関係演算」
x is T 「ダウンキャスト」
x as T 「ダウンキャスト」
等値比較 x == y

x != y
「算術演算子」
論理演算※1 x & y 「論理演算子」
x ^ y 「論理演算子」
x | y 「論理演算子」
条件演算※1 x && y 「論理演算子」(短絡評価)
x || y 「論理演算子」(短絡評価)
x ?? y 「null 合体演算子」
throw x 「throw 式」
x ? y : z 「条件演算子」
クエリ式、 ラムダ式、 代入※2 from x in … 「クエリ式」
() => { } 「匿名関数」「ラムダ式」
x = y 「代入演算」
x op= y += など:「代入演算」

※1 論理演算と条件演算に関しては、同列の優先順位ではなく、上から順に優先度が付いています。

※2 クエリ式、ラムダ式、代入は同列で、例えば、以下のような C# コードを書けます。

int sum = 0;
Func<IEnumerable<int>> q = () =>
  from x in new[] { 1, 2, 3, 4, 5 }
  select sum += x;
結合規則

優先順位が同じ場合、クエリ式、ラムダ式、代入の3つは右から、その他の式は左から結合します。

左結合は、例えば、a + b + c + d なら ((a + b) + c) + d と同じ意味です。 右結合の例は Func<int> f = x => s += x; なら Func<int> f = (x => (s += x)); になります。

評価順

演算子のオペランドは、演算子の優先順位や結合規則によらず、常に左から順に評価されます。 例えば、以下のように、画面への出力を伴うメソッド Echo を呼ぶと、2, 3, 4 の順で出力されます。

using System;

class Program
{
    static int Echo(int x)
    {
        Console.WriteLine(x);
        return x;
    }

    static void Main()
    {
        var s = Echo(2) + Echo(3) * Echo(4);
        // 演算子の優先順位に関係なく、Echo(2) → Echo(3) → Echo(4) の順に呼ばれる
    }
}
2
3
4

文

一覧:

カテゴリー 文 例 参考
宣言 ローカル変数
int x;
string s = "sample";
var a = 10;
「変数と式」
ローカル定数
const int x = 100;
const double e = 2.71828;
「定数」
式
x = 1 + 2;
Math.Sin(1);
式単体。 「式;」。「変数と式」「式」
オーバーフローのチェック
checked
{
    int z = x * y;
}
unchecked
{
    int z = x * y;
}
「オーバーフローのチェック」
条件分岐 if 文
if (条件) { } else { }
「制御フロー」「if 文」
switch 文
switch(値)
{
    case 0:
        break;
    default:
        break;
}
「switch 文」
反復処理 while 文
int n = 10;
while (n > 0)
{
    --n;
}
「制御フロー」「while 文」
do 文
string s;
do
{
    s = Console.ReadLine();
} while (s.Length == 0);
「制御フロー」「do-while 文」
for 文
for (int i = 0; i < 10; i++)
{

}
「制御フロー」「for 文」
foreach 文
var array = new[] { 1, 2, 3 };
foreach (var x in array)
{

}
「制御フロー」「foreach文」「foreach」
反復の中断 break 文
while (true)
{
    if (nothingToDo)
        continue;

    if (!isActive)
        break;
}
「反復処理」
continue 文 「反復処理」
goto 文
while (true)
{
    while (true)
    {
        goto LOOP_END;
    }
}
LOOP_END: ;
「goto 文」
return 文
int Add(int x, int y)
{
    return x + y;
}
「関数」
yield 文
IEnumerable<int> ZeroTo(int x)
{
    for (int i = 0; i <= x; i++)
    {
        yield return i;
    }
}
「イテレーター」
例外処理
try
{
}
catch (IOException)
{
}
finally
{
}
「例外処理」
リソース破棄
using (var r = File.OpenText("a.txt"))
{
    var s = r.ReadLine();
}
「リソースの破棄」
ロック
object syncObj = new object();
Parallel.ForEach(data, x =>
{
    lock (syncObj)
    {
        sum += x;
    }
});
「lock 文」

更新履歴

ブログ