C#賦值運算符之簡單賦值運算符
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#賦值運算符之簡單賦值運算符有所幫助。
【編輯推薦】