[.net 面向對象編程基礎] (10) 類的成員(字段、屬性、方法)


[.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  

 

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

                                                                                                   返回目錄

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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM