1. 函數(方法)的簡介 函數,在C# 中更多的被稱為方法。它表示一個的類所具有的行為(方法,函數)。 方法的作用 封裝一些公共的代碼,以達到功能重覆利用,減少代碼冗餘。例如,我們經常要進行 輸入,輸出,系統於是幫我們封裝好了 Console.WriteLine(), Console.ReadLin ...
函數,在C# 中更多的被稱為方法。它表示一個的類所具有的行為(方法,函數)。
方法的作用
封裝一些公共的代碼,以達到功能重覆利用,減少代碼冗餘。例如,我們經常要進行 輸入,輸出,系統於是幫我們封裝好了 Console.WriteLine(), Console.ReadLine()
等方法。
一個方法是把一些相關的語句組織在一起,用來執行一個任務的語句塊。每一個 C# 程式至少有一個帶有 Main 方法的類。
要使用一個方法,您需要:
-
定義方法
-
調用方法
2. C# 中定義方法
當定義一個方法時,從根本上說是在聲明它的結構的元素。在 C# 中,定義方法的語法如下:
<Access Specifier> <Return Type> <Method Name>(Parameter List)
{
Method Body
}
下麵是方法的各個元素:
-
Access Specifier:訪問修飾符,這個決定了變數或方法對於另一個類的可見性。
-
Return type:返回類型,一個方法可以返回一個值。返回類型是方法返回的值的數據類型。如果方法不返回任何值,則返回類型為 void。
-
Method name:方法名稱,是一個唯一的標識符,且是大小寫敏感的。它不能與類中聲明的其他標識符相同。
-
Parameter list:參數列表,使用圓括弧括起來,該參數是用來傳遞和接收方法的數據。參數列表是指方法的參數類型、順序和數量。參數是可選的,也就是說,一個方法可能不包含參數。
-
Method body:方法主體,包含了完成任務所需的指令集。
有參有返回值
下麵的代碼片段顯示一個函數 FindMax
,它接受兩個整數值,並返回兩個中的較大值。它有 public 訪問修飾符,所以它可以使用類的實例從類的外部進行訪問。
class Program { static void Main(string[] args) { int a =10; int b =5; int result = FindMax(a,b); // 調用方法 Console.WriteLine(result); } // 定義一個求最大值的方法 public static int FindMax(int num1, int num2) { /* 局部變數聲明 */ int result; if (num1 > num2) result = num1; else result = num2; return result; } }
形參與實參
num1,num2
這兩個變數並不是實際上定義的變數,他倆只是 a,b 這兩變數在記憶體中複製的一個副本,我們把num1,num2
這種用於接收方法的參數值的變數叫作 形參, 把 a,b 這種實際被定義的變數且用於傳遞的變數叫作實參。
無參有返回值方法
class Program { static void Main(string[] args) { int result = FindMax(); // 調用方法 Console.WriteLine(result); } // 定義一個求最大值的方法 public static int FindMax() { int num1=10 ; int num2=5 ; int result; if (num1 > num2) result = num1; else result = num2; return result; } }
無參無返回值
class Program { static void Main(string[] args) { Hello(); // 調用方法,不能接返回值 } public static void Hello() { Console.WriteLine("我是無參無返回值函數"); } }
有參無返回值
class Program { static void Main(string[] args) { int a =20; int b =10; Sum(a,b); // 調用方法,不能接返回值 Console.WriteLine($"a={a},b={b}"); // a=20,b=10; } public static void Sum(int a,int b) { a=2; b=1; Console.WriteLine("a+b={0}",a+b); // a+b=3 } }
3. 參數傳遞
當調用帶有參數的方法時,您需要向方法傳遞參數。在 C# 中,有三種向方法傳遞參數的方式:
方式 | 描述 |
---|---|
值參數 | 這種方式複製參數的實際值給函數的形式參數,實參和形參使用的是兩個不同記憶體中的值。在這種情況下,當形參的值發生改變時,不會影響實參的值,從而保證了實參數據的安全。 |
引用參數 | (關鍵字:ref)這種方式複製參數的記憶體位置的引用給形式參數。這意味著,當形參的值發生改變時,同時也改變實參的值。 |
輸出參數 | (關鍵字 out )這種方式可以返回多個值。 |
按值傳遞參數
這是參數傳遞的預設方式。在這種方式下,當調用一個方法時,會為每個值參數創建一個新的存儲位置。
實際參數的值會複製給形參,實參和形參使用的是兩個不同記憶體中的值。所以,當形參的值發生改變時,不會影響實參的值,從而保證了實參數據的安全。下麵的實例演示了這個概念:
public static void swap(int x, int y) { int temp; temp = x; /* 保存 x 的值 */ x = y; /* 把 y 賦值給 x */ y = temp; /* 把 temp 賦值給 y */ } static void Main(string[] args) { /* 局部變數定義 */ int a = 100; int b = 200; Console.WriteLine("在交換之前,a 的值: {0}", a); Console.WriteLine("在交換之前,b 的值: {0}", b); /* 調用函數來交換值 */ swap(a, b); Console.WriteLine("在交換之後,a 的值: {0}", a); Console.WriteLine("在交換之後,b 的值: {0}", b); Console.ReadLine(); }
當上面的代碼被編譯和執行時,它會產生下列結果:
在交換之前,a 的值:100 在交換之前,b 的值:200 在交換之後,a 的值:100 在交換之後,b 的值:200
結果表明,即使在函數內改變了值,值也沒有發生任何的變化。
按引用傳遞參數-ref
引用參數是一個對變數的記憶體位置的引用。當按引用傳遞參數時,與值參數不同的是,它不會為這些參數創建一個新的存儲位置。引用參數表示與提供給方法的實際參數具有相同的記憶體位置。
在 C# 中,使用 ref 關鍵字聲明引用參數。下麵的實例演示了這點:
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) { /* 局部變數定義 */ int a = 100; int b = 200; Console.WriteLine("在交換之前,a 的值: {0}", a); Console.WriteLine("在交換之前,b 的值: {0}", b); /* 調用函數來交換值 */ swap(ref a, ref b); Console.WriteLine("在交換之後,a 的值: {0}", a); Console.WriteLine("在交換之後,b 的值: {0}", b); Console.ReadLine(); }
當上面的代碼被編譯和執行時,它會產生下列結果:
在交換之前,a 的值:100 在交換之前,b 的值:200 在交換之後,a 的值:200 在交換之後,b 的值:100
結果表明,swap 函數內的值改變了,且這個改變可以在 Main 函數中反映出來。
按輸出傳遞參數-out
return 語句可用於只從函數中返回一個值。但是,可以使用 輸出參數 來從函數中返回兩個值。輸出參數會把方法輸出的數據賦給自己,其他方面與引用參數相似。
下麵的實例演示了這點:
public void getValue(out int x ) { int temp = 5; x = temp; } static void Main(string[] args) { /* 局部變數定義 */ int a = 100; Console.WriteLine("在方法調用之前,a 的值: {0}", a); /* 調用函數來獲取值 */ getValue(out a); Console.WriteLine("在方法調用之後,a 的值: {0}", a); Console.ReadLine(); }
當上面的代碼被編譯和執行時,它會產生下列結果:
在方法調用之前,a 的值: 100 在方法調用之後,a 的值: 5
忽略輸出參數
static void Main(string[] args) { int a = 10; int b = 5; int res= Sum(a,out b,out _); // out _ 忽略輸出第三個參數 } // 定義一個求最大值的方法 public static int Sum(int num1, out int num2,out int result) { num1 = 2; num2 = 3; result = num2 + num1; return result; }
4. 方法重載
一、 描述
在面向對象的語言中,允許我們在同一個類中定義多個方法名相同、參數列表(參數類型,參數個數)不同的方法,這樣的形式我們稱為方法重載。調用時編譯器會根據實際傳入參數的形式,選擇與其匹配的方法執行。
二、 重載的分析
1.生活中的方法重載
2.將生活重載的表現形式,抽象成代碼的形式:
3.構成方法重載的條件
-
方法名相同。
-
方法參數類型不同或者參數個數不同。
-
在同一個類中。
平均數案例:
class Program { static void Main(string[] args) { Console.WriteLine(Avg(2,6,4)); // 請問會執行哪個方法? } static int Avg(int num1,int num2,int num3) { return (num1+num2+num3) / 3; } // 方法2:與方法1,參數類型不同,構成重載 static decimal Avg(decimal num1,decimal num2,decimal num3) { return (num1+num2+num3) / 3.0m; } // 方法3:與方法2,參數個數不同,構成重載 static decimal Avg(decimal num1,decimal num2) { return (num1+num2) / 2.0m; } }
5. 作業
-
定義一個接收三個形參的方法( 方法重載,decimal, int , long),使用三目運算符計算最小值
-
定義一個無參有返回值的方法,在方法中從控制台接收三個數字,計算並返回平均值。
-
定義一個無參無返回值的方法。
-
定義一個有兩個輸出參數(out)的方法 , 並將兩個參數的值進行交換,輸出實參的交換後的值。
視頻教程:
譽尚學教育_譽尚學教育騰訊課堂官網 (qq.com)
或者:C# 最強入門編程(.Net 學習系列開山巨作)_嗶哩嗶哩_bilibili
海闊平魚躍,天高任我行,給我一片藍天,讓我自由翱翔。