輕松學(xué)習(xí)C#的方法
在類中自定義的“函數(shù)”稱為“方法”,由于C#是完全面向?qū)ο蟮恼Z(yǔ)言,同時(shí)為了便于解釋后面要學(xué)的C#類,這里的“方法”來稱呼“函數(shù)”。
方法是一種用于實(shí)現(xiàn)可以有對(duì)象或類執(zhí)行的計(jì)算機(jī)或操作的成員,是一個(gè)已命名的語(yǔ)句集。每個(gè)方法都有一個(gè)名稱和主體。方法名應(yīng)該是一個(gè)有意義的標(biāo)識(shí)符,應(yīng)描述出方法的用途。方法主體包含了調(diào)用方法時(shí)實(shí)際執(zhí)行的語(yǔ)句。用戶可以為大多數(shù)方法提供一些數(shù)據(jù)來進(jìn)行處理,并讓其返回一些信息(通常是處理結(jié)果)。方法是一種基本的,功能強(qiáng)大的編程機(jī)制。
方法的聲明格式為:
修飾符 返回值類型 方法名稱(參數(shù)列表)
{
方法體
}
其中的修飾符和參數(shù)列表都是可選的,修飾符如下:new,public,protected,internal,private,static,virtual,sealed,override,abstract,extern,partial
如果以下所有條件都為真,則所述的聲明就具有一個(gè)有效的修飾符組合:
(1)該聲明包含一個(gè)由訪問修飾符組成的有效組合
(2)該聲明中所含的修飾符沒有彼此相同的
(3)該聲明最多包含下列修飾符中的一個(gè):static,virtual和override
(4)該聲明最多包含下列修飾符中的一個(gè):new和override
(5)如果聲明中包含abstract修飾符,則該聲明不包含下列任何修飾符:static,virtual,sealed或extern
(6)如果聲明中包含private修飾符,則該聲明不包含下列任何修飾符:virtual,override或abstract
(7)如果聲明包含sealed修飾符,則該聲明還包含override修飾符
(8)如果聲明中包含partial修飾符,則該聲明不包含下列任一修飾符:new,public,protected,internal,private,static,virtual,sealed,override,abstract,extern
返回值類型是一個(gè)類型名,它指定了返回的信息是什么類型。這可以是任何類型,如果要返回值,則在方法體運(yùn)行后必須由return語(yǔ)句返回一個(gè)和“返回值類型”相同類型的值,如果要寫一個(gè)不返回值的方法,那么必須用關(guān)鍵字void來取代返回類型。如果聲明包含partial修飾符,則返回類型必須為void。
一個(gè)方法的名稱必須不同于在一個(gè)類中聲明的所有其他非方法的名稱。此外,必須不同于在同一類中聲明的所有其他方法的簽名。在寫參數(shù)列表時(shí),所有形參和類型形參都不能同名。
下面編寫一個(gè)簡(jiǎn)單的返回兩個(gè)整型數(shù)的和的方法:
public int add(int a, int b)
{
return a+b;
}
下面就具體介紹C#語(yǔ)言中的一些重要的基礎(chǔ)的方法:
一、靜態(tài)方法和實(shí)例方法
靜態(tài)方法是一個(gè)特殊的成員方法,不屬于類的某一個(gè)具體的實(shí)例或?qū)ο?,而屬于類本身。靜態(tài)方法不對(duì)特定實(shí)例進(jìn)行操作,只能訪問類中的靜態(tài)成員。訪問靜態(tài)方法只能使用類名,而不需要?jiǎng)?chuàng)建對(duì)象,也不能使用對(duì)象名類引用,聲明靜態(tài)方法修飾符中必須有static關(guān)鍵字。
實(shí)例方法可以使用類的任何成員。調(diào)用實(shí)例方法時(shí),必須使用類的實(shí)例或?qū)ο髞硪?。?shí)例方法對(duì)類的某個(gè)給定的實(shí)例進(jìn)行操作,在實(shí)例方法類中可以使用this來訪問實(shí)例。調(diào)用實(shí)例方法時(shí),必須先創(chuàng)建一個(gè)對(duì)象。
簡(jiǎn)單的說,靜態(tài)方法只能訪問靜態(tài)成員,實(shí)例方法可以訪問靜態(tài)和實(shí)例成員。之所以不允許靜態(tài)方法訪問實(shí)例成員變量,是因?yàn)閷?shí)例成員變量是屬于某個(gè)對(duì)象的,而靜態(tài)方法在執(zhí)行時(shí),并不一定存在對(duì)象。同樣,因?yàn)閷?shí)例方法可以訪問實(shí)例成員變量,如果允許靜態(tài)方法調(diào)用實(shí)例方法,將間接地允許靜態(tài)方法使用實(shí)例成員變量,這是錯(cuò)誤的?;谕瑯拥牡览?,靜態(tài)方法中不能使用關(guān)鍵字this。
例一、編程使用靜態(tài)方法和實(shí)例方法
<span style="font-size:18px;">using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace Text
{
class A
{
int exaVar;//創(chuàng)建的一個(gè)為實(shí)例成員變量
static int stVar;//創(chuàng)建的一個(gè)靜態(tài)成員變量
void tM()//實(shí)例方法
{
exaVar = 1;//等價(jià)于this.exVar=1
stVar = 1;//等價(jià)于A.stVar=1
}
static void sM()//靜態(tài)方法
{
//exaVar = 1;//錯(cuò)誤,靜態(tài)方法不可以調(diào)用實(shí)例成員變量
stVar = 1;//等價(jià)于A.stVar=1
}
static void Main(string[] args)
{
A text = new A();//創(chuàng)建類A的對(duì)象為text
text.exaVar = 1;//對(duì)象text訪問實(shí)例成員變量
A.stVar = 1;//只能使用類訪問靜態(tài)成員變量
//text.stVar = 1;//不能使用對(duì)象text訪問靜態(tài)成員變量
text.tM();//使用對(duì)象text訪問實(shí)例成員方法
//text.sM();//不能使用對(duì)象text訪問靜態(tài)成員方法
A.sM();//使用類訪問靜態(tài)成員方法
Console.WriteLine(text.exaVar + A.stVar);
Console.ReadLine();
}
}
}</span>
輸出的結(jié)果為:2
二、虛方法和非虛方法
若一個(gè)實(shí)例方法的聲明中含有virtual修飾符,則稱該方法為虛方法。若其中沒有virtual修飾符,則稱該方法為非虛方法。
非虛方法的實(shí)現(xiàn)是一成不變的,無論該方法是在聲明它的類的實(shí)例上調(diào)用還是在派生類的實(shí)例上調(diào)用,實(shí)現(xiàn)均相同。與此相反,虛方法的實(shí)現(xiàn)可以由派生類取代。取代所繼承的虛方法的實(shí)現(xiàn)的過程稱為重寫該方法。在虛方法調(diào)用中,該調(diào)用所涉及的那個(gè)實(shí)例運(yùn)行時(shí)類型確定了要被調(diào)用的究竟是該方法的哪一種實(shí)現(xiàn)。在非虛方法調(diào)用中,相關(guān)的實(shí)例的編譯時(shí)類型是決定性因素。
例二、使用虛方法和非虛方法在派生類中調(diào)用
<span style="font-size:18px;">using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace Text
{
public class A
{
public virtual void ab()//定義的類A的虛方法 </span>
[csharp] view plaincopyprint?
<span style="font-size:18px;"> {
Console.WriteLine("這是虛方法");
}
public void ac()//定義的類A的非虛方法
{
Console.WriteLine("這是非虛方法");
}
}
public class B:A//類B私有繼承類A
{
public override void ab()//重寫繼承的ab方法
</span> <span style="font-size:18px;"> {
Console.WriteLine("這是新的方法");
}
public new void ac()//創(chuàng)建一個(gè)新的方法覆蓋原來的ac方法
{
Console.WriteLine("這是另一個(gè)新的方法");
}
}
class Program
{
static void Main(string[] args)
{
B b = new B();//創(chuàng)建類B的對(duì)象b
A a = b;//將對(duì)象b賦值給類A的對(duì)象a
a.ab();//調(diào)用原ab虛方法
b.ab();//調(diào)用ab方法
a.ac();//調(diào)用原ac非虛方法
b.ac();//調(diào)用ac方法
Console.ReadLine();
}
}
}</span>
輸出的結(jié)果為:
從輸出的結(jié)果中可以看出虛方法的實(shí)現(xiàn)是由派生類取代并且由它的方法實(shí)現(xiàn),而非虛方法的實(shí)現(xiàn)是定義的類和派生類的各自由它們的方法實(shí)現(xiàn)。
三、虛方法和重寫方法
重寫方法用相同的簽名重寫所繼承的虛方法。虛方法聲明用于引入新方法,而重寫方法聲明則用于使現(xiàn)有的繼承虛方法專用化。用override聲明所重寫的那個(gè)方法稱為已重寫了的基方法。
重寫聲明和已重寫了的基方法具有相同的聲明可訪問性。換句話說,重寫聲明不能更改所對(duì)應(yīng)的 虛方法的可訪問性。但是,如果已重寫的基方法是protected,并且聲明它的程序集不是包含重寫方法的程序集,則重寫方法聲明的可訪問性必須是protected。
重寫override一般用于接口的實(shí)現(xiàn)和繼承類的方法改寫時(shí)應(yīng)注意:
(1)覆蓋的方法的標(biāo)志要和被覆蓋的方法的標(biāo)志完全匹配,才能達(dá)到覆蓋的效果
(2)覆蓋的方法的返回值必須和被覆蓋的方法的返回值一致
(3)覆蓋的方法所拋出的異常必須和被覆蓋的方法所拋出的異常一致,或者是其子類
(4)被覆蓋的方法不能為private,否則在其子類中只是新定義了一個(gè)方法,并沒有對(duì)其進(jìn)行覆蓋
例三、創(chuàng)建一個(gè)虛方法并重寫這個(gè)虛方法,通過調(diào)用兩個(gè)方法比較結(jié)果
<span style="font-size:18px;">using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace Text
{
class A
{
public virtual void a()//創(chuàng)建的虛方法
{
Console.WriteLine("這是虛方法");
}
}
class B : A
{
public override void a()
{
Console.WriteLine("這是重寫后的方法");
</span> }
}
<span style="font-size:18px;">class Program
{
static void Main(string[] args)
{
B b1 = new B();//創(chuàng)建類B的對(duì)象b1
b1.a();//調(diào)用重寫后的a方法
A a1 = new A();//創(chuàng)建類A的對(duì)象a1
a1.a();//調(diào)用虛方法a
A a2 = b1;//將類B的對(duì)象b1賦值給類A的對(duì)象a2
a2.a();//調(diào)用虛方法a
Console.ReadLine();
}
}
}
</span>
輸出的結(jié)果為:這是重寫后的方法
這是虛方法
這是重寫后的方法
四、外部方法(這個(gè)方法很新奇,聯(lián)想到很多)
當(dāng)方法聲明包含extern修飾符時(shí),稱該方法為外部方法。外部方法是在外部實(shí)現(xiàn)的,編程語(yǔ)言通常是使用C#以外的語(yǔ)言。外部方法不可以是泛型。
extern修飾符通常與DllImport屬性一起使用,從而使外部方法可以由DLL(動(dòng)態(tài)鏈接庫(kù))實(shí)現(xiàn)。執(zhí)行環(huán)境可以支持其他用來提供外部方法實(shí)現(xiàn)的機(jī)制。當(dāng)外部方法包含DllImport屬性時(shí),該方法聲明必須同時(shí)包含一個(gè)static修飾符。
在使用DLLImport屬性時(shí),一定要引入System.Runtime.InteropServices命名空間,此命名空間是提供各種各樣支持COM interop及平臺(tái)調(diào)用服務(wù)的成員。
例四、通過外部方法和Dlllmport屬性調(diào)用“User32.dll”實(shí)例自定義信息提示框的功能
<span style="font-size:18px;">using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Runtime.InteropServices;//必須引入的命名空間
namespace Text
{
class Program
{
[DllImport("User32.dll")]//調(diào)用User32.dll
public static extern int MessageBox(int H, string m, string c, int type);//定義的外部方法
static int Main(string[] args)
{
Console.Write("請(qǐng)輸入信息:");
string str = Console.ReadLine();//接受輸入的信息
return MessageBox(0,str,"我的信息提示框",0);//以信息提示框輸出
}
}
}</span>
輸出的結(jié)果為:
五、分部方法
若一個(gè)方法聲明中含有partial修飾符,則稱該方法為分部方法。只能講分部方法聲明為分部類型的成員,而且要遵守約束數(shù)目。分部方法有著嚴(yán)格的限制。分部方法必須在分部類或分部機(jī)構(gòu)內(nèi)聲明。它們必須是私有的,不能返回值,不能有輸出參數(shù)。因?yàn)槿魏吾槍?duì)沒有被實(shí)現(xiàn)的分部方法的調(diào)用都會(huì)簡(jiǎn)單地被忽略,所以說這些限制是非常有必要的。
分部方法不能作為一個(gè)明確分配的變量,僅被代碼生成器在處理輕量級(jí)事件的時(shí)候使用。假設(shè)用戶解析一個(gè)數(shù)據(jù)庫(kù)或者一個(gè)XML文件,然后生成了數(shù)據(jù)類,結(jié)果會(huì)發(fā)現(xiàn)有數(shù)十個(gè)類,幾百個(gè)屬性以及一大堆泛型和模板文件等。分部方法另外一個(gè)經(jīng)常被用到的地方是驗(yàn)證,或者讓屬性的setter去更新另一個(gè)屬性。所以如果用戶要使用產(chǎn)生的代碼,或者在運(yùn)行時(shí)有幾百個(gè)事件和千個(gè)方法調(diào)用的話(其實(shí)大多數(shù)情況下只用到了其中的一點(diǎn)點(diǎn)),就可以選擇分部方法。分部方法在聲明和使用時(shí)要比事件容易得多,如果沒有用到它們,它們就會(huì)消失。從分部方法必須是私有的限制中,
Alexander發(fā)現(xiàn)了該方法的不足之處,即如果用戶喜歡原數(shù)據(jù)驅(qū)動(dòng)的應(yīng)用,并且已經(jīng)被ASP.NET的數(shù)據(jù)綁定所困擾時(shí)(因?yàn)闆]有其他的方法可以附上原數(shù)據(jù)),那么,將來會(huì)出現(xiàn)丟失信息的可能。
例五、創(chuàng)建一個(gè)類的分部方法并且在另一個(gè)部分中引用
<span style="font-size:18px;">using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace Text
{
public partial class Program//定義的分部類
{
private int _setup;//定義的字段
public int setup//定義的方法
{
set
{
_setup=value;
}
get
{
return _setup;
}
}
partial void text(int t);//聲明分部方法
partial void text(int t)//實(shí)現(xiàn)聲明
{
t += _setup;
Console.Write(t);
}
}
partial class Program
{
static void Main(string[] args)
{
Program pg = new Program();//創(chuàng)建類對(duì)象
pg._setup = 100;//設(shè)置屬性
pg.text(50);//調(diào)用方法
Console.ReadLine();
}
}
}</span>
輸出的結(jié)果為:150
以上就是關(guān)于C#的方法五個(gè)例題分析,希望對(duì)大家的學(xué)習(xí)有所幫助。
上一篇:C#編程實(shí)現(xiàn)查看剪切板內(nèi)容的方法
欄 目:C#教程
下一篇:C#比較二個(gè)數(shù)組并找出相同或不同元素的方法
本文標(biāo)題:輕松學(xué)習(xí)C#的方法
本文地址:http://www.jygsgssxh.com/a1/C_jiaocheng/6804.html
您可能感興趣的文章
- 01-10C#通過反射獲取當(dāng)前工程中所有窗體并打開的方法
- 01-10關(guān)于ASP網(wǎng)頁(yè)無法打開的解決方案
- 01-10WinForm限制窗體不能移到屏幕外的方法
- 01-10WinForm繪制圓角的方法
- 01-10C#停止線程的方法
- 01-10WinForm實(shí)現(xiàn)仿視頻播放器左下角滾動(dòng)新聞效果的方法
- 01-10C#通過重寫Panel改變邊框顏色與寬度的方法
- 01-10C#實(shí)現(xiàn)清空回收站的方法
- 01-10C#實(shí)現(xiàn)讀取注冊(cè)表監(jiān)控當(dāng)前操作系統(tǒng)已安裝軟件變化的方法
- 01-10C#實(shí)現(xiàn)多線程下載文件的方法


閱讀排行
- 1C語(yǔ)言 while語(yǔ)句的用法詳解
- 2java 實(shí)現(xiàn)簡(jiǎn)單圣誕樹的示例代碼(圣誕
- 3利用C語(yǔ)言實(shí)現(xiàn)“百馬百擔(dān)”問題方法
- 4C語(yǔ)言中計(jì)算正弦的相關(guān)函數(shù)總結(jié)
- 5c語(yǔ)言計(jì)算三角形面積代碼
- 6什么是 WSH(腳本宿主)的詳細(xì)解釋
- 7C++ 中隨機(jī)函數(shù)random函數(shù)的使用方法
- 8正則表達(dá)式匹配各種特殊字符
- 9C語(yǔ)言十進(jìn)制轉(zhuǎn)二進(jìn)制代碼實(shí)例
- 10C語(yǔ)言查找數(shù)組里數(shù)字重復(fù)次數(shù)的方法
本欄相關(guān)
- 01-10C#通過反射獲取當(dāng)前工程中所有窗體并
- 01-10關(guān)于ASP網(wǎng)頁(yè)無法打開的解決方案
- 01-10WinForm限制窗體不能移到屏幕外的方法
- 01-10WinForm繪制圓角的方法
- 01-10C#實(shí)現(xiàn)txt定位指定行完整實(shí)例
- 01-10WinForm實(shí)現(xiàn)仿視頻播放器左下角滾動(dòng)新
- 01-10C#停止線程的方法
- 01-10C#實(shí)現(xiàn)清空回收站的方法
- 01-10C#通過重寫Panel改變邊框顏色與寬度的
- 01-10C#實(shí)現(xiàn)讀取注冊(cè)表監(jiān)控當(dāng)前操作系統(tǒng)已
隨機(jī)閱讀
- 08-05DEDE織夢(mèng)data目錄下的sessions文件夾有什
- 01-10C#中split用法實(shí)例總結(jié)
- 08-05織夢(mèng)dedecms什么時(shí)候用欄目交叉功能?
- 08-05dedecms(織夢(mèng))副欄目數(shù)量限制代碼修改
- 04-02jquery與jsp,用jquery
- 01-11Mac OSX 打開原生自帶讀寫NTFS功能(圖文
- 01-10SublimeText編譯C開發(fā)環(huán)境設(shè)置
- 01-11ajax實(shí)現(xiàn)頁(yè)面的局部加載
- 01-10使用C語(yǔ)言求解撲克牌的順子及n個(gè)骰子
- 01-10delphi制作wav文件的方法


