1. 程式人生 > >C#每日一課(十一)

C#每日一課(十一)

C#方法

一個方法是把一些相關邏輯的語句組織在一起,用來執行一個任務的語句塊。

使用方法過程

  1. 定義方法
  2. 呼叫方法

 

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#中有三種向方法傳遞引數的方式

  1. 值引數

這種方式會複製引數的實際值給到函式的形式引數,實參和形參使用的是兩個不同的記憶體中的值。在這種情況下,當形參的值發生改變時,不會影響到實參值從而保證了實引數據的安全。

  1. 引用引數

這種方式複製引數的記憶體位置的引用給形式引數。意味著,當形參的值發改變 的時候同時也會改變實參的值。

  1. 輸出引數

可以用來返回多個值

 

按值傳遞引數

這種傳遞方式是預設的傳遞方式,當呼叫一個方法時,會為每個值引數建立一個新的儲存位置。

實參的值會複製給到形參,實參與形參兩者使用的是兩個不同的記憶體中的值。所以,當形參值發生改變時,不會影響到實參的值,從而保證實引數據的安全性。

在類中加入如下方法:

// 值傳遞函式

        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識別符號標識)。