C#每日一課(十一)
C#方法
一個方法是把一些相關邏輯的語句組織在一起,用來執行一個任務的語句塊。
使用方法過程
- 定義方法
- 呼叫方法
C#中定義方法
定義一個方法從根本上來說是宣告它的結構元素,C#中定義方法的語句如下
<Access Specifier> <Return Type> <Method Name>(Parameter List)
{
Method Body
}
Access Specifier:它是一個訪問修飾符,這個修飾符決定了它對另一個類的可見性
Return Type:返回值型別,一個方法可以返回一個值。如果一個方法不返回任何值則返回型別設定為void
Method name:方法名稱,是一個唯一的識別符號,且是大小寫敏感的。它不能與類中宣告的其它識別符號相同。
Parameter list:引數列表,使用圓括號括起來,引數是用來傳遞和接收方法的資料,引數列表包含了引數的型別、順序和數量。這裡的引數是可選的,一個方法可以沒有任何方法
Method body:方法的主體部分,也就是方法要實現的邏輯
在visual studio當中新建一個專案,在新建的專案中可以新增如下方法
/** * 最後修改時間:2018-09-13 * 最後修改人:xiesheng * 函式名稱:findMax * 返回值型別:int * 引數說明:ArrayList * 函式說明:用來獲取一個ArrayList<int>中各個元素的最大值並返回 */ public static int FindMax(ArrayList arr) { /*宣告一個區域性變數*/ int max = 0; foreach (int i in arr) { if (max < i) { max = i; } } return max; }
C#中對方法的呼叫
在Main方法中新增如下程式碼:
/*主函式*/ static void Main(string[] args) { ArrayList arr = new ArrayList(); arr.Add(12); arr.Add(10); arr.Add(-2); arr.Add(9); Console.WriteLine("max = {0}", FindMax(arr)); Console.ReadKey(); }
編譯執行後結果如下:
上面的過程是把findMax()方法和Main()方法放在同一個類中,也可以把方法單獨放在一個類當中,然後在Main()方法中實列化這個類,然後呼叫這個類的方法(可參考C#每日一課十)。
C#中遞迴方法呼叫
當一個方法進行自我呼叫時,這個就是所謂的遞迴。
新增一個計算階乘的方法如下:
/**
* 最後修改時間:2018-09-13
* 最後修改人:xiesheng
* 函式名稱:factorial
* 返回值型別:long
* 引數說明:int
* 函式說明:返回指定數量的階乘值
*/
public static long Factorial(int num)
{
/*區域性變數*/
long result = 0;
if (num == 1)
{
result = 1;
}
else
{
result = Factorial(num - 1) * num;
}
return result;
}
此方法在Main方法中做如下呼叫:
/*驗證遞迴呼叫*/
Console.WriteLine("1的階乘是:{0}", Factorial(1));
Console.WriteLine("6的階乘是:{0}",Factorial(6));
Console.WriteLine("7的階乘是:{0}", Factorial(7));
Console.WriteLine("8的階乘是:{0}", Factorial(8));
編譯執行後的結果如下:
C#中引數傳遞
C#中有三種向方法傳遞引數的方式
- 值引數
這種方式會複製引數的實際值給到函式的形式引數,實參和形參使用的是兩個不同的記憶體中的值。在這種情況下,當形參的值發生改變時,不會影響到實參值從而保證了實引數據的安全。
- 引用引數
這種方式複製引數的記憶體位置的引用給形式引數。意味著,當形參的值發改變 的時候同時也會改變實參的值。
- 輸出引數
可以用來返回多個值
按值傳遞引數
這種傳遞方式是預設的傳遞方式,當呼叫一個方法時,會為每個值引數建立一個新的儲存位置。
實參的值會複製給到形參,實參與形參兩者使用的是兩個不同的記憶體中的值。所以,當形參值發生改變時,不會影響到實參的值,從而保證實引數據的安全性。
在類中加入如下方法:
// 值傳遞函式
public static void Swap(int x, int y) {
int temp;
temp = x;
x = y;
y = temp;
Console.WriteLine("函式交換後在方法中的值如下:x={0},y={1}",x,y);
}
在Main方法中做如下呼叫方法:
int x = 100, y = 200;
//值傳遞呼叫
Console.WriteLine("--------------值傳遞呼叫----------------");
Console.WriteLine("函式執行交換前的值如下:x={0},y={1}",x,y);
Swap(x, y);
Console.WriteLine("函式執行交換後的值如下:x={0},y={1}", x, y);
編譯執行後的結果如下:
從上面的結果可以看到,在方法呼叫前後方法呼叫後實參的值是沒有做任何變化的,但在方法中做了形參內容的主變化。
按引用傳遞引數
引用引數是一個對變數的記憶體位置的引用。當使用引用傳遞引數值時,與值引數不同的是,它不會為形參建立新的儲存位置。引用引數表示提供給方法的實際引數具有相同的記憶體位置。
在C#中使用ref關鍵字來宣告引用引數。
在類中新增方法如下:
// 引用引數
public static void Swap(ref int x, ref int y) {
int temp;
temp = x;
x = y;
y = temp;
Console.WriteLine("函式交換後在方法中的值如下:x={0},y={1}", x, y);
}
在Main方法中呼叫這個引用傳參方法
//引用傳遞呼叫
Console.WriteLine("--------------引用傳遞呼叫----------------");
Console.WriteLine("函式執行交換前的值如下:x={0},y={1}", x, y);
Swap(ref x, ref y);
Console.WriteLine("函式執行交換後的值如下:x={0},y={1}", x, y);
編譯執行結果如下:
從執行的結果可以看到,在方法中對引數的改變最終影響到了實參的值,因為這個時候使用引用傳參會使形參和實參指向同一個記憶體地址,當形參改變的時對應記憶體地址上的值就是發生變化。
按輸出引數傳遞引數
在方法中return語句只可以返回一個值。但是可以使用輸出引數來返回兩個值。輸出引數會把方法輸出的資料賦給自己,其它的方面與引用引數類似。
在類中新增如下方法:
//輸出引數
public static int MaxAndMin(out int min, ArrayList list) {
int max;
max = Int32.Parse(list[0].ToString());
foreach(int i in list) {
if (max <= i) {
max = i;
}
}
min = Int32.Parse(list[0].ToString());
foreach (int i in list) {
if (min >= i) {
min = i;
}
}
return max;
}
在Main方法加入如下程式碼進行方法呼叫:
//輸出引數
Console.WriteLine("--------------輸出引數呼叫----------------");
ArrayList arr1 = new ArrayList();
arr1.Add(100);
arr1.Add(38);
arr1.Add(-2);
arr1.Add(98);
int min = 0, max = 0;
max = MaxAndMin(out min,arr1);
Console.WriteLine("呼叫方法前陣列中最大值:{0}",max);
Console.WriteLine("呼叫方法前陣列中最小值:{0}",min);
編譯執行後結果如下:
其中可以看到,方法在具有返回值的同時,可以在引數中加入輸出引數(out識別符號標識)。