C#圖解教程學習筆記——方法


一、字段和本地變量、本地常量
字段:隸屬於類的變量,即類的成員變量。
本地變量:於保存本地的或臨時的計算數據,即局部變量。
本地常量:必須聲明在塊內部,聲明時必須初始化,聲明后不能改變。
實例字段與本地變量區別圖解:

本地變量生存周期圖解:

注:
  在C和C++中,可以先聲明一個本地變量,然后在嵌套塊中聲明另一個同名本地變量。在內部范圍,內部變量覆蓋外部變量。然而,在C#中不管嵌套級別如何,都不能在第一個本地變量的有效范圍內聲明另一個同名本地變量。

 

二、類型推斷和var關鍵字
若編譯器能從初始化語句的右邊推斷出類型名,則可使用var關鍵字代替具體類型名。var不是特定的類型變量符號,它表示任何可以從初始化語句的右邊推斷出來的類型。
使用var的條件:
(1)只能用於本地變量,不能用於字段
(2)只能在變量聲明中包含初始化時使用
(3)一旦編譯器推斷出變量的類型,它就是固定且不能更改的
注:
  var關鍵字不像JavaScript的var那樣可以引用不同的類型。它是從等號右邊推斷出的實際類型的速記。var關鍵字並不改變C#的強類型性質。

 

三、值參數、引用參數、輸出參數、參數數組、命名參數、可選參數
1. 值參數
使用值參數,通過將實參的值復制到形參的方式把數據傳遞給方法。方法被調用時,系統做如下操作:
(1)在棧中為形參分配空間。
(2)將實參的值復制給形參。
方法中對形參的修改是否會影響方法外的實參?
若實參是值類型,值被復制,產生一個獨立的數據,此時形參和實參存儲在內存不同位置,方法中對形參的修改不會影響方法外的實參;若實參是引用類型,則引用被復制,此時雖然形參和實參是兩個存儲在內存不同位置的引用,但是它們都指向堆內存中同一個數據對象,所以方法中對形參的修改會直接影響方法外的實參。
2. 引用參數
使用引用參數的要求:
(1)必須在方法的聲明和調用時都使用ref修飾符。
(2)實參必須是變量,在用作實參前必須被賦值。如果是引用類型變量,可以賦值為一個引用或null。
示例:

與值參數不同,引用參數不會為形參在棧上分配內存,實際上形參的參數名將作為實參變量的別名,指向相同的內存位置,所以在方法的執行過程中對形參做的任何改變在方法完成后依然有效。
關於引用類型對象作為值參數和引用參數的區別?
(1)將引用類型對象作為值參數傳遞:如果在方法內創建一個新對象並賦值給形參,將切斷形參與實參間的關聯,並且在方法調用結束后,新對象也將不復存在。(實參與形參是存儲在不同內存位置的兩個引用)
(2)將引用類型對象作為引用參數傳遞:如果在方法內創建一個新對象並賦值給形參,在方法結束后該對象依然存在,並且是實參所引用的值。(實參與形參是存儲在相同內存位置的同一引用)
3. 輸出參數
輸出參數用於從方法體內把數據傳出到調用代碼,它們的行為與引用參數非常類似。
輸出參數有以下要求:
(1)必須在聲明和調用中都使用 out 修飾符。
(2)和引用參數類似,實參必須是變量。
(3)在方法內部,輸出參數在被讀取前必須賦值。
(4)方法返回前,方法內任何返回路徑都必須為所有輸出參數進行賦值。
示例:

注:
  與引用參數相同的是,輸出參數的形參就好像是實參的別名一樣;與引用參數不同的是,變量在用作實參時可以不用先賦值。
4. 參數數組
參數數組允許零個或多個實參對應一個特殊的形參。
(1)限制與要求:
<1>在一個參數列表中只能有一個參數數組。
<2>如果有,它必須是列表中最后一個。
<3>由參數數組表示的所有參數都必須具有相同類型。
(2)聲明與調用方法:
<1>聲明示例:

<2>兩種調用方法:
逗號分隔的該數據類型元素列表:
ListInts(10,20,30);
該數據類型元素的一維數組:
int[] intArray={1,2,3};
ListInts(intArray);
<3>編譯器對數組參數的處理:
使用參數列表作為實參:
  接受實參列表,用它們在堆中創建並初始化一個數組。
  把數組的引用保存在棧中的形參里。
  如果在對應的形參數組位置沒有實參,編譯器會創建一個有零個元素的數組來使用。
使用數組變量作為實參:
  直接使用作為實參的數組,而不是重新創建一個。
5. 命名參數
C#允許我們使用命名參數(named parameter),只要顯式指定參數名字,就可以以任意順序在方法調用中列出實參。
示例:

6. 可選參數
可選參數就是我們可以在調用方法時包含這個參數,也可以省略。 為了表明名某參數可選,你需要在方法聲明時為參數提供默認值。
示例:

(1)不是所有參數類型都可以作為可選參數。只要值類型的默認值在編譯時可以確定,就可以使用值類型作為可選參數;只有在默認值是null時,引用類型才可以作為可選參數。
(2)所有必填參數必須在可選參數前聲明。如果有params參數,必須在可選參數后聲明。
(3)當有多個可選參數時,默認情況下只能省略后面幾個。若實際調用情況不符合該規則,可以使用命名參數,指定參數名稱進行傳值。

 

四、方法重載
一個類中可以用一個以上的方法擁有相同名稱,這叫方法重載(method overload)。使用相同名稱的方法必須有一個和其他方法不同的簽名(signature)。
方法的簽名由下列信息組成:
(1)方法的名稱
(2)參數的數目
(3)參數的數據類型和順序
(4)參數修飾符
注:
  返回類型不是簽名的一部分,形參名稱也不是簽名的一部分。

 

五、棧幀
調用方法時,內存從棧頂開始分配,保存和方法關聯的一些數據項。這塊內存叫做方法的棧幀(stack frame)。
棧幀內存包含以下內容:
(1)返回地址,即方法退出時繼續執行的位置。
(2)參數分配的內存,也就是方法的值參數,或參數數組。
(3)各種和方法調用相關的其他管理數據項。
在方法調用時,整個棧幀會壓入棧。
在方法退出時,整個棧幀從棧上彈出。彈出棧幀也叫棧展開(unwind)。
示例:

棧幀圖示:

 


免責聲明!

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



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