C#面向?qū)ο笳n件_第1頁(yè)
C#面向?qū)ο笳n件_第2頁(yè)
C#面向?qū)ο笳n件_第3頁(yè)
C#面向?qū)ο笳n件_第4頁(yè)
C#面向?qū)ο笳n件_第5頁(yè)
已閱讀5頁(yè),還剩133頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

面向?qū)ο?Microsoft.NET介紹微軟的.NET歷史2000年微軟公司向全球宣布其革命性的軟件和服務(wù)平臺(tái):Microsoft.NET

2001年發(fā)布了.NETFramework1.0版經(jīng)歷5個(gè)版本1.0、1.1、2.0、3.0、3.5Microsoft.NET介紹支持多種終端平臺(tái)信息互聯(lián)互通Web服務(wù):Passport,MSN在線游戲Live服務(wù)任何時(shí)候、任何地方、利用任何工具都可以獲得網(wǎng)絡(luò)上的信息,并享受網(wǎng)絡(luò)通信所帶來(lái)的快樂(lè).NET戰(zhàn)略對(duì)微軟的影響2003~2004年間,全球100強(qiáng)和《財(cái)富》100強(qiáng)加起來(lái)的共166個(gè)公司微軟發(fā)布.NET前后的營(yíng)業(yè)額Microsoft.NET介紹為什么需要.NET框架不同平臺(tái)(PDA、PC、游戲機(jī))的程序如何在.NET環(huán)境下運(yùn)行?使用C#的程序可以調(diào)用VB.NET開(kāi)發(fā)的程序嗎?.NETFramework.NET框架概述.NET框架.NET戰(zhàn)略的基礎(chǔ)框架便捷的開(kāi)發(fā)平臺(tái)強(qiáng)大的類庫(kù).NET程序的運(yùn)行環(huán)境.NET框架公共語(yǔ)言運(yùn)行時(shí)框架類庫(kù)兩個(gè)主要組件.NET框架的魅力面向?qū)ο缶幊烫岣哕浖蓮?fù)用、可擴(kuò)展、易維護(hù)性、靈活性強(qiáng)大的動(dòng)態(tài)Web支持Web服務(wù)Passport服務(wù)MSN,Hotmail都通過(guò)PassportWeb服務(wù)驗(yàn)證世界級(jí)開(kāi)發(fā)工具VisualStudio2005框架體系結(jié)構(gòu).NET框架的核心操作系統(tǒng)公共語(yǔ)言運(yùn)行庫(kù)(CLR)VC++.NETC#VB.NETVJ#….NETFramework類庫(kù)(FCL)框架組件基本框架類Web窗體WebServiceWinFormsADO.NET和XML類.NETFramework.NETFramework類庫(kù)ASP.NETCLSCLRCTS無(wú)論是WinForms和ASP.NET都可以使用ADO.NET與基類庫(kù)公共語(yǔ)言運(yùn)行時(shí)CLR稱為公共語(yǔ)言運(yùn)行時(shí)C#VB.NET代碼被執(zhí)行MSILCLR通用語(yǔ)法,計(jì)算機(jī)不用了解CLR執(zhí)行ILC#編譯器VB.NET編譯器公共語(yǔ)言運(yùn)行時(shí)CTS和CLS是CLR的子集CTS(通用類型系統(tǒng))定義了在IL中的的數(shù)據(jù)類型VB.NET的Integer和C#的int型都被編譯成Int32CLS(公共語(yǔ)言規(guī)范)CLR支持的語(yǔ)言功能的子集,包括幾種面向?qū)ο蟮木幊陶Z(yǔ)言的通用功能框架類庫(kù)提供對(duì)系統(tǒng)功能的訪問(wèn)建立.NET應(yīng)用程序,組件和控件的基礎(chǔ)龐大的類庫(kù)數(shù)量170多個(gè)命名空間,上千個(gè)類功能齊全,方便使用對(duì)文件的基本操作對(duì)網(wǎng)絡(luò)的訪問(wèn)安全控制對(duì)圖形的操作…….NET平臺(tái)全新的語(yǔ)言配合革命性平臺(tái),誕生了C#C#之父AndersHejlsberg曾工作于Borland公司Pascal和Delphi之父1996年赴微軟,當(dāng)時(shí)年薪300W$.NET平臺(tái)全新的語(yǔ)言C#是一種簡(jiǎn)單、現(xiàn)代、面向?qū)ο缶幊陶Z(yǔ)言目前經(jīng)歷了三個(gè)版本1.0、2.0、3.0我們學(xué)習(xí)的是2.0、3.0Anders自定義命名空間如果在一個(gè)項(xiàng)目中,編寫(xiě)了兩個(gè)功能不同但名字相同的類,就會(huì)發(fā)生沖突,如何解決沖突?重新命名類名namespaceMySchool{publicclassStudent{}}namespaceYourSchool{publicclassStudent{}}不同的命名空間使用命名空間嵌套命名空間回顧:命名空間用于組織相關(guān)類和其他類型與Java的package相似嵌套命名空間namespaceCity{namespaceMySchool{namespaceClass{classStudent{//此處編寫(xiě)代碼}}}}引用命名空間:usingCity.MySchool.Class;使用別名如果命名空間的名字非常的長(zhǎng)給這個(gè)嵌套的命名空間指定一個(gè)簡(jiǎn)潔的名字City.MySchool.Classusinguser=City.MySchool.Class;//…namespaceMySchool{classStudent{

user.Studentstu=newuser.Student();}}別名使用別名對(duì)象對(duì)象是人們要進(jìn)行研究的任何事物

顏色:灰色

排量:3.0剎車產(chǎn)地:德國(guó)行駛名字:保時(shí)捷行為狀態(tài)

顏色:紅色

排量:4.0剎車產(chǎn)地:意大利行駛名字:法拉利行為狀態(tài)回顧Java的對(duì)象,描述汽車的特征和行為有各自不同的狀態(tài)類和對(duì)象小汽車

顏色:灰色

排量:3.0

剎車產(chǎn)地:德國(guó)行駛名字:保時(shí)捷行為狀態(tài)類的實(shí)例化,是由類具體化對(duì)象類產(chǎn)地車體顏色行駛剎車…歸納一組相似對(duì)象的共性對(duì)象屬性方法類描述一組相似對(duì)象的共性類和對(duì)象的應(yīng)用類和對(duì)象的簡(jiǎn)單應(yīng)用//…Carferrari=NewCar();ferrari.Run();//…類對(duì)象實(shí)例化對(duì)象調(diào)用方法publicclassStudent{intage=26;

//姓名

privatestringname;publicstringName{get{returnname;}set{name=value;}}//問(wèn)候publicvoidSayHi(){ …}}類和類的成員類的成員字段屬性方法…

類名自定義一個(gè)類classDBHelper{//數(shù)據(jù)庫(kù)連接字符串privatestaticstringconnString="

…";//數(shù)據(jù)庫(kù)連接Connection對(duì)象publicstaticSqlConnectionconnection=newSqlConnection(connString);}訪問(wèn)修飾符私有公有公有成員和私有成員classstudent{

privatestringname;//姓名

publicintage;//年齡

publicstringidNumber

;//身份證號(hào)}…staticvoidMain(string[]args){studentmyStudent=newstudent();

myS="張三";

myStudent.age=20;

}私有成員公有成員實(shí)例化一個(gè)對(duì)象可以訪問(wèn)無(wú)法訪問(wèn)編譯錯(cuò)誤

數(shù)據(jù)安全staticvoidMain(string[]args){studentmyStudent=newstudent();myStudent.age=-2;myStudent.idNumber="123456";

}非法數(shù)據(jù)身份證號(hào)不能被修改無(wú)法獲得數(shù)據(jù)無(wú)法正常賦值有時(shí)候?qū)㈩愔械淖侄喂_(kāi)是不安全的如果設(shè)為私有成員能否對(duì)這些字段進(jìn)行規(guī)則約束或者只讀呢?在類中使用屬性privateintage;//年齡publicintAge{get{returnage;}set{if(value>0&&value<100){age=value;}else{age=18;}}}myStudent.Age=-20;//打印…myStudent.Age=40;//打印…沒(méi)有訪問(wèn)age公開(kāi)Age錄入非法數(shù)據(jù)打印私有變量age不公開(kāi)age通過(guò)公有Age訪問(wèn)和約束私有字段age什么是屬性C#不直接訪問(wèn)類的數(shù)據(jù)通過(guò)訪問(wèn)器訪問(wèn)(get,set)classStudent{

//姓名

privatestringname;publicstringName{get{returnname;}set{name=value;}}}返回nameget用于獲取相應(yīng)字段的值set用于設(shè)置字段的值只有g(shù)et時(shí):只讀屬性只有set時(shí):只寫(xiě)屬性get和set都存在:讀寫(xiě)屬性屬性的類型和字段類型必須一致給name賦值屬性的特點(diǎn)privateintage;//年齡publicintAge{get{returnage;}set{if(value>0&&value<100){age=value;}else{age=18;}}}控制私有字段的可訪問(wèn)性保護(hù)內(nèi)部數(shù)據(jù)的安全建議:類內(nèi)部敏感字段使用屬性來(lái)控制訪問(wèn)類型可以是各種數(shù)據(jù)類型,如:對(duì)象、數(shù)組等等封裝字段將類中的字段、屬性綁到一起封裝字段封裝是面向?qū)ο蟮娜筇匦灾槐苊夥欠〝?shù)據(jù)的訪問(wèn)保證數(shù)據(jù)的完整性演示:在VS中使用重構(gòu)——封裝字段在類中使用方法方法是類或?qū)ο蟮男袨閷?duì)象需要做某些事情,在類中添加方法回顧方法的定義訪問(wèn)修飾符返回類型方法名(參數(shù)列表){//方法的主體…}通過(guò)return返回值如果返回類型是void,方法是否需要返回值?方法的參數(shù)參數(shù)傳遞使用值傳遞,參數(shù)值的更改不能保留使用ref可以將參數(shù)值的更改保留out類型參數(shù)privatestaticvoidAddScore(ref

intscore,outintscoreResult){

if(score>50&&score<60){Console.WriteLine("你的成績(jī)?cè)?0-60之間,可以加分。");score=60;}scoreResult=score;}都可以輸出結(jié)果ref側(cè)重修改,out側(cè)重輸出不能寫(xiě)成AddScore(outintscoreResult)方法的使用實(shí)現(xiàn)兩個(gè)整型的加法classAdd{

publicintSum(intpara1,intpara2){returnpara1+para2;}}AddmyAdd=newAdd();intsum=myAdd.Sum(2,3);使用方法實(shí)例化一個(gè)對(duì)象返回結(jié)果調(diào)用方法靜態(tài)方法classmySwap{publicstaticvoidSintnum1,refintnum2){inttemp;temp=num1;num1=num2;num2=temp;}}classProgram{staticvoidMain(string[]args){intnum1=5,num2=10;myS(refnum1,refnum2);}}回顧一下,Swap方法在另一類中如何調(diào)用?靜態(tài)方法使用類名調(diào)用靜態(tài)方法靜態(tài)方法和實(shí)例方法使用static修飾的方法稱為靜態(tài)方法使用實(shí)例對(duì)象調(diào)用的方法叫做實(shí)例方法靜態(tài)方法實(shí)例方法static關(guān)鍵字不需要static關(guān)鍵字使用類名調(diào)用使用實(shí)例對(duì)象調(diào)用可以訪問(wèn)靜態(tài)成員可以直接訪問(wèn)靜態(tài)成員不可以直接訪問(wèn)實(shí)例成員可以直接訪問(wèn)實(shí)例成員不能直接調(diào)用實(shí)例方法可以直接訪問(wèn)實(shí)例方法、靜態(tài)方法調(diào)用前初始化實(shí)例化對(duì)象時(shí)初始化為什么要重載

publicintSum(intpara1,intpara2){returnpara1+para2;}整型參數(shù),返回值整型如果想讓兩個(gè)string型、兩個(gè)double型相加,怎么做?編寫(xiě)兩個(gè)不同名字的方法,這樣我們?cè)谶M(jìn)行調(diào)用時(shí)要先判斷是什么類型,能否不判斷直接就能相加呢?方法的重載同一個(gè)類中添加幾個(gè)名字相同,參數(shù)與返回值不同的方法

publicstringSum(stringpara1,stringpara2){returnpara1+para2;}

publicdoubleSum(doublepara1,doublepara2){returnpara1+para2;}調(diào)用時(shí)只要傳遞參數(shù)即可,無(wú)需判斷類型classAdd{

publicstringSum(stringpara1,stringpara2){…}publicintSum(intpara1,intpara2){…}}重載的方式基于不同類型參數(shù)的重載classAdd{

publicintSum(intpara1,intpara2){…}publicintSum(intpara1,intpara2,intpara3){…}}相同類型不同參數(shù)個(gè)數(shù)的重載不允許重載方法僅僅是返回值不同Studentzhang=newStudent();zhang.Name="張靚靚";zhang.Age=20;zhang.Hobby="唱歌歌";一種特別的方法班級(jí)來(lái)了新學(xué)員添加學(xué)員對(duì)象學(xué)員類實(shí)例化對(duì)象、設(shè)置屬性初始屬性若太多,設(shè)置麻煩能否在實(shí)例化時(shí)設(shè)置屬性?publicStudent(stringname,intage,stringhobby){this.Name=name;this.Age=age;this.Hobby=hobby;}Studentzhang=newStudent("張靚靚",20,"唱歌歌");一次設(shè)置完成類中加入這個(gè)方法添加的方法叫做構(gòu)造函數(shù)構(gòu)造函數(shù)是類中的一種特殊的方法構(gòu)造函數(shù)名與類名相同,不返回任何值可初始化成員變量classStudent{

publicStudent(stringname,intage,stringhobby){this.Name=name;this.Age=age;this.Hobby=hobby;}}初始化成員變量this關(guān)鍵字引用類的當(dāng)前實(shí)例將參數(shù)的值,分別賦給當(dāng)前實(shí)例的屬性使用構(gòu)造函數(shù)new

關(guān)鍵字可以實(shí)例化一個(gè)新的對(duì)象指定對(duì)某個(gè)帶參數(shù)的構(gòu)造函數(shù)Studentzhang=newStudent("張靚靚",20,"唱歌歌");每次創(chuàng)建類的實(shí)例都會(huì)調(diào)用此方法實(shí)例化對(duì)象調(diào)用構(gòu)造函數(shù)使用new關(guān)鍵字Studentscofield=newStudent();Studentzhang=newStudent("張靚靚",20,"唱歌歌");實(shí)例化一個(gè)對(duì)象實(shí)例化一個(gè)新對(duì)象publicStudent(){}publicStudent(stringname,intage,stringhobby){=name;this.age=age;this.hobby=hobby;}構(gòu)造函數(shù)的重載構(gòu)造函數(shù)也可以重載Studentscofield=newStudent();Studentzhang=newStudent("張靚靚",20,"唱歌歌");方法名相同,參數(shù)不同privateinta;publicintA{get{returna;}set{a=value;}}你喜歡讀哪段代碼?合格的程序要符合編碼規(guī)則直觀易于理解、有意義的單詞方便維護(hù)有利于調(diào)試編碼規(guī)則的必要性如name,age,studentprivateintname;publicintName{get{returnname;}set{name=value;}}無(wú)法理解是什么為什么使用常量publicclassCompute{doublepi=3.14;//計(jì)算圓的周長(zhǎng)publicdoublePerimeter(doubleradius){return2*pi*radius;}//計(jì)算圓的面積publicdoubleArea(doubleradius){returnpi*radius*radius;}}這個(gè)類中,會(huì)反復(fù)使用pi如果pi在類中被修改了,計(jì)算結(jié)果錯(cuò)誤如何避免pi在類中被修改?常量常量在使用過(guò)程中值不會(huì)發(fā)生變化常量程序中反復(fù)使用const類型常量名=常量值程序中不會(huì)被改變staticvoidMain(string[]args){

constintPI=3.14;

PI=3.20;}強(qiáng)制賦值會(huì)發(fā)生錯(cuò)誤常量名通常使用大寫(xiě)隨意賦值的危險(xiǎn)conststringGENDER_M="男";conststringGENDER_F="女";…//性別privatestringgender;publicstringGender{get{returngender;}set{gender=value;}}用常量給屬性賦值:student.Gender=GENDER_M;也可以這樣給屬性賦值:student.Gender="School";為Student類添加性別的屬性,用常量賦值有違常理,非法數(shù)據(jù)什么是枚舉用一種新的類型定義enumpublicenumGenders{Male,Female}//性別privateGendersgender;publicGendersGender{get{returngender;}set{gender=value;}}這樣給屬性賦值:student.Gender=Genders.Male;如果這樣屬性賦值:student.Gender="School";類型不同不能賦值性別屬性的類型Genders是一個(gè)枚舉類型代碼錯(cuò)誤枚舉定義枚舉是一組描述性的名稱枚舉定義一組有限的值,不能包含方法對(duì)可能的值進(jìn)行約束枚舉允許描述性名稱表示整數(shù)值訪問(wèn)修飾符enum枚舉名{值1,值2…}publicenumSchool{T1,T2,T3}publicenumSchool{T1=1,T2=2,T3=3}//……Console.WriteLine(“T2的整數(shù)值是{0}.",(int)(School.T2));取得枚舉表示的整數(shù)值枚舉與其它類型的轉(zhuǎn)換枚舉轉(zhuǎn)換為字符串字符串轉(zhuǎn)換為枚舉publicenumSchool{T1,T2,T3}//……Console.WriteLine(“T2的值是{0}.",School.T2.ToString());(School)(Enum.Parse(typeof(School),“T2");需要轉(zhuǎn)換的字符串枚舉的特點(diǎn)汽車類有一個(gè)成員是車身顏色staticvoidMain(string[]args){string[]color=newstring[]{"red","black","write"};Console.WriteLine("我要選擇的顏色是:{0}",color[0]);}使用時(shí),必須了解數(shù)組的構(gòu)成枚舉可以用描述性的名稱表示值,使用時(shí)無(wú)需了解它的構(gòu)成privateenumcolor{red,write,black}staticvoidMain(string[]args){Console.WriteLine("我要選擇的顏色是:{0}",color.red);}枚舉枚舉的典型應(yīng)用DialogResultchoice;choice=MessageBox.Show("確定要退出嗎?","退出系統(tǒng)",MessageBoxButtons.OKCancel,MessageBoxIcon.Information);if(choice==DialogResult.OK)Application.Exit();DialogResult是個(gè)枚舉,指示對(duì)話框的返回值這樣我們就不會(huì)判斷一些非法的值,導(dǎo)致系統(tǒng)異常為什么需要結(jié)構(gòu)有很多預(yù)定義顏色正常人眼可分辨的顏色種類可達(dá)幾十萬(wàn)種以上Color提供使用RGB值返回顏色的方法FromArgb()

System.Drawing.Color有很多顏色值,它是一個(gè)枚舉嗎?System.Drawing.Color是一個(gè)結(jié)構(gòu)

結(jié)構(gòu)定義結(jié)構(gòu)中有屬性,也可以有方法publicstructStructStudent{publicstringName;publicintAge;publicstringHobby;publicintPopularity;publicvoidSayHi(){//….}}訪問(wèn)修飾符struct結(jié)構(gòu)名{定義結(jié)構(gòu)成員}構(gòu)成和類相似定義成員變量不能賦初值成員方法//…StructStudentmyStu;myStu.Age=20;myStu.Gender=Genders.Female;myStu.Hobby="唱歌歌";myStu.Name="張靚靚";myStu.Popularity=100;myStu.SayHi();//…結(jié)構(gòu)的使用2-1定義結(jié)構(gòu)可以不用new為結(jié)構(gòu)成員賦值調(diào)用結(jié)構(gòu)的方法運(yùn)行結(jié)果和第二章的SayHi相同//…

StructStudentmyStu=newStructStudent("張靚靚",Genders.Female,20,"唱歌歌",100);myStu.SayHi();//…結(jié)構(gòu)的使用2-2structStructStudent{//…publicStructStudent(stringname,Gendersgender,intage,stringhobby,intpopularity){this.Name=name;this.Gender=gender;//…}}可以有構(gòu)造函數(shù)只能聲明有參數(shù)的構(gòu)造函數(shù)構(gòu)造函數(shù)傳參理解結(jié)構(gòu)與類的區(qū)別都可以實(shí)現(xiàn)接口都可以包含字段、方法相同點(diǎn)結(jié)構(gòu)中給字段賦值是錯(cuò)誤的類中可以給字段賦值創(chuàng)建對(duì)象可以不用new創(chuàng)建對(duì)象必須使用new可以添加構(gòu)造函數(shù),但它們必須帶參數(shù)可以添加無(wú)參的構(gòu)造函數(shù)不可以有默認(rèn)構(gòu)造函數(shù)可以有默認(rèn)構(gòu)造函數(shù)不能被繼承可以被繼承值類型引用類型不同點(diǎn)結(jié)構(gòu)類

值類型與引用類型使用類版Student和結(jié)構(gòu)版Student實(shí)現(xiàn)下面操作staticvoidMain(string[]args){//使用值類型StructStudentstudent1=newStructStudent();StructStudentstudent2=newStructStudent();student1.Age=18;student2=student1;student2.Age=20;Console.WriteLine("student1={0},student2={1}",student1.Age,student2.Age);}staticvoidMain(string[]args){//使用引用類型Studentstudent1=newStudent();Studentstudent2=newStudent();student1.Age=18;student2=student1;student2.Age=20;Console.WriteLine("student1={0},student2={1}",student1.Age,student2.Age);}值類型值類型直接存儲(chǔ)值A(chǔ)ge=18student1student1studnet2student1.Age=18Age=18Age=18student2=student1student1.Age

student1studnet2Age=18Age=20student2.Age=20引用類型student1student1.Age=18Age=18引用類型存儲(chǔ)對(duì)值的引用student1studnet2student2=student1student1.Age

兩個(gè)變量都發(fā)生變化Age=20student1studnet2student2.Age=20拆箱和裝箱值類型和引用類型之間的轉(zhuǎn)換值類型引用類型裝箱拆箱staticvoidMain(string[]args){inti=123;objecto=i;//裝箱

i=456;//改變i的內(nèi)容

Console.WriteLine("值類型的值為{0}",i);Console.WriteLine("引用類型的值為{0}",o);}staticvoidMain(string[]args){inti=123;objecto=i;//裝箱

intj=(int)o;}//拆箱與值類型的變量類型要一致值方式的參數(shù)的傳遞值傳遞方式傳遞值類型:結(jié)構(gòu):StructStudent不會(huì)被修改

//傳遞值類型參數(shù)StructStudentscofield=newStructStudent("Scofield",Genders.Male,28,"越獄獄");scofield.SayHi();Vote(scofield);scofield.SayHi();privatevoidVote(StructStudentstu){stu.Popularity++;}人氣屬性加1的方法人氣加1兩次的人氣值相同,參數(shù)未發(fā)生變化值傳遞值方式的參數(shù)的傳遞值傳遞引用類型時(shí):類:Student參數(shù)在程序中被修改

//傳遞引用類型參數(shù)Studentscofield=newStudent("Scofield",Genders.Male,28,"越獄獄");scofield.SayHi();Vote(scofield);scofield.SayHi();引用類型:類人氣屬性加1的方法人氣加1引用方式傳遞傳遞值類型傳遞引用類型ref方式傳遞完全修改privatevoidVote(refStructStudentstu){stu.Popularity++;}ref引用方式傳遞參數(shù)值類型和引用類型細(xì)分?jǐn)?shù)組:int[],string[]數(shù)組接口:interface接口自定義類:class字符串:string基類:System.Object類引用類型結(jié)構(gòu):struct結(jié)構(gòu)類型枚舉:enum枚舉類型布爾型:bool字符型:char浮點(diǎn)型:float長(zhǎng)整型:long整型:int基本數(shù)據(jù)類型值類型描述類別傳遞數(shù)組數(shù)組是值類型還是引用類型//…int[]odd={1,3,5};PrintArray(odd);ChangeToEven(odd);PrintArray(odd);//…privatevoidChangeToEven(int[]arr){for(inti=0;i<arr.Length;i++){arr[i]=i*2;}}值方式傳遞arr[0]=1arr[1]=3arr[2]=5arr[0]=0arr[1]=2arr[2]=4參數(shù)被修改數(shù)組是引用類型什么是索引器能否通過(guò)姓名訪問(wèn)學(xué)員?publicStudentthis[intindex]{get{returnstudents[index];}}Students類中添加

//采用索引器的方式MyClassmyClass=newMyClass("T01");myClass.Students[2].SayHi();myClass.Students["周杰杰"].SayHi();…可以按照索引訪問(wèn)重載的索引器根據(jù)姓名查找學(xué)員索引器的特點(diǎn)DataRow["列名"]DataReader["列名"]數(shù)組屬性只能根據(jù)下標(biāo)(索引)來(lái)訪問(wèn)索引器可以被重載可以使用更靈活的方式訪問(wèn),定義訪問(wèn)方式我們以前用過(guò)的索引器類圖VS2005的類圖類圖描述類的結(jié)構(gòu)查看一個(gè)類的類圖“鎖”表示私有不同字段有不同的圖標(biāo)通用的類圖-age:int-name:string+Name:string類名Student+SayHi():void“-”表示私有“+”表示公有“:”后是變量類型“:”后是返回類型讀懂類圖是OOP的基本要求代碼冗余對(duì)比這兩個(gè)類:Student和Teacher加入校長(zhǎng)、班主任的類,都需要加入這幾個(gè)屬性,代碼冗余年齡、性別、姓名是重復(fù)的如何共用重復(fù)代碼?提取冗余代碼將公共的成員放到一個(gè)類中保留自己特有的成員保留自己特有的成員提取后的應(yīng)用classStudent:Person{publicStudent(){}//愛(ài)好privatestringhobby;publicstringHobby{get{returnhobby;}set{hobby=value;}}…}1、提取后的Student類只有學(xué)員特有的屬性2、創(chuàng)建一個(gè)學(xué)員對(duì)象Studentzhang=newStudent();zhang.Name="張靚靚";zhang.Age=20;zhang.Gender=Genders.Female;zhang.Hobby="唱歌歌";公共屬性可以訪問(wèn)繼承卡車和巴士都是汽車生活中的繼承汽車剎車行駛共有行為:輪子發(fā)動(dòng)機(jī)共有特征:卸貨拉貨各自行為:載重貨艙各自特征:??空緢?bào)站各自行為:載客量客艙各自特征:他們共有的特征來(lái)自汽車有什么共同特征呢?卡車公共汽車父類和子類在C#中,一個(gè)類可以繼承另一個(gè)類Person子類繼承父類,父類派生子類學(xué)員和老師類都繼承PersonStudentTeacher子類父類Student類繼承Person類Person類派生Student類子類又叫派生類父類又叫基類classStudent:Person繼承概述繼承需要符合的關(guān)系:is-aStudentisaPerson子類繼承父類的成員子類可以有自己的成員繼承父類的成員自己特有的成員繼承是面向?qū)ο蟮囊粋€(gè)重要特性繼承在類圖中的表示繼承的實(shí)際應(yīng)用1班上所有的人都做自我介紹SayHi()學(xué)員大家好,我是某某同學(xué),今年多少歲,喜歡什么老師大家好,我是某某老師,今年多少歲,工作幾年了子類中訪問(wèn)繼承父類的公共屬性子類特有屬性繼承的實(shí)際應(yīng)用2公共屬性加入父類有獨(dú)自的SayHi()繼承的實(shí)際應(yīng)用3Teacher和Student類都繼承PersonpublicclassStudent:PersonpublicclassTeacher:PersonpublicStudent(stringname,Gendersgender,intage,stringhobby,intpopularity){this.Name=name;this.Age=age;this.Gender=gender;//學(xué)生類擴(kuò)展的屬性

this.Hobby=hobby;this.Popularity=popularity;}構(gòu)造函數(shù)設(shè)置公共屬性與獨(dú)有屬性繼承自父類的公共屬性子類擴(kuò)展的屬性繼承的實(shí)際應(yīng)用4都有不同的SayHi()方法publicvoidSayHi(){//學(xué)生的SayHi}publicvoidSayHi(){//老師的SayHi}創(chuàng)建對(duì)象調(diào)用SayHi()Studentzhang=newStudent(…);Teacherjacky=newTeacher(…);zhang.SayHi();jacky.SayHi();學(xué)生調(diào)用自己的SayHi()老師調(diào)用自己的SayHi()base關(guān)鍵字關(guān)鍵字base的作用調(diào)用父類的屬性和方法調(diào)用父類的構(gòu)造函數(shù)publicvoidSayHi(){stringmessage=string.Format("大家好,我是{0}同學(xué),今年{1}歲了,我喜歡{2}!",

base.Name,base.Age,this.hobby);MessageBox.Show(message);}調(diào)用父類的屬性publicStudent(stringname,Gendersgender,intage,stringhobby,intpopularity):base(name,age,gender){//學(xué)生類擴(kuò)展的屬性

this.Hobby=hobby;this.Popularity=popularity;}this.Name=name;this.Age=age;this.Gender=gender;調(diào)用父類的構(gòu)造函數(shù)protected訪問(wèn)修飾符protected訪問(wèn)修飾符允許子類訪問(wèn)protected訪問(wèn)修飾符不允許其他非子類訪問(wèn)不可以可以可以protected不可以不可以可以private可以可以可以public其他類子類類內(nèi)部

父類成員如果父類中的某個(gè)成員只允許其子類訪問(wèn)public修飾所有類都可以訪問(wèn)private修飾子類無(wú)法訪問(wèn)繼承的傳遞性汽車雙層單層小型卡車重型卡車同樣具有汽車的特征繼承的傳遞性卡車公共汽車還可以派生更多的類型繼承的傳遞性添加一個(gè)微型卡車類publicclassSmallTruck:Truck{protectedvoidsmallTruckRun(){Console.WriteLine("微型卡車在行駛!");}staticvoidMain(string[]args){SmallTrucksmalltruck=newSmallTruck();smalltruck.vehicleRun();

smalltruck.truckRun();smalltruck.smallTruckRun();}}publicclassTruck:Vehicle繼承關(guān)系父類的父類成員父類的成員傳遞性繼承單根性publicclassCharmingStudent:SportsMan,Musician編譯錯(cuò)誤C#中子類不能繼承多個(gè)父類CharmingStudent

運(yùn)動(dòng)員音樂(lè)家某類學(xué)員是否可以這樣描述?具有兩種人的特征隱式調(diào)用父類的構(gòu)造函數(shù)Person類中去掉了構(gòu)造函數(shù)publicPerson(){}“Person”方法沒(méi)有采用“0”個(gè)參數(shù)的重載classStudent:Person{publicStudent(){}publicStudent(stringname,Gendersgender,intage,stringhobby,intpopularity)}base()隱式的調(diào)用base()子類的構(gòu)造函數(shù)沒(méi)有使用base指明調(diào)用父類哪個(gè)構(gòu)造函數(shù)父類要提供無(wú)參的構(gòu)造函數(shù)顯示調(diào)用父類的構(gòu)造函數(shù)如果父類沒(méi)有無(wú)參的構(gòu)造函數(shù)子類構(gòu)造函數(shù)必須指明調(diào)用父類哪個(gè)構(gòu)造函數(shù)publicStudent():base("張靚靚",20,Genders.Female){}publicStudent(stringname,Gendersgender,intage,stringhobby,intpopularity):base(name,age,gender){}軟件開(kāi)發(fā)中的繼承模擬了現(xiàn)實(shí)世界的關(guān)系實(shí)現(xiàn)代碼重用結(jié)構(gòu)更清晰Student愛(ài)好…Person姓名年齡…子類更加關(guān)注與子類相關(guān)的行為和狀態(tài)共有屬性由父類負(fù)責(zé)窗口繼承布局發(fā)生調(diào)整,需要同時(shí)改變?nèi)齻€(gè)窗體,復(fù)雜度增加通過(guò)繼承,很好很有效地保持了界面的一致性和共同行為子類窗口按鈕要實(shí)現(xiàn)不同的功能訪問(wèn)修飾符應(yīng)該設(shè)置為protected回顧繼承Person類老師

學(xué)員SayHi()SayHi()繼承List<Person>SayHi()遍歷List,循環(huán)SayHi()內(nèi)容不同將所有人都存入集合調(diào)用兩種類型的SayHi()方法擴(kuò)展的麻煩for(inti=0;i<person.Count;i++){if(person[i]isStudent){((Student)person[i]).StuSayHi();}elseif(person[i]isTeacher){((Teacher)person[i]).TeachSayHi();}}進(jìn)行判斷對(duì)象類型調(diào)用相應(yīng)類的SayHi()添加多個(gè)不同的子類,SayHi()都不同,增加代碼復(fù)雜度如何解決?添加對(duì)象后遍歷泛型集合巧妙的做法abstractclassPerson{publicabstractvoidSayHi();}for(inti=0;i<person.Count;i++){person[i].SayHi();}這種方式實(shí)現(xiàn)了面向?qū)ο蟮亩鄳B(tài)

修改Person類添加一個(gè)未實(shí)現(xiàn)的方法用關(guān)鍵字修飾去除子類類型判斷生活中的多態(tài)Cut….!!!聽(tīng)到這個(gè)聲音他們會(huì)做什么?剪斷頭發(fā)切開(kāi)皮膚停止表演不同對(duì)象對(duì)于同一個(gè)方法(Cut)調(diào)用的不同行為理發(fā)師外科醫(yī)生演員什么是多態(tài)指不同對(duì)象收到相同消息時(shí),會(huì)產(chǎn)生不同行為Student和Teacher類SayHi()的內(nèi)容不同同一個(gè)類在不同的場(chǎng)合下表現(xiàn)出不同的行為特征PersonStudentTeacherPerson類,在這兩種場(chǎng)合的行為不同抽象類和抽象方法abstractclassPerson{publicabstractvoidSayHi();}抽象方法一個(gè)沒(méi)有實(shí)現(xiàn)的方法有抽象方法的類必然是抽象類抽象類用來(lái)列舉一個(gè)類所需要的行為抽象類不明確提供具體實(shí)現(xiàn)方法抽象類必須由其子類實(shí)現(xiàn)它的抽象方法(除非子類也具有抽象性)常見(jiàn)錯(cuò)誤抽象類不能被實(shí)例化抽象類不能是密封或靜態(tài)的Personperson=newPerson();編譯錯(cuò)誤抽象類不能用sealed和static修飾實(shí)現(xiàn)抽象方法使用override實(shí)現(xiàn)抽象方法publicoverridevoidSayHi(){//…具體實(shí)現(xiàn)內(nèi)容}重寫(xiě)實(shí)現(xiàn)抽象方法Dog:AnimalCat:Animal抽象類的應(yīng)用場(chǎng)合abstract

Animal

抽象類和抽象方法實(shí)現(xiàn)多態(tài)性父類提供一系列規(guī)定,約束子類的行為父類可以提供一些共性的行為貓咪喵喵叫狗狗汪汪叫abstract叫()是動(dòng)物就要會(huì)叫里氏替換原則//…Studentstu1=newStudent();Studentstu2=newStudent();List<Person>person=newList<Person>();person.Add(stu1);person.Add(stu2);//…子類對(duì)象可以替換父類里氏替換原則(LSP)子類的對(duì)象能夠替換其父類父類對(duì)象不能夠替換子類父類的方法都要在子類中實(shí)現(xiàn)或者重寫(xiě)is與as操作符is檢查對(duì)象是否與指定類型兼容if(person[i]isStudent)判斷person集合的元素是否是Student對(duì)象as用于在兼容的引用類型之間執(zhí)行轉(zhuǎn)換for(inti=0;i<Students.Count;i++){Studentstu=Students[i]asStudent;Console.WriteLine(stu.Name);}轉(zhuǎn)換失敗返回值為空一種類型轉(zhuǎn)換方式為什么需要虛方法大家好,我是某某先生(女士),今年多少歲抽象方法不能在父類實(shí)現(xiàn)學(xué)員大家好,我是某某同學(xué),今年多少歲,喜歡什么老師大家好,我是某某老師,今年多少歲,工作幾年了提供一個(gè)通用的方式繼續(xù)完善MySchool學(xué)員和老師也可以使用通用方式默認(rèn)SayHi()能否寫(xiě)在Person類中?各子類可以重寫(xiě)不同行為SayHi()可以使用虛方法實(shí)現(xiàn)使用虛方法//Person類中默認(rèn)實(shí)現(xiàn)通用的SayHi()publicvirtualvoidSayHi(){//…省略具體實(shí)現(xiàn)}虛方法用默認(rèn)的SayHi()的對(duì)象,子類中不需要重寫(xiě)SayHi()用自己的SayHi()子類中要重寫(xiě)SayHi()同樣使用override重寫(xiě)只能在抽象類中除了密封類都可以寫(xiě)必須被子類override可以被子類override不允許有方法體要有方法體,哪怕是一個(gè)分號(hào)用abstract修飾用virtual修飾抽象方法虛方法虛方法與抽象方法面向?qū)ο蟮娜筇匦噪[藏內(nèi)部實(shí)現(xiàn),穩(wěn)定外部接口封裝繼承子類繼承父類成員,實(shí)現(xiàn)代碼復(fù)用多態(tài)不同子類對(duì)同一個(gè)消息作出不同的反映生活中的接口生活中的接口USB接口使用USB接口必須符合USB規(guī)范接口是一套規(guī)范,遵守這個(gè)規(guī)范就可以實(shí)現(xiàn)功能.NET接口同樣是一種規(guī)范和標(biāo)準(zhǔn)可以約束類的行為定義一個(gè)接口不指定具體的實(shí)現(xiàn).NET接口一個(gè)類實(shí)現(xiàn)IComparable,在類中強(qiáng)制實(shí)現(xiàn)CompareTo方法publicinterfaceISampleInterface{stringName{get;set;}}publicinterfaceISampleInterface{voidShowName();}interface屬性方法…接口中可以包含的內(nèi)容接口的使用接口的名稱通常以“I”開(kāi)頭IComparable,IList使用方法與繼承一個(gè)類相似如果類繼承了父類classStudent:IComparableclassStudent:Person,IComparable繼承了一個(gè)類,實(shí)現(xiàn)了一個(gè)接口類圖中的表示接口的特點(diǎn)接口可以說(shuō)是對(duì)繼承單根性的擴(kuò)展C#中一個(gè)類能否繼承多個(gè)父類?不能classStudent:Person,IComparable接口提供了一組規(guī)范,一個(gè)標(biāo)準(zhǔn)接口屏蔽了實(shí)現(xiàn)的細(xì)節(jié)Sort方法排序時(shí),無(wú)需關(guān)心IComparable如何實(shí)現(xiàn)方便多人協(xié)同開(kāi)發(fā)可以一組人實(shí)現(xiàn)IComparable,一組人去做排序功能自定義接口如老師和學(xué)員都可以收作業(yè),那么收作業(yè)的方法應(yīng)該放在哪個(gè)類?A:Teacher類B:Student類C:兩個(gè)都放D:Person類E:重新定義造成代碼冗余如果增加一個(gè)工程師類,他不會(huì)收作業(yè)如果繼承這個(gè)類,Person類怎么辦?調(diào)用收作業(yè)的方法不需要改變自定義一個(gè)接口來(lái)實(shí)現(xiàn)IHomeworkCollector自定義接口publicinterfaceIHomeworkCollector{voidCollectHomework();}publicclassStudent:Person,IHomeworkCollectorpublicvoidCollectHomework(){MessageBox.Show("報(bào)告老師!作業(yè)收集完畢!");}1、定義一個(gè)收作業(yè)的接口2、在有收作業(yè)功能的類實(shí)現(xiàn)該接口3、不同的類收作業(yè)方式不同使用自定義接口1、接口作為參數(shù)使用privatevoidDoCollectHomework(IHomeworkCollectorcollector){

collector.CollectHomework();}無(wú)論誰(shuí)收作業(yè)這里都不需要做任何改變2、接口作為返回值使用DoCollectHomework(scofield);privateIHomeworkCollectorCreateHomeworkCollector(stringtype){

switch(type){case"student":collector=newStudent("Scofield",Genders.Male,28,"越獄獄");break;//…}returncollector;}返回一個(gè)實(shí)現(xiàn)該接口的對(duì)象collector.CollectHomework();作為返回值和參數(shù)的意義接口作為參數(shù)傳遞了實(shí)現(xiàn)接口的對(duì)象接口作為返回值返回一個(gè)實(shí)現(xiàn)了接口的對(duì)象接口和抽象類的對(duì)比派生類必須實(shí)現(xiàn)未實(shí)現(xiàn)的方法

包含未實(shí)現(xiàn)的方法

不能實(shí)例化相似點(diǎn)直接實(shí)現(xiàn)需要override實(shí)現(xiàn)抽象方法

實(shí)現(xiàn)接口的類必須實(shí)現(xiàn)所有成員非抽象派生類必須實(shí)現(xiàn)抽象方法

可以實(shí)現(xiàn)多個(gè)接口只能繼承一個(gè)類

用interface定義用abstract定義不同點(diǎn)接口抽象類

數(shù)組的局限string[]Students=newstring[3]{"張三","李四","王五"};如果每個(gè)班級(jí)的人數(shù)不固定班級(jí)中來(lái)了一個(gè)新的學(xué)員班級(jí)人員的數(shù)組調(diào)整大小困難增加元素困難能否動(dòng)態(tài)的維護(hù)一個(gè)集合?重新定義數(shù)組相同類型和名稱變量的集合ArrayList是一個(gè)可動(dòng)態(tài)維護(hù)長(zhǎng)度的集合可維護(hù)動(dòng)態(tài)長(zhǎng)度的集合新增元素可刪除元素可訪問(wèn)單個(gè)元素objectobjectobjectobject0123索引(下標(biāo))object40123ArrayList自動(dòng)調(diào)整索引通過(guò)索引訪問(wèn)ArrayList的初始化usingSystem.Collections;//…ArrayListStudents=newArrayList();ArrayListTeachers=newArrayList(5);可以指定長(zhǎng)度引入命名空間實(shí)例化一個(gè)對(duì)象常見(jiàn)錯(cuò)誤未引入命名空間定義時(shí)未實(shí)例化引入System.Collections命名空間實(shí)例化ArrayList對(duì)象ArrayList添加元素intAdd(Objectvalue)//添加一個(gè)對(duì)象到集合的末尾ArrayListstudents=newArrayList();Studentscofield=newStudent("Scofield",Genders.Male,28,"越獄獄");//…students.Add(scofield);創(chuàng)建學(xué)員對(duì)象添加學(xué)員連續(xù)添加三個(gè)學(xué)員對(duì)象并獲取集合元素的數(shù)目返回索引ArrayList.Count獲取元素?cái)?shù)目建立班級(jí)學(xué)員的集合訪問(wèn)ArrayList元素(類型)ArrayList[index]//按指定索引(下標(biāo))取得對(duì)象Studentstu1=(Student)students[0];stu1.SayHi();…按索引取值轉(zhuǎn)換為學(xué)員對(duì)象ArrayList第一個(gè)對(duì)象的索引是0需要類型轉(zhuǎn)換刪除ArrayList的元素ArrayList.Remove(對(duì)象名)//刪除指定對(duì)象名的對(duì)象ArrayList.RemoveAt(index)//刪除指定索引的對(duì)象ArrayList.Clear()//清除集合內(nèi)的所有元素students.RemoveAt(0);students.Remove(zhang);Studentleave=(Student)students[0];leave.SayHi();通過(guò)索引刪除對(duì)象通過(guò)指定對(duì)象刪除只剩一個(gè)對(duì)象剩余的元素會(huì)自動(dòng)調(diào)整索引取得刪除后的第一個(gè)對(duì)象ArrayList的遍歷//遍歷foreach(Objectstuoinstudents){StudentstuForeach=(Student)stuo;Console.WriteLine(stuForeach.Name);}通過(guò)對(duì)象遍歷打印對(duì)象的Name屬性Scofield張靚靚周杰杰可以使用和數(shù)組類似的方式for(inti=0;i<students.Count;i++){StudentstuFor=(Student)students[i];Console.WriteLine(stuFor.Name);}foreach方式輸出結(jié)果類型轉(zhuǎn)換常見(jiàn)錯(cuò)誤1//…students.Add(scofield);students.Add(zhang);students.Add(jay);students.RemoveAt(0);students.RemoveAt(1);students.RemoveAt(2);運(yùn)行這段代碼會(huì)發(fā)生錯(cuò)誤?索引會(huì)自動(dòng)調(diào)整刪除兩個(gè)元素后,不再有索引“2”常見(jiàn)錯(cuò)誤2Studentscofield=newStudent("Scofield",Genders.Male,28,"越獄獄");//…Studentstu2=newStudent("Scofield",Genders.Male,28,"越獄獄");//打印集合數(shù)目//…students.Remove(stu2);//打印集合數(shù)目//…如果Remove(stu2),能否刪除scofield對(duì)象?定義一個(gè)對(duì)象與前面的值相同兩次的結(jié)果都是3,沒(méi)有刪除,為什么?在多態(tài)章節(jié)中我們將試圖改變這一現(xiàn)象publicstructStudent{publicStudent(stringname,intage){Name=name;Age=age;}publicstringName;publicintAge;}Studentstu1=newStudent("張三",20);Studentstu2=newStudent("李四",20);Studentstu3=newStudent("王五",20);

ArrayListstudents=newArrayList();students.Add(stu1);students.Add(stu2);students.Add(stu3);常見(jiàn)錯(cuò)誤3staticvoidMain(string[]args){//…初始化代碼將對(duì)象加入ArrayList集合foreach(Studentstuinstudents){StudentmyStudent=stu;myStudent.Age=60;}foreach(Studentstuinstudents){Console.WriteLine(stu.Age);}}遍歷顯示年齡結(jié)果是多少?結(jié)構(gòu)是值類型定義一個(gè)學(xué)員結(jié)構(gòu)使用ArrayList存儲(chǔ)學(xué)員遍歷修改年齡ArrayList通過(guò)索引獲取對(duì)象為什么使用HashTable能否像索引器那樣通過(guò)關(guān)鍵字獲取該對(duì)象呢?動(dòng)態(tài)可維護(hù)長(zhǎng)度可通過(guò)關(guān)鍵字檢索C#提供一種集合HashTableStudents["周杰杰"].SayHi();Studentstu1=(Student)Students[0];第三章中的索引器通過(guò)關(guān)鍵字獲取對(duì)象什么是HashTableArrayList每個(gè)元素對(duì)應(yīng)一個(gè)索引HashTable通常稱為哈希表根據(jù)鍵(Key)可以查找到相應(yīng)的值(Value)objectobjectobjectobjectobject0123…ArrayList索引KeyValueKeyValueKeyValueKeyValueKeyValueHashTable值鍵鍵和值一一對(duì)應(yīng)使用哈希表students.Add(scofield.Name,scofield);添加元素KeyValue…Studentstu2=(Student)students["周杰杰"];stu2.SayHi();…通過(guò)key獲取元素students.Remove("周杰杰");…通過(guò)key刪除元

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論