[.net 物件導向程式設計基礎] (10) 類的成員(欄位、屬性、方法)
前面定義的Person的類,裡面的成員包括:欄位、屬性、方法、事件等,此外,前面說的巢狀類也是類的成員。
a.類的成員為分:靜態成員(static)和非靜態成員
b.靜態成員用static標識,不標識則預設為非靜態成員
c.靜態成員屬於類所有,動態成員則屬於例項所有,即物件
d.靜態成員為類所有例項共享,無論類有多少例項或副本,靜態成員只佔用存中一塊區域。非靜態成員則在類的每個例項,都建立一個記憶體域。
下面主要說明一下類的主要成員:欄位、屬性、方法
1.類的成員——欄位(field)
欄位宣告:(static/readonly) <Type> <變數名稱>
a.可以理解為類的一個私有變數,通常都是私有的(private)。
b.欄位的定義通常以小寫字母開頭或 “_” 開頭。
c.欄位宣告修飾符有static(靜態)和readonly(只讀)兩種。
d欄位通常為私有,因此一般不需要使用訪問修飾符.
示例:
1 static int eyesCount=2; 2 readonly int earsCount=2;
2.類的成員——屬性(property)
a.可以理解為類的一個公有變數,通常都是公有的(public)
b.屬性有get 和 set 兩個方法。
c.get 訪問器返回與屬性宣告型別相同的資料, 表示的意思是呼叫時可以得到內部的欄位的值或引用。
d.set 訪問器沒有顯示設定的引數,它有一個隱式引數value 它的作用是呼叫時,可以給屬性內部欄位或引用賦值。
e.由於類的成員預設為私有,因為根據屬性為公有的特徵,在物件導向開發過程中,要使用修飾符public來宣告一個屬性為公有。
f.屬性可以忽略get或set訪問器,但是不能兩個都忽略.
示例:
1 string _country; 2 //讀寫屬性 3 public string Country 4 { 5 set { _country = value; } 6 get { return _country; } 7 } 8 //只讀屬性 9 public string CountryOnleread 10 { 11 get { return _country; } 12 } 13 //只寫屬性 14 public string Countryonlywrite 15 { 16 set { _country = value; } 17 }
6.類的成員——方法 (Method )
宣告:(訪問修飾符) <型別> <方法名>{方法體}
呼叫:[<類名.>]|[<例項物件名.>]<方法名>([<實參列表>])
定義:是類中用於執行計算或其它行為的成員
靜態方法:
方法分為例項方法和靜態方法(同前面講的類的成員)
靜態方法中只能呼叫靜態欄位,不允許呼叫非靜態欄位
方法引數:
值引數:不含任何修飾符。方法中的形參是實參的一份拷貝,形參的改變不會影響到記憶體中實參的的值,實參是安全的。
引用引數:以ref修飾符宣告。
ref 關鍵字使引數按引用傳遞。其效果是,當控制權傳遞迴呼叫方法時,在方法中對引數所做的任何更改都將反映在該變數中。
若要使用 ref 引數,則方法定義和呼叫方法都必須顯式使用 ref 關鍵字。
傳遞到 ref 引數的引數必須最先初始化。這與 out 不同,out 的引數在傳遞之前不需要顯式初始化。
屬性不是變數,因此不能作為 ref 引數傳遞。
儘管 ref 和 out 在執行時的處理方式不同,但它們在編譯時的處理方式是相同的。因此,如果一個方法採用 ref 引數,而另一個方法採用 out 引數,則無法過載這兩個方法。例如,從編譯的角度來看,以下程式碼中的兩個方法是完全相同的。如果嘗試這麼做,將導致不能編譯該程式碼。
如果一個方法採用 ref 或 out 引數,而另一個方法不採用這兩類引數,則可以進行過載。
程式碼示例:
//呼叫 double[] numbers = new double[] { 1, 2, 3, 5.5 }; double i = 0; MyAddOperation(numbers, ref i); Console.WriteLine("計算結果的2倍是:{0}",i*2); Console.ReadLine(); //引用引數方法宣告 public static void MyAddOperation(double[] numbers, ref double result) { result = 0; foreach (double num in numbers) result += num; Console.WriteLine("計算結果是:{0}", result); }
輸出引數:以out修飾符宣告。和ref類似,它也是直接對實參進行操作。在方法宣告和方法呼叫時都必須明確地指定out關鍵字。out引數宣告方式不要求變數傳遞給方法前進行初始化,因為它的含義只是用作輸出目的。但是,在方法返回前,必須對out引數進行賦值。
out 關鍵字會導致引數通過引用來傳遞。這與 ref 關鍵字類似。
與 ref 的不同之處:
ref 要求變數必須在傳遞之前進行初始化。
儘管作為 out 引數傳遞的變數不需要在傳遞之前進行初始化,但需要呼叫方法以便在方法返回之前賦值。
示例:
1 //呼叫 2 double[] numbers = new double[] { 1, 2, 3, 5.5 }; 3 double i = 0; 4 MyAddOperation(numbers, out i); 5 Console.WriteLine("計算結果的2倍是:{0}",i*2); 6 Console.ReadLine(); 7 8 //輸出引數方法宣告 9 public static void MyAddOperation(double[] numbers, out double result) 10 { 11 result = 0; 12 foreach (double num in numbers) 13 result += num; 14 Console.WriteLine("計算結果是:{0}", result); 15 }
陣列型引數:以params修飾符宣告。params關鍵字用來宣告可變長度的引數列表。方法宣告中只能包含一個params引數。params 引數在引數數目可變的情況下,非常有用,看下面的示例:
1 //呼叫方法 2 double[] numbers = new double[] { 1, 2, 3, 5.5 }; 3 Console.WriteLine("計算結果是:{0}", MyAddOperation(numbers)); 4 5 //陣列型引數宣告 6 public static double MyAddOperation(params double[] numbers) 7 { 8 double result = 0; 9 foreach (double num in numbers) 10 result += num; 11 return result; 12 }
Virtual方法(虛方法)
virtual 關鍵字用於在基類中修飾方法。virtual的使用會有兩種情況:
情況1:在基類中定義了virtual方法,但在派生類中沒有重寫該虛方法。那麼在對派生類例項的呼叫中,該虛方法使用的是基類定義的方法。
情況2:在基類中定義了virtual方法,然後在派生類中使用override重寫該方法。那麼在對派生類例項的呼叫中,該虛方法使用的是派生重寫的方法。
Abstract方法(抽象方法)
abstract關鍵字只能用在抽象類中修飾方法,並且沒有具體的實現。抽象方法的實現必須在派生類中使用override關鍵字來實現。
(關於抽象類,在後面會詳細說明)
要點:
1.靜態方法中只能呼叫靜態欄位,不允許呼叫非靜態欄位
2. 無返回值的方法,型別為 void
==============================================================================================
==============================================================================================