目次

概要

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

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

一覧(優先度順):

カテゴリー 参考
基本式 x.m メンバー アクセス:「クラス
x(…) メソッド呼び出し:「関数」「デリゲート
x[…] インデックス アクセス:「配列」「インデクサー
x++

x--
インクリメント・デクリメント」(後置き)
new T(…)

new T(…){…}

new {…}

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

unchecked(x)
オーバーフローのチェック
default(t) 既定値
delegate{…} 匿名関数
p->m ポインター アクセス:「unsafe
await x 非同期処理の完了待ち:「非同期処理
単項演算 +x

-x
算術演算子
!x 論理演算子
~x 論理演算子
++x

--x
インクリメント・デクリメント」(前置き)
(T)x 型変換(キャスト):「明示的な型変換」「ダウンキャスト
*p ポインター間接参照:「unsafe
&p ポインター化:「unsafe
sizeof(T) unsafe
乗除算 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 文

更新履歴

ブログ