代入演算子 (C# リファレンス)
代入演算子 =
は、その右辺オペランドの値を、左辺オペランドに指定された変数、プロパティ、またはインデクサー要素に割り当てます。 代入式の結果は、左辺のオペランドに割り当てられる値です。 右辺のオペランドの型は、左辺のオペランドの型と同じであるか、暗黙に変換できる必要があります。
代入演算子 =
は右結合です。つまり、次の形式の式があるとします
a = b = c
これが次のように評価されます。
a = (b = c)
次の例では、左側のオペランドとしてローカル変数、プロパティ、およびインデクサー要素を使用する代入演算子の使用方法を示します。
List<double> numbers = [1.0, 2.0, 3.0];
Console.WriteLine(numbers.Capacity);
numbers.Capacity = 100;
Console.WriteLine(numbers.Capacity);
// Output:
// 4
// 100
int newFirstElement;
double originalFirstElement = numbers[0];
newFirstElement = 5;
numbers[0] = newFirstElement;
Console.WriteLine(originalFirstElement);
Console.WriteLine(numbers[0]);
// Output:
// 1
// 5
代入の左側のオペランドは、右側のオペランドの値を受け取ります。 オペランドが値型の場合、代入は右側のオペランドの内容をコピーします。 オペランドが参照型の場合、代入が参照をオブジェクトにコピーします。
これは値の割り当てと呼ばれます。値が割り当てられます。
ref 代入
参照代入 = ref
では、次の例に示すように、左側のオペランドは右側のオペランドのエイリアスになります。
void Display(double[] s) => Console.WriteLine(string.Join(" ", s));
double[] arr = { 0.0, 0.0, 0.0 };
Display(arr);
ref double arrayElement = ref arr[0];
arrayElement = 3.0;
Display(arr);
arrayElement = ref arr[arr.Length - 1];
arrayElement = 5.0;
Display(arr);
// Output:
// 0 0 0
// 3 0 0
// 3 0 5
前の例では、 ローカル参照変数 arrayElement
は、最初の配列要素の別名として初期化されています。 次に、最後の配列要素を参照するように ref
再代入されています。 これはエイリアスであるため、通常の代入演算子 =
でその値を更新すると、対応する配列要素も更新されます。
ref
割り当ての左側のオペランドには、ローカル参照変数、ref
フィールド、および 、ref
、out
または in
メソッド パラメーターを指定できます。 2 つオペランドは同じ型である必要があります。
複合代入。
2 項演算子 op
の場合、フォームの複合代入式
x op= y
上記の式は、次の式と同じです。
x = x op y
ただし、x
が評価されるのは 1 回だけです。
複合代入は、算術、ブール論理、ビット単位論理およびシフトの各演算子でサポートされています。
null 合体割り当て
左側のオペランドが null
に評価される場合にのみ、null 合体割り当て演算子 ??=
を使用して、右側のオペランドの値を左側のオペランドに割り当てることができます。 詳細については、「?? and ??= 演算子」の記事を参照してください。
演算子のオーバーロード可/不可
ユーザー定義型では、代入演算子をオーバーロードできません。 ただし、ユーザー定義型は、別の型への暗黙的な変換を定義できます。 この方法により、ユーザー定義型の値を、別の型の変数、プロパティ、またはインデクサー要素に割り当てることができます。 詳細については、「ユーザー定義の変換演算子」 に関するページを参照してください。
ユーザー定義型では、複合代入演算子を明示的にオーバーロードすることはできません。 ただし、ユーザー定義型が二項演算子 op
をオーバーロードし、op=
演算子も存在する場合は、それも暗黙的にオーバーロードされます。
C# 言語仕様
詳細については、C# 言語仕様の「Assignment operators (代入演算子)」セクションを参照してください。
関連項目
.NET