指派運算子 (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 localref readonly localref中的 ref struct 欄位。 這兩個運算元的類型都必須相同。

下列範例示範 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 變數會初始化為第一個陣列專案的別名。 然後,它會重新指派為最後一個陣列元素的別名。 因為它是別名,當您使用一般指派運算子 = 更新其值時,對應的陣列元素也會更新。

複合指派

若是二元運算子 op,表單的複合指派運算式

x op= y

相當於

x = x op y

但只會評估 x 一次。

算數布林邏輯位元邏輯與位移運算子支援複合指派。

Null 聯合指派

只有當左側運算元評估 null 為 時,才可以使用 null 聯合指派運算子 ??= ,將右運算元的值指派給其左側運算元。 如需詳細資訊,請參閱 ?? 和 ??= 運算子 發行項。

運算子是否可多載

使用者定義型別無法 多載 指派運算子。 不過,使用者定義型別可以定義會轉換成另一型別的隱含轉換。 如此一來,便可將使用者定義型別的值指派給另一型別的變數、屬性或索引子元素。 如需詳細資訊,請參閱使用者定義轉換運算子

使用者定義型別無法明確多載複合指派運算子。 不過,如果使用者定義型別多載二進位運算子 opop= 則運算子如果存在,也會隱含多載。

C# 語言規格

如需詳細資訊,請參閱 C# 語言規格指派運算子一節。

如需 ref 指派運算子 = ref 的詳細資訊,請參閱 功能提案附注

另請參閱