C#赋值运算符之简单赋值运算符的概念:
= 运算符称为简单赋值运算符。在简单赋值中,右操作数表达式所属的类型必须可隐式地转换为左操作数所属的类型。运算将右操作数的值赋予左操作数指定的变量、属性或索引器元素。
简单赋值表达式的结果是赋予左操作数的值。结果的类型与左操作数相同,且始终为值类别。
如果左操作数为属性或索引器访问,则该属性或索引器必须具有 set 访问器。如果不是这样,则发生编译时错误。
x = y 形式的简单赋值的运行时处理包括以下步骤:
如果 x 属于变量:
计算 x 以产生变量。
如果要求,则计算 y,必要时还需通过隐式转换将其转换为 x 的类型。
如果 x 给定的变量是引用类型的数组元素,则执行运行时检查以确保为 y 计算的值与以 x 为其元素的那个数组实例兼容。如果 y 为 null,或存在从 y 引用的实例的实际类型到包含 x 的数组实例的实际元素类型的隐式引用转换,则检查成功。否则,引发 System.ArrayTypeMismatchException。
y 的计算和转换后所产生的值存储在 x 的计算所确定的位置中。
如果 x 属于属性或索引器访问:
计算与 x 关联的实例表达式(如果 x 不是 static)和参数列表(如果 x 是索引器访问),结果用于后面的对 set 访问器调用。
计算 y,必要时还需通过隐式转换将其转换为 x 的类型。
调用 x 的 set 访问器,并将 y 的上述结果值作为该访问器的 value 参数。
C#赋值运算符之简单赋值运算符的使用:
如果存在从 B 到 A 的隐式引用转换,则数组协方差规则允许数组类型 A[] 的值成为对数组类型 B[] 的实例的引用。由于这些规则,对引用类型的数组元素的赋值需要运行时检查以确保所赋的值与数组实例兼容。在下面的示例中,
- string[] sa = new string[10];
- object[] oa = sa;
- oa[0] = null; // Ok
- oa[1] = "Hello"; // Ok
- oa[2] = new ArrayList(); // ArrayTypeMismatchException
最后的赋值导致引发 System.ArrayTypeMismatchException,这是因为 ArrayList 的实例不能存储在 string[] 的元素中。
当“结构类型”中声明的属性或索引器是赋值的目标时,与属性或索引器访问关联的实例表达式必须为变量类别。如果该实例表达式归类为值类别,则发生编译时错误。
给定下列声明:
- struct Point
- {
- int x, y;
- public Point(int x, int y) {
- this.x = x;
- this.y = y;
- }
- public int X {
- get { return x; }
- set { x = value; }
- }
- public int Y {
- get { return y; }
- set { y = value; }
- }
- }
- struct Rectangle
- {
- Point a, b;
- public Rectangle(Point a, Point b) {
- this.a = a;
- this.b = b;
- }
- public Point A {
- get { return a; }
- set { a = value; }
- }
- public Point B {
- get { return b; }
- set { b = value; }
- }
- }
在下面的示例中,
- Point p = new Point();
- p.X = 100;
- p.Y = 100;
- Rectangle r = new Rectangle();
- r.A = new Point(10, 10);
- r.B = p;
由于 p 和 r 为变量,因此允许对 p.X、p.Y、r.A 和 r.B 赋值。但是,在以下示例中
- Rectangle r = new Rectangle();
- r.A.X = 10;
- r.A.Y = 10;
- r.B.X = 100;
- r.B.Y = 100;
由于 r.A 和 r.B 不是变量,所以赋值全部无效。
C#赋值运算符之简单赋值运算符的基本情况就向你介绍到这里,希望对你学习C#赋值运算符之简单赋值运算符有所帮助。
【编辑推荐】