代入演算子 (C# リファレンス)

代入演算子 = は、その右辺オペランドのを、左辺オペランドに指定された変数、プロパティ、またはインデクサー要素に割り当てます。 代入式の結果は、左辺のオペランドに割り当てられる値です。 右辺のオペランドの型は、左辺のオペランドの型と同じであるか、暗黙に変換できる必要があります。

代入演算子 = は右結合です。つまり、次の形式の式があるとします

a = b = c

これが次のように評価されます。

a = (b = c)

次の例では、左側のオペランドとしてローカル変数、プロパティ、およびインデクサー要素を使用する代入演算子の使用方法を示します。

var numbers = new List<double>() { 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 代入の = ref では、その左側のオペランドが右側のオペランドのエイリアスになります。 左側のオペランドは、ref ローカルref readonly ローカル、または ref structref フィールドである必要があります。 2 つオペランドは同じ型である必要があります。

次の例は、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

前の例では、ref ローカル arrayElement 変数は、最初の配列要素のエイリアスとして初期化されています。 次に、最後の配列要素のエイリアスになるように再割り当てされています。 これはエイリアスであるため、通常の代入演算子 = でその値を更新すると、対応する配列要素も更新されます。

複合代入。

2 項演算子 op の場合、フォームの複合代入式

x op= y

上記の式は、次の式と同じです。

x = x op y

ただし、x が評価されるのは 1 回だけです。

複合代入は、算術ブール論理ビット単位論理およびシフトの各演算子でサポートされています。

null 合体割り当て

左側のオペランドが null に評価される場合にのみ、null 合体割り当て演算子 ??= を使用して、右側のオペランドの値を左側のオペランドに割り当てることができます。 詳細については、「?? and ??= 演算子」の記事を参照してください。

演算子のオーバーロード可/不可

ユーザー定義型では、代入演算子をオーバーロードできません。 ただし、ユーザー定義型は、別の型への暗黙的な変換を定義できます。 この方法により、ユーザー定義型の値を、別の型の変数、プロパティ、またはインデクサー要素に割り当てることができます。 詳細については、「ユーザー定義の変換演算子」 に関するページを参照してください。

ユーザー定義型では、複合代入演算子を明示的にオーバーロードすることはできません。 ただし、ユーザー定義型が二項演算子 op をオーバーロードし、op= 演算子も存在する場合は、それも暗黙的にオーバーロードされます。

C# 言語仕様

詳細については、C# 言語仕様の「Assignment operators (代入演算子)」セクションを参照してください。

ref 代入演算子 = ref の詳細については、機能提案メモを参照してください。

関連項目