C#の演算子 (operator)

主な演算子
演算子 作用
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 型オペランドのサイズをバイト単位で返す
-> メンバ アクセスと組み合わせてポインターを逆参照する
C# 演算子と式 - C# リファレンス | Microsoft Learn
単項演算子
演算子 作用
+x xの値を返す
-x 数値の否定
!x 論理否定
~x ビットごとの補数
++x 前置インクリメント。1大きくなったxの値で格納場所を更新した後に、xの値を返す
--x 前置デクリメント。1小さくなったxの値で格納場所を更新した後に、xの値を返す
(T)x 型キャスト
await Taskを待つ
&x xのアドレス
*x xの逆参照
単項演算子 - C# 演算子 | MSDN
型検査演算子 (Type-testing Operators)
演算子 作用
is 型の互換性。評価される左側のオペランドを右側のオペランドで指定された型にキャストできる場合に、trueを返す
as 型の変換。左側のオペランドを右側のオペランドで指定された型にキャストして返す。ただし (T)xが例外をスローした場合、nullを返す
関係演算子と型検査演算子 - C# 演算子 | MSDN
等値演算子 (Equality Operators)
演算子 作用
==
!=  
等値演算子 - C# 演算子 | MSDN

オブジェクトの等値を確認するメソッドの実装方法

ラムダ演算子 (Lambda Operators)
演算子 作用
=> ラムダ宣言
代入演算子とラムダ演算子 - C# 演算子 | MSDN

/ 演算子 (division operator)

/ 演算子 (C# リファレンス) | Microsoft Learn

ゼロ除算 (division by zero)

整数の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

シフト演算子 (shift operator)

シフト演算子 - C# 演算子 | Microsoft Learn
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)

?: 演算子 (三項演算子 / 三項条件演算子 / ternary conditional operator)

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 合体演算子 (null-coalescing operator)

左オペランドが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 合体割り当て演算子 (null-coalescing assignment operator)

左側のオペランドがnullと評価された場合のみ、右側のオペランドの値を左側のオペランドに割り当てられます。これはC# 8.0以降でサポートされます。つまり、

if (obj == null) obj = new MyClass();

とするところを、

obj ??= new MyClass();

と記述できます。

nameof 式 (nameof expression)

変数、型やメンバー名を文字列定数で取得できます。この式はコンパイル時に評価され、実行時には作用しません。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で文字列を取得するようにしておくことで、それらを変更したときの不整合を防止できます。

演算子の優先順位 (operator precedence)

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
演算子の優先順位 - C# 演算子と式 - C# リファレンス | Microsoft Learn
Microsoft Learnから検索