赋值运算符(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 赋值= 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 字段refoutin 方法参数。 两个操作数的类型必须相同。

复合赋值

对于二元运算符 op,窗体的复合赋值表达式

x op= y

等效于

x = x op y

不同的是 x 只计算一次。

算术布尔逻辑以及逻辑位和移位运算符支持复合赋值。

Null 合并赋值

只有在左操作数计算为 null 时,才能使用 null 合并赋值运算符 ??= 将其右操作数的值分配给左操作数。 有关详细信息,请参阅 ?? 和 ??= 运算符一文。

运算符可重载性

用户定义类型不能重载赋值运算符。 但是,用户定义类型可以定义到其他类型的隐式转换。 这样,可以将用户定义类型的值分配给其他类型的变量、属性或索引器元素。 有关详细信息,请参阅用户定义转换运算符

用户定义类型不能显式重载复合赋值运算符。 但是,如果用户定义类型重载了二元运算符 op,则 op= 运算符(如果存在)也将被隐式重载。

C# 语言规范

有关详细信息,请参阅 C# 语言规范中的分配运算符部分。

另请参阅