C# 面向?qū)ο笮〗馕?/h3>
|
admin
2024年1月30日 16:7 本文熱度 654 |
下來(lái)我們開(kāi)始了解C#的面向?qū)ο蠓矫嬷R(shí),首先來(lái)認(rèn)識(shí)一下面向?qū)ο蟆?br style=";padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;visibility: visible"/>
面向?qū)ο?/strong>:
面向?qū)ο蟪绦蛟O(shè)計(jì)(Object Oriented Programming,OOP)是一種計(jì)算機(jī)編程架構(gòu)。OOP的一條基本原則是計(jì)算機(jī)程序由單個(gè)能夠起到子程序作用的單元或?qū)ο蠼M合而成。OOP達(dá)到了軟件工程的三個(gè)主要目標(biāo):重用性、靈活性和擴(kuò)展性。OOP=對(duì)象+類(lèi)+繼承+多態(tài)+消息,其中核心概念是類(lèi)和對(duì)象。
--- 百度百科
通過(guò)百度百科來(lái)看,發(fā)現(xiàn)這說(shuō)的是個(gè)神馬玩意兒,還是給一個(gè)切實(shí)生活的例子來(lái)看,以洗衣服為例,設(shè)定兩個(gè)對(duì)象,一個(gè)是洗衣機(jī),一個(gè)是人,人去完成洗衣服這個(gè)動(dòng)作,對(duì)于洗衣機(jī)有以下方法:洗衣服方法,脫水方法,烘干方法。對(duì)于人有以下方法:加衣服方法,加洗衣粉方法,按啟動(dòng)按鈕方法。
然后開(kāi)始執(zhí)行這個(gè)流程:人加衣服--人加洗衣服--人按啟動(dòng)按鈕--洗衣機(jī)洗衣服--洗衣機(jī)脫水--洗衣機(jī)烘干,通過(guò)一個(gè)個(gè)方法來(lái)完成洗衣服這個(gè)流程,簡(jiǎn)單來(lái)說(shuō)就是某個(gè)對(duì)象執(zhí)行某個(gè)動(dòng)作完成某件事,而不是直接一步步執(zhí)行方法,那是面向過(guò)程。
面向?qū)ο笥腥筇匦裕悍庋b,繼承,多態(tài),在文章中會(huì)體現(xiàn)出來(lái)。
對(duì)于面向?qū)ο蟮母怕视辛舜致缘牧私?,接下?lái)先來(lái)了解如何檢測(cè)異常
異常處理:
異常就是程序中有語(yǔ)法錯(cuò)誤或者用戶(hù)輸入錯(cuò)誤等等,這會(huì)導(dǎo)致程序無(wú)法運(yùn)行,首先系統(tǒng)有它自己的異常處理方法,例如下面我定義了一個(gè)變量stu,類(lèi)型為string,但我賦給它一個(gè)int類(lèi)型數(shù)據(jù),系統(tǒng)直接報(bào)錯(cuò),說(shuō)無(wú)法給stu一個(gè)int類(lèi)型數(shù)據(jù)。
當(dāng)我們想完成一個(gè)兩個(gè)數(shù)加法運(yùn)算,讓用戶(hù)輸入數(shù)據(jù),來(lái)執(zhí)行加法,首先我們知道C#輸入只能是字符串類(lèi)型,要利用Convert來(lái)將string類(lèi)型轉(zhuǎn)為值類(lèi)型來(lái),而在輸入時(shí),如果用戶(hù)輸入錯(cuò)誤,輸入的不是數(shù)字,那程序就直接結(jié)束并報(bào)錯(cuò),如下所示:
而我們可以利用異常處理語(yǔ)句來(lái)讓程序遇到錯(cuò)誤時(shí)對(duì)錯(cuò)誤進(jìn)行解決,來(lái)完成下一步動(dòng)作,異常處理語(yǔ)句有以下三個(gè)關(guān)鍵詞:try,catch,finally
try:一個(gè) try 塊標(biāo)識(shí)了一個(gè)將被激活的特定的異常的代碼塊。后跟一個(gè)或多個(gè) catch 塊。(就是可能出現(xiàn)異常的代碼)
catch:程序通過(guò)異常處理程序捕獲異常。(就是要捕獲哪方面異常)
finally:執(zhí)行給定的語(yǔ)句,不管異常是否被拋出都會(huì)執(zhí)行。
try { // 可能會(huì)異常的語(yǔ)句 } catch(ExceptionName e) { // 處理方法 } finally { // 執(zhí)行語(yǔ)句 }
關(guān)于有哪些異常我們來(lái)看菜鳥(niǎo)教程:異常類(lèi)主要來(lái)自System.Exception類(lèi),所以Exception就包含所有可能的異常。
下面我們就利用異常處理來(lái)完成對(duì)加法運(yùn)算異常的檢測(cè),讓程序在遇到異常時(shí)不是直接結(jié)束程序,而是解決異常,繼續(xù)執(zhí)行程序。
Console.WriteLine("請(qǐng)輸入兩個(gè)數(shù)字,空格隔開(kāi)");
string[] array = new string[2];
int a1 = 0;
int a2 = 0;
while (true)
{
try
{
array = Console.ReadLine().Split(" ");
a1 = Convert.ToInt32(array[0]);
a2 = Convert.ToInt32(array[1]);
break;
/*
* try會(huì)一句一句檢查是否出現(xiàn)異常
* 當(dāng)檢測(cè)到a1有異常它就不會(huì)執(zhí)行a2,直接執(zhí)行catch
* 當(dāng)兩個(gè)都沒(méi)有異常就直接跳出循環(huán)執(zhí)行后面的語(yǔ)句
*/
}
catch (Exception e)
{
Console.WriteLine("要輸入兩個(gè)數(shù)字哦,請(qǐng)重新輸入!");
}
}
Console.WriteLine(a1 + " * " + a2 + " = " + (a1 + a2));
如果有finally語(yǔ)句就是以下效果:
finally { Console.WriteLine("管你有沒(méi)有異常,我就要輸出"); }
可以發(fā)現(xiàn)當(dāng)有異常時(shí),系統(tǒng)除了會(huì)輸出處于catch和finally中的語(yǔ)句外,不會(huì)執(zhí)行其他的語(yǔ)句,當(dāng)沒(méi)有異常時(shí)才會(huì)接下去執(zhí)行。
了解完異常處理,接下來(lái)開(kāi)始面向?qū)ο蟮挠嘘P(guān)內(nèi)容,首先是C#中的類(lèi)。
類(lèi)(Class:
當(dāng)你定義一個(gè)類(lèi)時(shí),你定義了一個(gè)數(shù)據(jù)類(lèi)型的藍(lán)圖。這實(shí)際上并沒(méi)有定義任何的數(shù)據(jù),但它定義了類(lèi)的名稱(chēng)意味著什么,也就是說(shuō),類(lèi)的對(duì)象由什么組成及在這個(gè)對(duì)象上可執(zhí)行什么操作。對(duì)象是類(lèi)的實(shí)例。構(gòu)成類(lèi)的方法和變量稱(chēng)為類(lèi)的成員。 --- 菜鳥(niǎo)教程
類(lèi)的定義:
關(guān)鍵字class,后面接類(lèi)的名稱(chēng),花括號(hào)中為類(lèi)的主體。
如何創(chuàng)建一個(gè)類(lèi):
其實(shí)我們創(chuàng)建一個(gè)程序時(shí),就創(chuàng)建了一個(gè)類(lèi),如圖所示,這是一個(gè)剛創(chuàng)建的程序文件,它就自動(dòng)生成一個(gè)名為Program的類(lèi),這個(gè)名字和文件名是一樣的。
接下來(lái)演示如何創(chuàng)建一個(gè)類(lèi),我們創(chuàng)建一個(gè)名為Car的類(lèi)。
這樣我們創(chuàng)建好了一個(gè)名為Car的類(lèi),這些using都是會(huì)自動(dòng)生成的,然后我們可以給類(lèi)中添加成員。成員要有訪(fǎng)問(wèn)表示符,默認(rèn)為private(私有的),此時(shí)無(wú)法直接在其他類(lèi)中使用,設(shè)為public(公共的)就可以隨意使用了。
public string brand; // 牌子 public int speed; // 速度 private int maxSpeed; // 最大速度 public string weight; // 重量
如何使用類(lèi)中的成員:首先要new一個(gè)對(duì)象來(lái)使用這個(gè)類(lèi)。如下所示:
Car car1 = new Car(); car1.brand = "瑪莎拉蒂"; car1.speed = 270; car1.weight = "1.5T";
這樣就可以使用類(lèi)中定義的成員了,可以看到里面缺少了maxSpeed這個(gè)成員,因?yàn)樗脑L(fǎng)問(wèn)符為private,所以不能直接使用,要在類(lèi)中去添加方法。如下所示:
public void SetMaxSpeed(int temp) // 得到數(shù)據(jù) { maxSpeed = temp; } public int GetMaxSpeed() // 輸出數(shù)據(jù) { return maxSpeed; }
這樣就可以使用maxSpeed了,我還在類(lèi)中寫(xiě)了一個(gè)輸出方法,方便我們輸出相關(guān)信息。
類(lèi)的使用就可以體現(xiàn)出封裝,將我們的一些方法寫(xiě)在一個(gè)程序中,在通過(guò)主程序去調(diào)用這個(gè)類(lèi)中的方法,從而讓主程序顯的更加簡(jiǎn)潔明了。
構(gòu)造函數(shù):
構(gòu)造函數(shù)是類(lèi)中一個(gè)特殊的成員函數(shù),構(gòu)造函數(shù)的定義沒(méi)有返回類(lèi)型。定義構(gòu)造函數(shù)后,每在主程序中創(chuàng)建一個(gè)新的對(duì)象就會(huì)使用這個(gè)構(gòu)造函數(shù)。如下所示:
public Car() { Console.WriteLine("我是構(gòu)造函數(shù)"); }
默認(rèn)的構(gòu)造函數(shù)是沒(méi)有參數(shù)的,如果加上參數(shù)就可以為你的成員進(jìn)行初始化,如下所示:
public Car(int speedA) { speed = speedA; Console.WriteLine("對(duì)象創(chuàng)建成功,速度默認(rèn)為 = {0}", speedA); }
屬性:
屬性主要用于外部來(lái)訪(fǎng)問(wèn)和使用內(nèi)部的私有成員變量,例如我們上面要使用maxSpeed變量,要定義兩個(gè)方法才能使用這個(gè)變量,而使用屬性就可以只定義一個(gè)方法就可以使用了。如下所示:
public int MaxSpeed { get { return maxSpeed; } set // 這里默認(rèn)值是value { maxSpeed = value; } }
car1.MaxSpeed = 325; Console.WriteLine(car1.MaxSpeed);
今日小題:編寫(xiě)一個(gè)程序,倒序輸出一個(gè)數(shù),不輸出這個(gè)數(shù)開(kāi)始的0和結(jié)束的0,例如00520520 ---> 25025
我們直接從輸入的最后一個(gè)數(shù)開(kāi)始,利用求余運(yùn)算--"%",來(lái)得到最后一個(gè)數(shù),給他一個(gè)判斷看他是否為0,如果不為0就讓他輸出后續(xù)數(shù)字,設(shè)定一個(gè)標(biāo)志位開(kāi)始為false,判斷最后一個(gè)數(shù)是否為0,為0則不管,不為0則標(biāo)志位為true,循環(huán)條件為p != 0,循環(huán)的最后讓p = p / 10;就使這個(gè)數(shù)不斷減少一位,少到為0時(shí)就表示前面的數(shù)都是0了,就不用管了。
int p = Convert.ToInt32(Console.ReadLine());
bool temp = false;
while(p != 0)
{
int n = p % 10;
if(temp == false)
{
if(n != 0)
{
Console.Write(n);
temp = true;
}
}
else
{
Console.Write(n);
}
p = p / 10;
}
由于輸出是一個(gè)數(shù)一個(gè)數(shù)輸出,所以輸出語(yǔ)句用Write避免換行。