機能別索引&概要。 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 合体演算子」 | |
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 文」 | |