1、字段和本地變量、本地常量
字段:隸屬於類的變量,即類的成員變量。
本地變量:於保存本地的或臨時的計算數據,即局部變量。
本地常量:必須聲明在塊內部,聲明時必須初始化,聲明後不能改變。
實例字段與本地變量區別圖解:數組
本地變量生存週期圖解:spa
注:
在C和C++中,能夠先聲明一個本地變量,而後在嵌套塊中聲明另外一個同名本地變量。在內部範圍,內部變量覆蓋外部變量。然而,在C#中無論嵌套級別如何,都不能在第一個本地變量的有效範圍內聲明另外一個同名本地變量。對象
2、類型推斷和var關鍵字
若編譯器能從初始化語句的右邊推斷出類型名,則可以使用var關鍵字代替具體類型名。var不是特定的類型變量符號,它表示任何能夠從初始化語句的右邊推斷出來的類型。
使用var的條件:
(1)只能用於本地變量,不能用於字段
(2)只能在變量聲明中包含初始化時使用
(3)一旦編譯器推斷出變量的類型,它就是固定且不能更改的
注:
var關鍵字不像JavaScript的var那樣能夠引用不一樣的類型。它是從等號右邊推斷出的實際類型的速記。var關鍵字並不改變C#的強類型性質。blog
3、值參數、引用參數、輸出參數、參數數組、命名參數、可選參數
1. 值參數
使用值參數,經過將實參的值複製到形參的方式把數據傳遞給方法。方法被調用時,系統作以下操做:
(1)在棧中爲形參分配空間。
(2)將實參的值複製給形參。
方法中對形參的修改是否會影響方法外的實參?
若實參是值類型,值被複制,產生一個獨立的數據,此時形參和實參存儲在內存不一樣位置,方法中對形參的修改不會影響方法外的實參;若實參是引用類型,則引用被複制,此時雖然形參和實參是兩個存儲在內存不一樣位置的引用,可是它們都指向堆內存中同一個數據對象,因此方法中對形參的修改會直接影響方法外的實參。
2. 引用參數
使用引用參數的要求:
(1)必須在方法的聲明和調用時都使用ref修飾符。
(2)實參必須是變量,在用做實參前必須被賦值。若是是引用類型變量,能夠賦值爲一個引用或null。
示例:ip
與值參數不一樣,引用參數不會爲形參在棧上分配內存,實際上形參的參數名將做爲實參變量的別名,指向相同的內存位置,因此在方法的執行過程當中對形參作的任何改變在方法完成後依然有效。
關於引用類型對象做爲值參數和引用參數的區別?
(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)當有多個可選參數時,默認狀況下只能省略後面幾個。若實際調用狀況不符合該規則,可使用命名參數,指定參數名稱進行傳值。List
4、方法重載
一個類中能夠用一個以上的方法擁有相同名稱,這叫方法重載(method overload)。使用相同名稱的方法必須有一個和其餘方法不一樣的簽名(signature)。
方法的簽名由下列信息組成:
(1)方法的名稱
(2)參數的數目
(3)參數的數據類型和順序
(4)參數修飾符
注:
返回類型不是簽名的一部分,形參名稱也不是簽名的一部分。
5、棧幀
調用方法時,內存從棧頂開始分配,保存和方法關聯的一些數據項。這塊內存叫作方法的棧幀(stack frame)。
棧幀內存包含如下內容:
(1)返回地址,即方法退出時繼續執行的位置。
(2)參數分配的內存,也就是方法的值參數,或參數數組。
(3)各類和方法調用相關的其餘管理數據項。
在方法調用時,整個棧幀會壓入棧。
在方法退出時,整個棧幀從棧上彈出。彈出棧幀也叫棧展開(unwind)。
示例:
棧幀圖示: