C# 方法的定義,調用,和參數傳遞(學習心得 12)
用來執行一個任務的語句塊。
每個 C# 程序至少有一個 Main 方法。
使用方法需要:
- 定義方法。
- 調用方法。
一、定義方法
語法:
<Access Specifier> <Return Type> <Method Name>(Parameter List)
{
Method Body
}
參數:
- Access Specifier:訪問修飾符。
- Return type:返回類型,一個方法可以返回一個值。返回類型是方法返回的值的數據類型。如果方法不返回任何值,則返回類型為 void。
- Method name:方法名稱,大小寫敏感。不能與 類 中其他標識符相同。
- Parameter list:參數列表,使用圓括號括起來。一個方法可能不包含參數。
- Method body:方法主體,指令集。
例(比大小方法):
class NumberManipulator
{
public int FindMax(int num1, int num2)
{
int result; // 局部變量聲明
if (num1 > num2)
result = num1;
else
result = num2;
return result;
}
...
}
二、調用方法
例:調用類自身的方法
using System;
namespace CalculatorApplication
{
class NumberManipulator
{
public int FindMax(int num1, int num2)
{
int result;
if (num1 > num2)
result = num1;
else
result = num2;
return result;
}
static void Main(string[] args)
{
int a = 100;
int b = 200;
int ret;
NumberManipulator n = new NumberManipulator(); // 類的實例化
ret = n.FindMax(a, b); //調用 類的FindMax 方法
Console.WriteLine("最大值是: {0}", ret );
Console.ReadLine();
}
}
}
運行結果:
最大值是: 200
例:調用別的類下的方法
using System;
namespace CalculatorApplication
{
class NumberManipulator
{
public int FindMax(int num1, int num2)
{
int result;
if (num1 > num2)
result = num1;
else
result = num2;
return result;
}
}
class Test
{
static void Main(string[] args)
{
int a = 100;
int b = 200;
int ret;
NumberManipulator n = new NumberManipulator();
ret = n.FindMax(a, b); //調用 FindMax 方法
Console.WriteLine("最大值是: {0}", ret );
Console.ReadLine();
}
}
}
運行結果:
最大值是: 200
三、遞歸方法調用
用方法進行自我調用,即遞歸。
例:計算階乘
using System;
namespace CalculatorApplication
{
class NumberManipulator
{
public int factorial(int num)
{
int result;
if (num == 1)
{
return 1; // 跳出遞歸的條件
}
else
{
result = factorial(num - 1) * num;
// 不斷調用方法自身,實現遞歸
return result;
}
}
static void Main(string[] args)
{
NumberManipulator n = new NumberManipulator();
//調用 factorial 方法
Console.WriteLine("6 的階乘是: {0}", n.factorial(6));
Console.WriteLine("7 的階乘是: {0}", n.factorial(7));
Console.WriteLine("8 的階乘是: {0}", n.factorial(8));
Console.ReadLine();
}
}
}
運行結果:
6 的階乘是: 720
7 的階乘是: 5040
8 的階乘是: 40320
四、參數傳遞
調用帶有參數的方法,需要傳遞參數。
傳遞參數的 3 種方式:
- 值參數:實參和形參,使用不同內存地址,形參發生變化不影響實參,保證實參安全性。
- 引用參數:實參和形參,使用相同內存地址。
- 輸出參數:這種方式可以返回多個值。
4.1 按值傳遞參數
參數傳遞的默認方式。
調用方法時,為每個參數創建一個新的存儲位置。
例:
using System;
namespace CalculatorApplication
{
class NumberManipulator
{
public void swap(int x, int y)
{
int temp;
temp = x; /* 保存 x 的值 */
x = y; /* 把 y 賦值給 x */
y = temp; /* 把 temp 賦值給 y */
}
static void Main(string[] args)
{
NumberManipulator n = new NumberManipulator();
/* 局部變量定義 */
int a = 100;
int b = 200;
Console.WriteLine("在交換之前,a 的值: {0}", a);
Console.WriteLine("在交換之前,b 的值: {0}", b);
/* 調用函數來交換值 */
n.swap(a, b);
Console.WriteLine("在交換之後,a 的值: {0}", a);
Console.WriteLine("在交換之後,b 的值: {0}", b);
Console.ReadLine();
}
}
}
運行結果:
在交換之前,a 的值:100
在交換之前,b 的值:200
在交換之後,a 的值:100
在交換之後,b 的值:200
4.2 按引用傳遞參數
對參數的內存位置進行引用。
在 C# 中,使用 ref 關鍵字聲明引用參數。
例:
using System;
namespace CalculatorApplication
{
class NumberManipulator
{
public void swap(ref int x, ref int y)
{
int temp;
temp = x; /* 保存 x 的值 */
x = y; /* 把 y 賦值給 x */
y = temp; /* 把 temp 賦值給 y */
}
static void Main(string[] args)
{
NumberManipulator n = new NumberManipulator();
/* 局部變量定義 */
int a = 100;
int b = 200;
Console.WriteLine("在交換之前,a 的值: {0}", a);
Console.WriteLine("在交換之前,b 的值: {0}", b);
/* 調用函數來交換值 */
n.swap(ref a, ref b); // 調用的時候也要有 ref
Console.WriteLine("在交換之後,a 的值: {0}", a);
Console.WriteLine("在交換之後,b 的值: {0}", b);
Console.ReadLine();
}
}
}
運行結果:
在交換之前,a 的值:100
在交換之前,b 的值:200
在交換之後,a 的值:200
在交換之後,b 的值:100
4.3 按輸出傳遞參數
使用輸出參數,可以從函數中返回兩個值。
輸出參數會把方法輸出的數據賦給自己,和引用傳遞參數類似。
例:
using System;
namespace CalculatorApplication
{
class NumberManipulator
{
public void getValue(out int x )
{
int temp = 5;
x = temp;
}
static void Main(string[] args)
{
NumberManipulator n = new NumberManipulator();
/* 局部變量定義 */
int a = 100;
Console.WriteLine("在方法調用之前,a 的值: {0}", a);
/* 調用函數來獲取值 */
n.getValue(out a);
Console.WriteLine("在方法調用之後,a 的值: {0}", a);
Console.ReadLine();
}
}
}
運行結果:
在方法調用之前,a 的值: 100
在方法調用之後,a 的值: 5
提供給輸出參數的變量不需要賦值。
當需要從一個參數沒有指定初始值的方法中返回值時,輸出參數特別有用。
例:
using System;
namespace CalculatorApplication
{
class NumberManipulator
{
public void getValues(out int x, out int y )
{
Console.WriteLine("請輸入第一個值: ");
x = Convert.ToInt32(Console.ReadLine());
Console.WriteLine("請輸入第二個值: ");
y = Convert.ToInt32(Console.ReadLine());
}
static void Main(string[] args)
{
NumberManipulator n = new NumberManipulator();
/* 局部變量定義 */
int a , b;
/* 調用函數來獲取值 */
n.getValues(out a, out b);
Console.WriteLine("在方法調用之後,a 的值: {0}", a);
Console.WriteLine("在方法調用之後,b 的值: {0}", b);
Console.ReadLine();
}
}
}
運行結果:
請輸入第一個值:
3
請輸入第二個值:
8
在方法調用之後,a 的值: 3
在方法調用之後,b 的值: 8