1、什么是方法?
方法即將相關(guān)的代碼語(yǔ)句組織在一起,用來(lái)執(zhí)行一個(gè)任務(wù)的代碼塊。
那么方法的作用是什么?
一是減少冗余代碼,讓程序看起來(lái)不那么臃腫雜亂。
二是便于后期閱讀和維護(hù)代碼。
例如:挖礦這件事兒。
如果沒有專門的方法,那么每一次挖礦,就需要寫一次關(guān)于挖礦的全部代碼。這樣下來(lái),代碼就會(huì)非常多,而且在后面要修改代碼的時(shí)候,每個(gè)位置都要修改,可謂麻煩至極。
而有了方法,只需要將挖礦的一系列操作丟進(jìn)一個(gè)方法里面,當(dāng)你要挖礦的時(shí)候,只要調(diào)用該方法,就可以了。后面計(jì)算是要增刪改方法中的功能,也只需要對(duì)這一個(gè)方法進(jìn)行操作即可。
2、方法的組成
方法組成格式:
<訪問修飾符> [static] <返回類型> <方法名>(參數(shù)類型1 參數(shù)名1,參數(shù)類型2 參數(shù)名2...)
{
方法體
}
- 訪問修飾符:決定了該方法能否被其他類可見。例如:public ,是所有人可見;而 private,只能自己可見。
static
:表示靜態(tài),在某個(gè)類中是唯一的。若方法用static修飾,不需要實(shí)例化類對(duì)象,可以直接類名點(diǎn)方法名調(diào)用;如果沒有static修飾,則需要實(shí)例化類對(duì)象來(lái)使用。- 返回類型:決定了方法最后返回值的數(shù)據(jù)類型。這里除了 void 不需要 return,其他所有類型都需要 return 來(lái)返回值。
- 方法名:即方法的名字,當(dāng)將方法寫好,要調(diào)用方法的時(shí)候,可以直接通過(guò)方法名來(lái)調(diào)用。
- 參數(shù):參數(shù)可以有多個(gè),也可以沒用。每個(gè)參數(shù)都要有對(duì)應(yīng)的數(shù)據(jù)類型和參數(shù)名,參數(shù)名是在方法中調(diào)用。
- 方法體:即要實(shí)現(xiàn)某個(gè)任務(wù)寫的代碼語(yǔ)句。
3、方法調(diào)用實(shí)例
(1)不使用static修飾:
class c1{
static void Main(string[] args){
int n1 = 20;
int n2 = 30;
c1 c1 = new c1();
int count = c1.addNum(n1, n2);
Console.WriteLine($"{n1}+{n2}={count}"); // 20+30=50
}
public int addNum(int num1, int num2){
int num = num1 + num2;
return num
}
}
(2)使用static修飾:
class c1{
static void Main(string[] args){
int x = 300;
int y = 100;
c2.swap(x, y);
Console.WriteLine($"交換后,x為{x}, y為{y}");
}
}
class c2{
public static void swap(int n1, int n2){
Console.WriteLine("我真的被調(diào)用了!");
int temp = n1;
n1 = n2;
n2 = temp;
}
}
從打印結(jié)果可以知道,c2 中的 swap 方法確實(shí)已經(jīng)被調(diào)用了,可是結(jié)果沒有改變。
這是因?yàn)樵摲椒ㄋ褂玫氖?strong>按值傳遞參數(shù),方法中的 n1 和 n2 是形參,而調(diào)用方法時(shí) x 和 y 是實(shí)參。實(shí)參和形參是在兩個(gè)不同內(nèi)存中的值,當(dāng)調(diào)用方法的時(shí)候,實(shí)參的值會(huì)賦值給形參。這時(shí)候形參雖然發(fā)生了改變,但也不會(huì)影響到實(shí)參的值。
如果想要獲得結(jié)果,要將返回類型 void 改為 int,在結(jié)尾return回兩個(gè)值。調(diào)用方法的時(shí)候,將值賦給x和y即可。
除此之外,還有其他的方法來(lái)解決該問題。
4、參數(shù)傳遞
參數(shù)傳遞的方式有三種,分別是:按值傳遞參數(shù)、按引用傳遞參數(shù)和按輸出傳遞參數(shù)。按值傳遞參數(shù)上面已經(jīng)有了展示,就不多介紹了。
(1)按引用傳遞參數(shù)
引用參數(shù)是一個(gè)對(duì)變量的內(nèi)存位置的引用。當(dāng)按引用傳遞參數(shù)時(shí),與值參數(shù)不同的是,它不會(huì)重新為這些參數(shù)創(chuàng)建一個(gè)新的存儲(chǔ)位置。引用參數(shù)與提供給方法的實(shí)際參數(shù)是具有相同的內(nèi)存位置。
換句話說(shuō),形參改變了,那么實(shí)參也將會(huì)改變。
注:在C#中,引用參數(shù)是需要用ref關(guān)鍵字來(lái)聲明的。
class c1{
static void Main(string[] args){
int x = 300;
int y = 100;
Console.WriteLine($"交換前,x為{x}, y為{y}");
c2.swap(ref x, ref y);
Console.WriteLine($"交換后,x為{x}, y為{y}");
}
}
class c2{
public static void swap(ref int n1, ref int n2){
int temp = n1;
n1 = n2;
n2 = temp;
}
}
從結(jié)果來(lái)看,形參改變了,實(shí)參也發(fā)生了改變。
(2)按輸出傳遞參數(shù)
return 語(yǔ)句可用于只從函數(shù)中返回一個(gè)值。但是,可以使用輸出函數(shù)來(lái)從函數(shù)中反回兩個(gè)值。輸出參數(shù)會(huì)把方法輸出的數(shù)據(jù)賦給自己,其他方面與引用參數(shù)相似。
注:輸出參數(shù)需要用 out 關(guān)鍵字來(lái)修飾。
class c1{
static void Main(string[] args){
c1 c1 = new c1();
int a = 100;
Console.WriteLine($"調(diào)用方法前,a為{a}");
c1.getValue(out a);
Console.WriteLine($"調(diào)用方法后,a為{a}");
c1.getValue(out int b);
Console.WriteLine($"沒有賦值,b為");
}
public void getValue(out int x){
int temp = 5;
x = temp;
}
}
和引用參數(shù)一樣,輸出參數(shù)一樣是和實(shí)際參數(shù)是同樣的內(nèi)存地址,輸出參數(shù)改變,實(shí)際參數(shù)也會(huì)改變。
不同的是,引用參數(shù)的實(shí)際參數(shù)需要賦值;而輸出參數(shù)的實(shí)際參數(shù)只需要聲明變量的類型,不需要變量初始值,它會(huì)自動(dòng)將方法中的值賦給該變量。
5、總結(jié)
(1)方法是為了減少重復(fù)代碼,便于后期的閱讀和維護(hù)。
(2)方法的組成:訪問修飾符、返回類型、方法名以及參數(shù)類型和參數(shù)名。
(3)靜態(tài)修飾符 static,可有可無(wú)。有則可以直接通過(guò)類名點(diǎn)方法名來(lái)調(diào)用,沒有則需要將類創(chuàng)建一個(gè)實(shí)例化。
(4)參數(shù)傳遞方式:按值傳遞參數(shù)、按引用傳遞參數(shù)和按輸出傳遞參數(shù)。
關(guān)于C#方法的一些基本內(nèi)容就到此結(jié)束了。