概要

機能別索引&概要。 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 文」