演算子 | 作用 |
---|---|
x.y | メンバ アクセス |
x?.y | null条件付きのメンバ アクセス。左側のオペランドがnullの場合にnullを返す |
f(x) | 関数の呼び出し。呼び出し式 (Invocation expression) |
a[x] | 集約オブジェクトのインデックス |
a?[x] | null条件付きのインデックス。左側のオペランドがnullの場合にnullを返す |
x++ | 後置インクリメント。xの値を返した後、1大きくなったxの値で格納場所を更新する |
x-- | 後置デクリメント。xの値を返した後、1小さくなったxの値で格納場所を更新する |
new | 型のインスタンス化 |
typeof | オペランドを表すSystem.Typeオブジェクトを返す |
checked | 整数演算のオーバーフロー チェックを有効にする |
unchecked | 整数演算のオーバーフロー チェックを無効にする。(コンパイラの既定の動作) |
default(T) | 型Tの既定の初期値を返す (参照型の場合はnull、数値型の場合は0、構造体型の場合は0またはnullが格納されたメンバ) |
delegate | delegateインスタンスを宣言して返す |
sizeof | 型オペランドのサイズをバイト単位で返す |
-> | メンバ アクセスと組み合わせてポインターを逆参照する |
演算子 | 作用 |
---|---|
+x | xの値を返す |
-x | 数値の否定 |
!x | 論理否定 |
~x | ビットごとの補数 |
++x | 前置インクリメント。1大きくなったxの値で格納場所を更新した後に、xの値を返す |
--x | 前置デクリメント。1小さくなったxの値で格納場所を更新した後に、xの値を返す |
(T)x | 型キャスト |
await | Taskを待つ |
&x | xのアドレス |
*x | xの逆参照 |
演算子 | 作用 |
---|---|
is | 型の互換性。評価される左側のオペランドを右側のオペランドで指定された型にキャストできる場合に、trueを返す |
as | 型の変換。左側のオペランドを右側のオペランドで指定された型にキャストして返す。ただし (T)xが例外をスローした場合、nullを返す |
演算子 | 作用 |
---|---|
== | |
!= |
演算子 | 作用 |
---|---|
=> | ラムダ宣言 |
整数の0で除算すると、例外が発生します。
int a = 0;
int x = 1 / a; // System.DivideByZeroException: 0 で除算しようとしました。
整数の定数で除算しようとすると、コンパイル エラーとなります。
int x = 1 / 0; // error CS0020: 定数 0 による除算です。
浮動小数点数の0で除算すると、正の数を除算したならばPositiveInfinity、負ならばNegativeInfinityが返されます。
double x = 1.0 / 0.0; // Infinity double y = -1.0 / 0.0; // -Infinity Double.IsInfinity(x); // true Double.IsInfinity(y); // true
int a1 = 0x04; // (4) int a2 = a1 << 2; // 0x10 (16) int b1 = -4; // (0xFFFFFFFC) int b2 = b1 << 2; // -16 (0xFFFFFFF0) byte c1 = 0x04; //byte c2 = c1 << 2; // error CS0266: 型 'int' を 'byte' に暗黙的に変換できません。明示的な変換が存在します (cast が不足していないかどうかを確認してください) byte c2 = (byte)(c1 << 2); // 0x10 (16) byte c3 = (byte)(c1 << 5); // 0x80 (128) byte c4 = (byte)(c1 << 6); // 0x00 (0) byte d1 = 0x10 >> 1; // 0x08 (8)
condition ? consequent : alternative?: 演算子 - C# リファレンス | Microsoft Learn
bool x = true;
int a = x ? 1 : 2; // aは 1となる
条件式は右結合 (right-associative) で評価されます。
bool x = false;
bool y = false;
int b = x ? 1 : y ? 2 : 3; // bは 3となる
評価の結果として異なる型が返されるときは、それが明確になるようにキャストが必要です。
Control c1 = true ? new Label() : new TextBox(); // error CS0173: 'System.Windows.Forms.Label' と 'System.Windows.Forms.TextBox' の間に暗黙的な変換がないため、条件式の型がわかりません。
Control c2 = true ? (Control)new Label() : new TextBox();
左オペランドがnullでなければそれ自身が、さもなくば右オペランドの値が返されます。?? 演算子 - C# リファレンス | Microsoft Learn
つまり
left ?? right
は、
left != null ? left : right
と同じ結果を返します。
string s = null; string s1 = s ?? "A"; // "A" string s2 = s != null ? s : "A"; // "A" s = "B"; s1 = s ?? "A"; // "B" s2 = s != null ? s : "A"; // "B"
左側のオペランドがnullと評価された場合のみ、右側のオペランドの値を左側のオペランドに割り当てられます。これはC# 8.0以降でサポートされます。つまり、
if (obj == null) obj = new MyClass();
とするところを、
obj ??= new MyClass();
と記述できます。
変数、型やメンバー名を文字列定数で取得できます。この式はコンパイル時に評価され、実行時には作用しません。nameof 式 - シンボルのテキスト名を評価します - C# reference | Microsoft Learn
// const string s1 = nameof(int); // error CS1525: 'int' は無効です const string s2 = nameof(Int32); // "Int32" const string s3 = nameof(List<int>); // "List" const string s4 = nameof(List<int>.Count); // "Count" List<int> num = new List<int>(); const string s5 = nameof(num); // "num" const string s6 = nameof(num.Count); // "Count"
クラスやプロパティ名などの文字列表現に依存する処理は、nameofで文字列を取得するようにしておくことで、それらを変更したときの不整合を防止できます。
Operators | Category or name |
---|---|
x.y, f(x), a[i], x?.y, x?[y], x++, x--, x!, new, typeof, checked, unchecked, default, nameof, delegate, sizeof, stackalloc, x->y | Primary |
+x, -x, !x, ~x, ++x, --x, ^x, (T)x, await, &x, *x, true and false | Unary |
x..y | Range |
switch, with | switch and with expressions |
x * y, x / y, x % y | Multiplicative |
x + y, x – y | Additive |
x << y, x >> y, x >>> y | Shift |
x < y, x > y, x <= y, x >= y, is, as | Relational and type-testing |
x == y, x != y | Equality |
x & y | Boolean logical AND or bitwise logical AND |
x ^ y | Boolean logical XOR or bitwise logical XOR |
x | y | Boolean logical OR or bitwise logical OR |
x && y | Conditional AND |
x || y | Conditional OR |
x ?? y | Null-coalescing operator |
c ? t : f | Conditional operator |
x = y, x += y, x -= y, x *= y, x /= y, x %= y, x &= y, x |= y, x ^= y, x <<= y, x >>= y, x >>>= y, x ??= y, => | Assignment and lambda declaration |