代入演算子 (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 つオペランドは同じ型である必要があります。
ref
代入は、参照変数に異なる参照先があることを意味します。 以前の参照元を参照しなくなりました。 ref
パラメーターで ref =
を使用すると、パラメーターがその引数を参照しなくなります。 再割り当て後にオブジェクトの状態を変更するアクションは、新しい項目に変更を加えます。 たとえば、次の方法を考えてみましょう。
private static void RefReassignAndModify(scoped ref string s)
{
string sLocal = "Hello";
Console.WriteLine(sLocal); // Output: Hello
s = ref sLocal;
s = "World";
Console.WriteLine(s); // Output: World
次の使用法は、s
が文字列が変更される前に sLocal
を参照するように再割り当て ref
されたため、パラメーター s
への割り当てがメソッド呼び出しの後に表示されていないことを示しています。
string msg = "Hi";
RefReassignAndModify(ref msg);
Console.WriteLine(msg); // Output: Hi!
複合代入。
2 項演算子 op
の場合、フォームの複合代入式
x op= y
に相当します。
x = x op y
ただし、x
は 1 回だけ評価されます。
演算子 算術、ブール論理、および ビットごとの論理とシフト は、すべて複合代入をサポートします。
null 合体割り当て
左側のオペランドが ??=
に評価される場合にのみ、null 合体割り当て演算子 null
を使用して、右側のオペランドの値を左側のオペランドに割り当てることができます。 詳細については、「?? and ??= 演算子」の記事を参照してください。
演算子のオーバーロード可/不可
ユーザー定義型では、代入演算子をオーバーロードできません。 ただし、ユーザー定義型は、別の型への暗黙的な変換を定義できます。 この方法により、ユーザー定義型の値を、別の型の変数、プロパティ、またはインデクサー要素に割り当てることができます。 詳細については、「ユーザー定義の変換演算子」 に関するページを参照してください。
ユーザー定義型では、複合代入演算子を明示的にオーバーロードすることはできません。 ただし、ユーザー定義型が二項演算子 op
をオーバーロードし、op=
演算子も存在する場合は、それも暗黙的にオーバーロードされます。
C# 言語仕様
詳細については、C# 言語仕様の「Assignment operators (代入演算子)」セクションを参照してください。
関連項目
.NET