一、方法的結構
1.方法的概念
C#中的方法就是聲明在類型中的語句塊,是類型的函數成員。它既可以有名稱,也可以沒有名稱,沒有方法名的方法稱為匿名方法。
2.方法的結構
方法主要由兩部分組成:方法頭和方法體。其中,方法頭指定方法的特徵,包括方法是否傳回值以及傳回值的類型、方法名和參數列表;方法體就是由一對大括弧括起來的可執行代碼的語句序列,包括本地變數、流程式控制制結構、方法調用和嵌套塊等。方法的結構如所示
3.方法聲明樣本
下面樣本聲明一個無傳回值的、方法名為“SayHello”、無參數的公用方法。
1 /// <summary>2 /// 方法聲明3 /// </summary>4 public void SayHello()5 {6 System.Console.WriteLine("Hello World!");7 }
二、本地變數
1.本地變數
本地變數就是聲明在方法體中的變數,本地變數經常用於儲存本地的或者臨時的計算資料。本地變數存在於建立它的塊以及嵌套的塊。可以在方法體內的任意地方聲明本地變數,但是必須遵循“先聲明、後賦值、再使用”的先後順序。
聲明本地變數的文法:“ Type Identifier = value; ",其中Type表示變數類型,Identifier表示變數名,value表示給變數賦的初始值。下面的方法中聲明了兩個本地變數。
1 /// <summary> 2 /// 方法聲明 3 /// </summary> 4 public void SayHello() 5 { 6 // 聲明兩個本地變數 “name” 和“ age ” 7 string name = "yunshi"; 8 int age = 23; 9 System.Console.WriteLine("我叫{0},今年{1}歲了!", name, age);10 }
2.本地變數與類欄位的對比
1).生存期:執行個體欄位從執行個體被建立時開始,直到執行個體不再被訪問時結束;本地變數從它在塊中聲明開始,直到塊完成執行時結束。
2).隱式初始化:執行個體欄位會隱式初始化為它的欄位類型的預設值;本地變數沒有隱式初始化,所有變數必須先初始化,然後才能使用,否則報錯。
3).儲存位置:類的所有欄位都是儲存在對記憶體堆中的,無論是實值型別的還是參考型別的;本地變數如果是實值型別,則儲存在記憶體棧裡,如果是參考型別,則引用儲存在棧裡,而實際資料存放區在堆裡。
3.類型推斷和var
1).類型推斷
當我們聲明本地變數時,很多時候我們所寫的變數類型都是編譯器可以通過賦值的等號右邊的值來反推出來,這就叫類型推斷。比如 int i =10; 這條聲明語句,左邊的類型int 可以通過右邊的10推斷出來。由於類型推斷,催生了下邊的var關鍵字。
2).var關鍵字
從C#3.0開始,可以在變數聲明的開始部分的顯式類型名的位置使用新的var關鍵字,它表示可以從初始化語句右邊推斷出的類型。下面的兩條本地變數聲明語句中的int 和 var 是等價的。
1 // 聲明2個整型變數i和j2 int i = 10;3 var j = 100;
var關鍵字使用條件:只能用於本地變數,不能用於欄位;只能在變數聲明語句中包含初始化時才能使用,如果只是聲明一個變數而沒有初始化,就不能使用var;var關鍵字並不改變C#的強型別性質,一旦編譯器推斷出變數的類型,該類型就是固定的了。
C#3.0及以後版本推薦在以下幾種情況下使用var關鍵字隱式類型化局部變數,以簡化程式的書寫:
①.如果指派陳述式右側的變數類型十分明顯,或在精確的類型並不重要時,使用隱式類型的局部變數;指派陳述式右側的類型不明顯時,不要使用var。
1 var var1 = "This is clearly a string.";2 var var2 = 27;3 // 數字和字串用"+"號相連,最後轉換為了字串4 var var3 = Console.ReadLine() + var1 + var2;5 Console.WriteLine(var3);
②.使用隱式類型在 for 和 foreach 迴圈中確定迴圈變數的類型。
1 // a.在 for 語句中使用隱式類型。 2 var syllable = "ha"; 3 var laugh = ""; 4 for (var i = 0; i < 10; i++) 5 { 6 laugh += syllable; 7 Console.WriteLine(laugh); 8 } 9 10 // b.在 foreach 語句中使用隱式類型。11 foreach (var ch in laugh)12 {13 if (ch == 'h')14 Console.Write("H");15 else16 Console.Write(ch);17 }
三、本地常量
1.本地常量
本地常量就是聲明在方法體中的常量。常量(本地常量/成員常量)的特徵如下:常量在聲明的同時必須初始化;在聲明後值不能改變。
2.本地常量的聲明
本地常量使用const關鍵字聲明。文法:“const Type Identifier = value;” const不是修飾符,而是核心聲明的一部分,必須放在類型之前,其它部分和本地變數聲明文法相同。下面是一個聲明並且讀取本地常量值的樣本:
1 /// <summary> 2 /// 顯示圓的面積 3 /// </summary> 4 void DisplayRadius() 5 { 6 // 聲明本地常量 7 const double PI = 3.1416; 8 9 // 聲明本地變數10 int radius = 2;11 12 // 讀取本地變數和本地常量的值13 double area = radius * radius * PI;14 15 Console.WriteLine("Radius:{0},Area:{1}", radius, area);16 }
四、方法調用
1.方法使用“方法名+參數列表”進行調用。下面是一個調用上面“顯示圓的面積”的方法,其中參數為空白。
1 static void Main(string[] args)2 {3 Program p = new Program();4 // 使用"執行個體名.方法名"調用執行個體方法5 p.DisplayRadius();6 }
2.方法調用的執行順序
1).當前方法的執行在調用點被掛起。
2).流程式控制制轉移到被呼叫者法的開始。
3).被呼叫者法執行,直到完成(或拋出異常)。
4).控制回到發起調用的方法。
該調用順序的圖示如下:
五、方法傳回值
1.傳回值類型
很多方法聲明的目的就是為了它的傳回值。方法是否傳回值以及傳回值的資料類型都由方法聲明的傳回值類型決定,如果要傳回值,則必須在方法名前面聲明一個具體的傳回型別;如果方法不傳回值,則不行必須聲明void傳回型別。下面的樣本聲明一個返回int值的方法:
1 /// <summary>2 /// 獲得當前小時3 /// </summary>4 /// <returns></returns>5 int GetHour()6 {7 var dt = new DateTime();8 return dt.Hour;9 }
2.返回語句
1).普通return語句
在上面的樣本中,使用return語句返回了當前小時數。如果方法頭中聲明了非void的傳回型別,則必須在方法體中每一條穿過方法的路徑上有一條帶有確定值的reutrn語句。return語句的文法為:“return Expression;”,其中Expression為一個確定的值。
2).void方法的return語句
本來,void方法不需要返回語句,但我們可以根據某些條件使用不帶參數的return語句提前退出方法以簡化程式邏輯。文法為“ reutrn;"。注意,這裡的return語句不帶參數,只有一個分號,並且只能用於傳回型別為void的方法體中。下面是一個樣本:
1 /// <summary> 2 /// 根據條件提前退出方法 3 /// </summary> 4 /// <param name="msg"></param> 5 void Test(string msg) 6 { 7 if (msg == "Hello") 8 { 9 return;10 }11 Console.WriteLine("你好!");12 }