[.net 物件導向程式設計基礎] (10) 類的成員(欄位、屬性、方法)

yubinfeng發表於2015-06-04

[.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.屬性可以忽略getset訪問器,但是不能兩個都忽略. 

   示例:     

 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  

 

==============================================================================================

                                                                                                   返回目錄

==============================================================================================

相關文章