概要

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