黑馬五期net基礎(chǔ)加強(qiáng)_第1頁
黑馬五期net基礎(chǔ)加強(qiáng)_第2頁
黑馬五期net基礎(chǔ)加強(qiáng)_第3頁
黑馬五期net基礎(chǔ)加強(qiáng)_第4頁
黑馬五期net基礎(chǔ)加強(qiáng)_第5頁
已閱讀5頁,還剩92頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

北京傳智播客教育北京傳智播客教育.Net基礎(chǔ)加強(qiáng)講師:趙曉虎北京傳智播客教育課前準(zhǔn)備給大家一個(gè)建議:有問題多問,同樣的時(shí)間,問的多就學(xué)的多。本課程目的:讓大家都具有最基本的編程水平,保證能正常進(jìn)行后續(xù)的課程?;A(chǔ)不好的同學(xué)抓緊復(fù)習(xí)(一次很好的機(jī)會(huì))基礎(chǔ)好的同學(xué)(復(fù)習(xí),看參考書籍,繼續(xù)提升,有問題可以問)《C#圖解教程》、《CSharpLanguageSpecification.doc》【C:\ProgramFiles\MicrosoftVisualStudio10.0\VC#\Specifications\2052\CSharpLanguageSpecification.doc】在vs的安裝目錄下??梢砸徽乱徽碌目?,也可以講到哪里看到哪里。編程到底怎么學(xué)?那么多語言該學(xué)哪門?老楊的一個(gè)經(jīng)典比喻:選擇一種語言→泡妞。多做練習(xí),就像游泳。反復(fù)練習(xí),就像打鐵。反復(fù)捶打,去除雜質(zhì),保留精華。書要越看越薄。溫故而知新。做課堂筆記(聽課優(yōu)先,然后做筆記)北京傳智播客教育課前說明課程內(nèi)容中大部分是所有同學(xué)都需要掌握的,但是對(duì)于部分技術(shù)水平比較好的同學(xué)為了讓其就業(yè)會(huì)有更高的薪資,所以課程中有一部分內(nèi)容是相對(duì)比較難的,對(duì)于這部分內(nèi)容ppt上會(huì)加*,加*的內(nèi)容不要求所有同學(xué)都掌握。為了保證畢業(yè)后都能找到一份工作,所以建議大家應(yīng)該把必須掌握的知識(shí)都掌握了以后再考慮加*的內(nèi)容。北京傳智播客教育復(fù)習(xí)(參考:基礎(chǔ)知識(shí)復(fù)習(xí).doc)交換兩個(gè)變量的值。(如果會(huì)使用ref,則用方法做,傳遞2個(gè)int參數(shù)。)

intnum1=5;intnum2=6;通過程序交換讓num1=6,num2=5;用方法實(shí)現(xiàn)(注:考慮方法的參數(shù)、返回值是什么?):求兩個(gè)數(shù)的最大值(傳遞兩個(gè)int類型參數(shù))。擴(kuò)展:(求三個(gè)數(shù)最大值,params)求1-100之間所有奇數(shù)的和。找胖子,{200,120,90,180,110},找最胖的人.(求最大值,參數(shù)是int類型數(shù)組。)不能調(diào)用數(shù)組的Max()方法。c#時(shí)間格式轉(zhuǎn)換漢字大寫比如:“2011年6月4日”轉(zhuǎn)換成“二零一一年六月四日”。(參考提示:把字符串作為char數(shù)組來用,判斷如果是2→’二’,0→’零’,1→‘一’…)。暫時(shí)不考慮10日、13日、23日等問題。創(chuàng)建一個(gè)Person類,屬性:姓名、性別、年齡;方法:SayHi()。再創(chuàng)建一個(gè)Employee類繼承Person類,擴(kuò)展屬性Salary,重寫SayHi方法。新建控制臺(tái)應(yīng)用程序來完成以上問題。北京傳智播客教育再次強(qiáng)調(diào)代碼規(guī)范規(guī)則(法律,必須遵守否則報(bào)錯(cuò))語法規(guī)范(道德,大家都喜歡有道德的人。)注釋駱駝命名:第一個(gè)單詞首字母小寫,之后的單詞首字母大寫userName、userPassword、realName…(普通變量(局部變量)、字段)帕斯卡命名:第一個(gè)單詞首字母大寫,之后的單詞首字母大寫GetMax()、ChangeName()…(方法名、類名、屬性名)定義的變量或者方法名字要有意義。方法名:動(dòng)詞。Write()、Open()、Close()、Dispose()、GetUserId()、…(方法都是要做一件事情)變量名:按功能命名、按方法的返回值內(nèi)容命名(userName=GetUserName();)上課記筆記!北京傳智播客教育復(fù)習(xí)WinForm桌面程序,桌面應(yīng)用程序是相對(duì)于Web應(yīng)用程序而言的。桌面應(yīng)用程序:QQ、迅雷、Office…Web應(yīng)用程序:網(wǎng)上銀行系統(tǒng)、163郵箱系統(tǒng)、電子商務(wù)網(wǎng)站、網(wǎng)上預(yù)約掛號(hào)平臺(tái)…WinForm的控件TextBox、Timer、CheckBox、TreeView、GroupBox、Label、Button、RadioButton、CheckBoxList、RadioButtonList、Form、PictureBox、ComboBox、Panel、。。。。WinForm程序是事件驅(qū)動(dòng)的。案例:制作一個(gè)簡(jiǎn)易計(jì)算器,默認(rèn)為“請(qǐng)選擇”北京傳智播客教育.net程序基本編寫、執(zhí)行流程(c#)1>編寫c#代碼,保存為.cs文件。2>通過csc.exe程序來將.cs文件編譯為.net程序集(.exe或.dll)。此時(shí)的exe或dll并不是機(jī)器碼(cpu不可理解)?!?gt;csc/out:c:\a.exec:\program.cs】3>程序運(yùn)行時(shí)通過JIT編譯(JustInTime)即時(shí)編譯,將程序集編譯為cpu能理解的機(jī)器碼,這時(shí)cpu才能執(zhí)行。(這個(gè)編譯過程會(huì)與當(dāng)前機(jī)器有關(guān)(根據(jù)當(dāng)前機(jī)器的內(nèi)存、cpu等))。ngen.exe北京傳智播客教育面向?qū)ο螅∣O)什么是面向?qū)ο螅恳环N分析問題的方式(增強(qiáng)了程序的可擴(kuò)展性)。面向?qū)ο笕筇匦裕悍庋b、繼承、多態(tài)。什么是類?什么是對(duì)象?類和對(duì)象的區(qū)別?如何寫一個(gè)汽車類?類是模具,創(chuàng)建對(duì)象的模具,抽象的。類是一種數(shù)據(jù)類型,用戶自定義的數(shù)據(jù)類型類組成:字段、屬性、方法、構(gòu)造函數(shù)等對(duì)象是具體的,是類的具體實(shí)例。對(duì)象具有屬性(特征)和方法(行為)類中包含了數(shù)據(jù)(用字段表示)與行為(用方法(函數(shù)、功能)表示,方法為一塊具有名稱的代碼)案例:創(chuàng)建學(xué)生類,老師類,通過構(gòu)造函數(shù)初始化類內(nèi)部字段this,當(dāng)前對(duì)象案例:使用面向?qū)ο蠓绞街刈鲇?jì)算器v2.0。(寫一個(gè)Calculator類,里面有幾個(gè)計(jì)算方法。)實(shí)現(xiàn)WinForm版本與控制臺(tái)版本。練習(xí):猜拳游戲。先分析類和對(duì)象。實(shí)現(xiàn)WinForm版本與控制臺(tái)版本。北京傳智播客教育屬性、索引器屬性索引器北京傳智播客教育添加引用與導(dǎo)入命名空間的區(qū)別添加引用(前提)添加程序集導(dǎo)入命名空間namespace(ctrl+.或shift+alt+F10)為什么在另一個(gè)項(xiàng)目中建的類,添加引用后還是不能使用?(類的訪問修飾符默認(rèn):internal,改成public)“參數(shù)”與“返回值”參數(shù)的個(gè)數(shù)、類型與返回值沒有任何半毛錢關(guān)系??刂婆_(tái)應(yīng)用程序中不要新建Form再次說明this的使用,通過this訪問類的屬性。this.Fist北京傳智播客教育變量作用域變量作用域:離聲明該變量最近的那對(duì)包含聲明語句的大括號(hào)內(nèi)部。成員變量—直接屬于某個(gè)類,作用域在該類內(nèi)部。成員變量使用前如果不賦值,默認(rèn)會(huì)有一個(gè)初始值。string→null;int→0;bool→false局部變量—聲明該變量的塊語句或方法結(jié)束的封閉括號(hào)之前的作用域內(nèi)(使用之前必須得賦值。)思考:publicvoidM1(){intn=10;if(n>5){intn=100;}}//對(duì)嗎?北京傳智播客教育關(guān)于構(gòu)造函數(shù)補(bǔ)充publicclassC1{intx=100;//此時(shí)其實(shí)也是在構(gòu)造函數(shù)中為x賦值。}通過reflector查看生成源碼。北京傳智播客教育封裝提問:大家覺得什么是封裝?遙控器剛出來時(shí)候很神奇,點(diǎn)個(gè)按鈕就能換電視臺(tái)、切音量、關(guān)電視。而我們使用遙控器的人不需要知道他是怎么實(shí)現(xiàn)的(你只需要知道每個(gè)按鈕的功能即可)和遙控器類似,面向?qū)ο蟮姆庋b就是把事物的狀態(tài)和行為封裝在類中,使用類的人不需要知道類內(nèi)部是怎么實(shí)現(xiàn)的,只要調(diào)用其中的屬性和方法實(shí)現(xiàn)功能就行。就像你使用遙控,不需要知道他是怎么控制電視的,只要知道按鈕能換臺(tái)就行類和對(duì)象本身就是封裝的體現(xiàn)。1.屬性封裝了字段、2.方法的多個(gè)參數(shù)封裝成了一個(gè)對(duì)象、3.將一堆代碼封裝到了一個(gè)方法中、4.將一些功能封裝到了幾個(gè)類中、5.將一些具有相同功能的代碼封裝到了一個(gè)程序集中(dll、exe),并且對(duì)外提供統(tǒng)一的訪問接口。(屬性名、方法名等。)北京傳智播客教育繼承(是指類與類之間的關(guān)系。)車(Vehicle)

—卡車(Truck)輕型卡車重型卡車—轎車(Car)--小轎車面包車如何判斷一個(gè)繼承關(guān)系是否合理?子類isa父類。卡車和轎車都是車,都有輪子、發(fā)動(dòng)機(jī)。但是卡車又能拉貨,轎車能拉人BaseClass→基類、ParentClass→父類DerivedClass→派生類、ChildClass→子類為什么要繼承?繼承帶給我們的好處?代碼重用LSP里氏替換原則(通過代碼說明一下,聲明父類類型變量,指向子類類型對(duì)象,以及調(diào)用方法時(shí)的一些問題)、多態(tài)。(程序的可擴(kuò)展性、靈活性)方法重寫override。虛方法的原理:虛方法表。子類繼承父類的屬性和方法,使創(chuàng)建子類變得很簡(jiǎn)單,實(shí)現(xiàn)了代碼重用、以及多態(tài)。類的單根繼承性、傳遞性、繼承時(shí)構(gòu)造函數(shù)的問題。構(gòu)造函數(shù)不能被繼承。所有的類都直接或間接的繼承自object。查看IL代碼。北京傳智播客教育關(guān)于繼承的那些事兒案例:定義學(xué)生類(姓名、性別、年齡、成績(jī),Hello方法)、老師類(姓名、性別、年齡、工資、Hello方法)從中抽象出一個(gè)父類,通過構(gòu)造函數(shù)給子類字段賦值protected只能在子類內(nèi)部和當(dāng)前類內(nèi)部中使用可以在類內(nèi)部以及所有子類中(內(nèi)部)訪問。this:1.作為當(dāng)前類的對(duì)象,可以調(diào)用類中的成員。this.成員(調(diào)用成員,自己)2.調(diào)用本類的其他構(gòu)造函數(shù)。:this()(調(diào)用構(gòu)造函數(shù),自己)reflector查看base :1.調(diào)用父類中的成員(在子類重寫父類成員或者子類使用new關(guān)鍵字隱藏了父類成員時(shí),調(diào)用父類成員)base點(diǎn)不出子類獨(dú)有成員。2.調(diào)用父類中的構(gòu)造函數(shù)(調(diào)用構(gòu)造函數(shù),父類)當(dāng)調(diào)用從父類中繼承過來的成員的時(shí)候,如果子類沒有重寫則this.成員;與base.成員;沒有區(qū)別。如果子類重寫了父類成員,則this.成員;調(diào)用的是子類重寫以后的。base.成員;調(diào)用的依然是父類的成員。子類構(gòu)造函數(shù)必須指明調(diào)用父類哪個(gè)構(gòu)造函數(shù)北京傳智播客教育練習(xí)練習(xí):定義父親類Father(姓lastName,財(cái)產(chǎn)property,血型bloodType),兒子Son類(玩游戲PlayGame方法),女兒Daughter類(跳舞Dance方法),調(diào)用父類構(gòu)造函數(shù)(:base())給子類字段賦值練習(xí):定義汽車類Vehicle屬性(brand(品牌),color(顏色))方法run,子類卡車(Truck)屬性weight載重方法拉貨,轎車(Car)屬性passenger載客數(shù)量方法載客練習(xí):升級(jí)猜拳游戲(加入父類【繼承】)注意:當(dāng)this與base作為調(diào)用構(gòu)造函數(shù)的語法的時(shí)候,參數(shù)的傳遞可能會(huì)有的疑惑。:base(參數(shù),參數(shù))類中的成員如果不寫訪問修飾符默認(rèn)是private.北京傳智播客教育關(guān)于繼承中“私有成員”能否被繼承的問題我觀點(diǎn):私有成員不能被子類繼承。原因:1.雖然子類繼承父類后,在創(chuàng)建子類對(duì)象的時(shí)候,父類中的那些私有成員,也被分配了內(nèi)存(子類中也有)。2.但是,繼承只是面向?qū)ο笾械囊粋€(gè)概念,目的是為了子類使用(多態(tài)、代碼重用),私有成員即便繼承了,子類中也不能訪問,所以在面向?qū)ο笾?,繼承了但不能訪問,沒有意義。北京傳智播客教育訪問修飾符作用:指明程序的其他部分如何訪問該成員。共5種:private當(dāng)前類中可以訪問,類中成員的默認(rèn)訪問修飾符。protected當(dāng)前類及子類中可以訪問(在繼承中用。)internal當(dāng)前程序集內(nèi)部可以訪問protectedinternal當(dāng)前程序集或子類中(不同程序集也可以訪問)。public任何地方北京傳智播客教育訪問級(jí)別約束訪問級(jí)別約束子類的訪問級(jí)別不能比父類的高。(會(huì)暴露父類的成員)類中屬性或字段的訪問級(jí)別不能比所對(duì)應(yīng)的類型訪問級(jí)別高。方法的訪問級(jí)別不能比方法的參數(shù)和返回值的訪問級(jí)別高。用于解決“可訪問性不一致”的錯(cuò)誤。北京傳智播客教育實(shí)現(xiàn)多態(tài)的手段1-虛方法virtualPerson→Chinese→American→Korean,每個(gè)國家的人都有一個(gè)說出自己國籍的方法。當(dāng)有一個(gè)Person[]的時(shí)候,循環(huán)現(xiàn)實(shí)每個(gè)國家的人。虛方法可以給父類中的方法一個(gè)實(shí)現(xiàn),比如ToString()方法虛方法必須有實(shí)現(xiàn)部分,哪怕是空實(shí)現(xiàn)。案例:?jiǎn)T工類、部門經(jīng)理類(部門經(jīng)理也是員工,所以要繼承自員工類。員工有上班打卡的方法。用類來模擬。練習(xí):把Person類中的SayHello改為虛方法讓其默認(rèn)為學(xué)生的,增加老師、司機(jī)類。虛方法和抽象方法的區(qū)別。見備注北京傳智播客教育方法重寫注意事項(xiàng)子類重寫父類方法時(shí),必須與父類保持一致的方法簽名與返回值類型。即:方法名、返回值類型、參數(shù)列表都必須保持一致。[訪問修飾符也得一致]“方法簽名”:一般是指方法的【名稱】+方法的【參數(shù)列表】,不包含方法返回值類型北京傳智播客教育靜態(tài)成員-通過類名訪問、實(shí)例成員-通過對(duì)象訪問先通過窗體之間共享值,以及工具類,說明為什么要用static。C#中聲明的所有的變量都需要在類型中,不能在類型以外直接聲明全局變量,與c或c++不同。沒有全局變量的概念。靜態(tài)成員是與“類”相關(guān),而非與“實(shí)例”相關(guān)。普通類中的靜態(tài)成員static只能通過類名訪問靜態(tài)方法中只能訪問靜態(tài)成員,或通過對(duì)象訪問實(shí)例成員。多個(gè)對(duì)象共享同一個(gè)靜態(tài)成員。靜態(tài)類(一般都用作工具類,里面都是一些工具函數(shù))Math、Console、Convert等都是靜態(tài)類。靜態(tài)類中只能包括靜態(tài)成員靜態(tài)構(gòu)造函數(shù)不能有參數(shù)、不能有訪問修飾符(默認(rèn)為private)。靜態(tài)構(gòu)造函數(shù)在第一次使用該靜態(tài)類的時(shí)候只執(zhí)行一次。靜態(tài)成員屬于類所有,非靜態(tài)成員屬于類的實(shí)例所有C#靜態(tài)方法屬于類所有,類實(shí)例化前即可使用在實(shí)例方法中可以直接調(diào)用靜態(tài)方法,在靜態(tài)方法中不可以直接調(diào)用實(shí)例方法靜態(tài)方法和靜態(tài)變量創(chuàng)建后始終使用同一塊內(nèi)存(靜態(tài)存儲(chǔ)區(qū)),而使用實(shí)例的方式會(huì)創(chuàng)建多個(gè)內(nèi)存少使用靜態(tài)類,靜態(tài)類、靜態(tài)成員所分配的內(nèi)存在程序退出時(shí)才會(huì)釋放。北京傳智播客教育什么時(shí)候使用靜態(tài)成員、靜態(tài)類1.在實(shí)例類中使用靜態(tài)成員。賬戶類:(實(shí)例類)classAccount{UserName//用戶名Address//地址Total//存款額staticRate//利率,由于該銀行采用浮動(dòng)利率,每天的利率根據(jù)當(dāng)天的掛牌利率(基準(zhǔn)利率)來計(jì)算,所以“利率”不適合作為每個(gè)對(duì)象單獨(dú)的一個(gè)數(shù)據(jù)。}//當(dāng)多個(gè)對(duì)象共享同一個(gè)數(shù)據(jù)的時(shí)候就可以在實(shí)例類中加入靜態(tài)成員。2.使用靜態(tài)類在項(xiàng)目中需要頻繁用到的一些工具類,例如:Math、Console、Convert等?;蛘吣M“全局變量”的時(shí)候。北京傳智播客教育靜態(tài)類的繼承問題(*)靜態(tài)類不能被其他類繼承,靜態(tài)成員亦不能被繼承(訪問的是同一個(gè)),備注1.靜態(tài)類只能繼承自O(shè)bject類。(靜態(tài)類不能繼承自其它類。)繼承(多態(tài))、靜態(tài)本身就是相反的。靜態(tài)類不能實(shí)現(xiàn)任何接口,(因?yàn)榻涌谥械某蓡T都是實(shí)例成員。*)sealed:(*)密封類,不能被繼承。sealed關(guān)鍵字,表示類不能被繼承。(密封類)密封類表示不能被繼承。String類。.net系統(tǒng)中本身對(duì)字符串有很多特殊處理(為String開了很多“綠燈”,String有很多特權(quán),比如:不可變性,字符串池等等。),防止別的類繼承后造成混亂。商業(yè)問題。禁止子類重寫父類的方法。靜態(tài)類的本質(zhì)abstract+sealed(*,知道即可)static靜態(tài)類不能被實(shí)例化:abstract靜態(tài)類不能被繼承:sealed北京傳智播客教育多態(tài):為了程序的可擴(kuò)展性。開放封閉原則(對(duì)修改封閉,對(duì)擴(kuò)展開放。)先看看ToString()方法。普通類的ToString()、Int32多態(tài)就是指不同對(duì)象收到相同消息時(shí),會(huì)產(chǎn)生不同行為,同一個(gè)類在不同的場(chǎng)合下表現(xiàn)出不同的行為特征多態(tài)的作用:把不同的子類對(duì)象都當(dāng)作父類來看,可以屏蔽不同子類對(duì)象之間的差異,寫出通用的代碼,做出通用的編程,以適應(yīng)需求的不斷變化。里氏替換原則父類引用指向子類對(duì)象Personp=newChinese();(隱式類型轉(zhuǎn)換)父類對(duì)象不能夠替換子類Chinesec=(Chinese)newPerson();(×)is-a:可以用來驗(yàn)證繼承關(guān)系中是否合理。(cando,驗(yàn)證實(shí)現(xiàn)接口是否合理*)if(objis

類型A)//obj是父類類型對(duì)象,”類型A”是子類類型。關(guān)鍵字as(類型轉(zhuǎn)換)、is(通常類型轉(zhuǎn)換前需要通過is來判斷一下類型。)北京傳智播客教育實(shí)現(xiàn)多態(tài)的方式virtual,子類重寫父類中的方法。abstract,子類重寫父類中的方法。接口,實(shí)現(xiàn)接口的類,將接口中的方法實(shí)現(xiàn)。北京傳智播客教育怎么實(shí)現(xiàn)多態(tài)1-抽象類abstract抽象類不能被實(shí)例化。抽象類中可以有普通成員。抽象類存在的意義:1.抽象類不能被實(shí)例化,只能被其他類繼承2.繼承抽象類的子類必須把抽象類中的所有抽象成員都重寫(實(shí)現(xiàn))(除非子類也是抽象類。)3.抽象類就是為了重寫→多態(tài)(代碼重用)。4.抽象類中可以有實(shí)例成員也可以有抽象成員。什么是抽象類(光說不做)不能被實(shí)例化的類(不能new)抽象類的特點(diǎn)見備注案例:學(xué)生類和老師類中抽象出父類(Person),并讓學(xué)生和老師都要具有SayHello和起立Standup兩個(gè)方法練習(xí)1:動(dòng)物Animal

都有吃Eat和叫Bark的方法,狗Dog和貓Cat叫的方法不一樣.父類中沒有默認(rèn)的實(shí)現(xiàn)所喲考慮用抽象方法。練習(xí)2:計(jì)算形狀Shape(圓Circle,矩形Square

,正方形Rectangle)的面積、周長(zhǎng)北京傳智播客教育知識(shí)點(diǎn)補(bǔ)充1:關(guān)于抽象類知識(shí)點(diǎn)補(bǔ)充抽象類中的抽象成員不能使用private訪問修飾符,可以使用其他訪問修飾符。常見問題:當(dāng)鼠標(biāo)放到父類上時(shí),沒有自動(dòng)提示“必須實(shí)現(xiàn)父類中的抽象方法”,原因可能是父類不是abstract或,父類中沒有abstract成員。北京傳智播客教育抽象類練習(xí)要實(shí)現(xiàn)U盤、MP3播放器、移動(dòng)硬盤三種移動(dòng)存儲(chǔ)設(shè)備,要求計(jì)算機(jī)能同這三種設(shè)備進(jìn)行數(shù)據(jù)交換,并且以后可能會(huì)有新的第三方的移動(dòng)存儲(chǔ)設(shè)備,所以計(jì)算機(jī)必須有擴(kuò)展性,能與目前未知而以后可能會(huì)出現(xiàn)的存儲(chǔ)設(shè)備進(jìn)行數(shù)據(jù)交換。各個(gè)存儲(chǔ)設(shè)備間讀、寫的實(shí)現(xiàn)方法不同,U盤和移動(dòng)硬盤只有這兩個(gè)方法,MP3Player還有一個(gè)PlayMusic方法橡皮鴨子(RubberDuck)、真實(shí)的鴨子(RealDuck)。兩個(gè)鴨子都會(huì)游泳,而橡皮鴨子和真實(shí)的鴨子都會(huì)叫,只是叫聲不一樣,橡皮鴨子“唧唧”叫,真實(shí)地鴨子“嘎嘎”叫北京傳智播客教育new(*)隱藏、截?cái)?用的不多,了解)方法的隱藏Swim方法是子類特有classRubberDuck:Duck

{

//方法的隱藏

//子類特有的方法,只不過方法名和父類重名了publicnewvoidSwim()

{Console.WriteLine("swim被改變了");

}}如果一個(gè)方法在子類中被重寫Duckduck=newRubberDuck();duck.Bark()調(diào)用子類的方法,因?yàn)楸恢貙憽A顺橄蠓椒ㄗ宇惐仨氈貙懰圆荒苡胣ew.使用第三方dll的時(shí)候,原來沒有SayHi方法,自己繼承后加了個(gè)SayHi(),后來第三方dll更新,也加了個(gè)SayHi(),繼承后的類中現(xiàn)在就得用new了。北京傳智播客教育面向?qū)ο笥?jì)算器使用面向?qū)ο蟮姆绞綄?shí)現(xiàn)+、-、*、/的計(jì)算器1、找對(duì)象2、抽象出父類,讓子類都有計(jì)算能力3、實(shí)現(xiàn)子類4、產(chǎn)生子類對(duì)象的工廠5、調(diào)用哪部分是可能擴(kuò)展的就嘗試將該部分抽象(封裝變化,將變化的地方抽象出來),以便多態(tài)。北京傳智播客教育設(shè)計(jì)模式(GOF23種設(shè)計(jì)模式)世上本沒路,走的人多了也就成了路設(shè)計(jì)本沒模式,程序?qū)懚嗔艘簿陀辛四J娇偨Y(jié)前人的思想,總結(jié)出的解決某一類問題的通用方法剛才的計(jì)算器就是設(shè)計(jì)模式中簡(jiǎn)單工廠設(shè)計(jì)模式

各種設(shè)計(jì)模式的本質(zhì)都是:多態(tài)。充分理解了多態(tài),再看設(shè)計(jì)模式就會(huì)覺得輕松很多。北京傳智播客教育值類型引用類型值類型均隱式派生自System.ValueType數(shù)值類型、bool、結(jié)構(gòu)、枚舉查看IL,隱式繼承自ValueType引用類型派生自System.Object字符串、數(shù)組、類、接口等查看IL隱式繼承自O(shè)bject引用類型變量的賦值只復(fù)制對(duì)對(duì)象的引用。值類型變量賦值會(huì)拷貝一個(gè)副本。北京傳智播客教育值類型、引用類型作為參數(shù)傳遞值傳遞,剛才討論的參數(shù)傳遞方式都是值傳遞。引用傳遞,ref,傳遞的是變量的地址。值傳遞(普通的參數(shù)傳遞)引用傳遞(ref)(*)值類型、引用類型值傳遞、引用傳遞值傳遞:引用類型、值類型引用傳遞(ref):引用類型、值類型。北京傳智播客教育怎么實(shí)現(xiàn)多態(tài)2-接口什么是接口?接口就是一種規(guī)范,協(xié)議(*),約定好遵守某種規(guī)范就可以寫通用的代碼。定義了一組具有各種功能的方法。(只是一種能力,沒有具體實(shí)現(xiàn),像抽象方法一樣,“光說不做”)接口存在的意義:多態(tài)。多態(tài)的意義:程序可擴(kuò)展性。最終→節(jié)省成本,提高效率。接口解決了類的多繼承的問題接口解決了類繼承以后體積龐大的問題。接口之間可以實(shí)現(xiàn)多繼承先從語法角度看一下接口,與抽象類類似。北京傳智播客教育案例(繼承了一個(gè)類,同時(shí)實(shí)現(xiàn)了其他接口)鳥-麻雀sparrow['sp?r?u],鴕鳥ostrich['?strit?],企鵝penguin['pengwin],鸚鵡parrot['p?r?t]

鳥能飛,鴕鳥,企鵝不能。。。你怎么辦子類繼承抽象類,實(shí)現(xiàn)接口接口中的成員必須不能有實(shí)現(xiàn),接口不能實(shí)例化。接口中的成員不能有訪問修飾符,隱式公開public接口中可以有屬性、方法、索引器等(其實(shí)都是方法),但不能有字段接口中的所有成員必須被子類中全部實(shí)現(xiàn),除非子類是抽象類,把接口中的成員標(biāo)記為抽象的。練習(xí):從學(xué)生,老師,校長(zhǎng)類中抽象出人的類,學(xué)生和老師都有收作業(yè)的方法,但是校長(zhǎng)不會(huì)收作業(yè)北京傳智播客教育再看一個(gè)接口案例回顧:接口是一種規(guī)范。什么是規(guī)范?理解規(guī)范的意義。規(guī)范,就是告訴我們要做什么,具有什么能力。在程序中為什么需要規(guī)范?(多態(tài),可以讓我們編寫通用的代碼,提高程序的可擴(kuò)展性)接口就像“法律”。登記方法(接口作為參數(shù),實(shí)現(xiàn)多態(tài))DengJi(Personperson)//人口登記,Person是抽象類DengJi(Carcar)//汽車也要登記DengJi(Househouse)//房子也要登記。IJiKouDengJi(IJieKoujk);北京傳智播客教育練習(xí)橡皮rubber鴨子、木wood鴨子、真實(shí)的鴨子realduck。三個(gè)鴨子都會(huì)游泳,而橡皮鴨子和真實(shí)的鴨子都會(huì)叫,只是叫聲不一樣,橡皮鴨子“唧唧”叫,真實(shí)地鴨子“嘎嘎”叫,木鴨子不會(huì)叫.把抽象類變成接口。北京傳智播客教育顯示實(shí)現(xiàn)接口(*)為什么要顯示實(shí)現(xiàn)接口?方法重名后的解決辦法。顯示實(shí)現(xiàn)接口后,只能通過接口來調(diào)用。不能通過類對(duì)象本身來調(diào)用(顯示實(shí)現(xiàn)的接口,查看IL是private的,防止通過類來調(diào)用)為什么要有“顯示實(shí)現(xiàn)接口”?可以解決重名方法的問題。什么是“顯示實(shí)現(xiàn)接口”?實(shí)現(xiàn)接口中的方法時(shí)用:接口名.方法名(),并且沒有訪問修飾符,private“顯示實(shí)現(xiàn)接口”后怎么調(diào)用?只能通過接口變量來調(diào)用,因?yàn)轱@示實(shí)現(xiàn)接口默認(rèn)為private。北京傳智播客教育接口的特點(diǎn)總結(jié)接口是一種規(guī)范。為了多態(tài)。接口不能被實(shí)例化。接口中的成員不能加“訪問修飾符”,接口中的成員訪問修飾符為public,不能修改。(默認(rèn)為public)接口中的成員不能有任何實(shí)現(xiàn)(“光說不做”,只是定義了一組未實(shí)現(xiàn)的成員)。接口中只能有方法、屬性、索引器、事件,不能有“字段”。接口與接口之間可以繼承,并且可以多繼承。實(shí)現(xiàn)接口的子類必須實(shí)現(xiàn)該接口的全部成員。一個(gè)類可以同時(shí)繼承一個(gè)類并實(shí)現(xiàn)多個(gè)接口,如果一個(gè)子類同時(shí)繼承了父類A,并實(shí)現(xiàn)了接口IA,那么語法上A必須寫在IA的前面。classMyClass:A,IA{},因?yàn)轭愂菃卫^承的。當(dāng)一個(gè)抽象類實(shí)現(xiàn)接口的時(shí)候,如果不想把接口中的成員實(shí)現(xiàn),可以把該成員實(shí)現(xiàn)為abstract。(抽象類也能實(shí)現(xiàn)接口,用abstrac標(biāo)記)“顯示實(shí)現(xiàn)接口”,只能通過接口變量來調(diào)用(因?yàn)轱@示實(shí)現(xiàn)接口后成員為private)。北京傳智播客教育使用接口的建議面向抽象編程,使用抽象(父類、抽象類、接口)不使用具體?!跋蛏限D(zhuǎn)型”在編程時(shí):接口→抽象類→父類→具體類(在定義方法參數(shù)、返回值、聲明變量的時(shí)候能用抽象就不要用具體。)能使用接口就不用抽象類,能使用抽象類就不用類,能用父類就不用子類。避免定義“體積龐大的接口”、“多功能接口”,會(huì)造成“接口污染”。只把相關(guān)聯(lián)的一組成員定義到一個(gè)接口中(盡量在接口中少定義成員)。單一職責(zé)原則定義多個(gè)職責(zé)單一的接口(小接口)(組合使用)。(印刷術(shù)與活字印刷術(shù))隨著學(xué)習(xí)的深入再繼續(xù)體會(huì)接口的作用。北京傳智播客教育抽象類復(fù)習(xí)、簡(jiǎn)單工廠設(shè)計(jì)模式復(fù)習(xí)(*)抽象類:不能被實(shí)例化,需要被繼承。多態(tài)。子類必須重寫父類中的所有的抽象成員,除非:子類也是一個(gè)抽象類。抽象成員在父類中不能有任何實(shí)現(xiàn)。抽象類中可以有實(shí)例成員。抽象成員的訪問修飾符不能是private抽象成員只能寫在抽象類中。abstract作業(yè):通過案例筆記本電腦的選擇。筆記本電腦父類NoteBook、不同品牌的筆記本產(chǎn)品。(繼承+簡(jiǎn)單工廠)北京傳智播客教育接口復(fù)習(xí)(*)定義接口的語法(interface)接口中只能包含方法、屬性、索引器、事件。不能包含字段。見備注1(貌似事件像一個(gè)字段?其實(shí)是兩個(gè)方法。reflector查看源碼)。接口中的成員不能有任何的實(shí)現(xiàn)(真正的“光說不做”。思考這樣做的意義。聯(lián)想抽象類中的抽象方法。)接口中的成員不能寫訪問修飾符。使用接口的語法一個(gè)類可以實(shí)現(xiàn)多個(gè)接口。實(shí)現(xiàn)接口的類,必須把接口中的所有成員都實(shí)現(xiàn)。子類實(shí)現(xiàn)接口中的成員時(shí),不能修改成員的訪問修飾符、參數(shù)列表、方法名等。(與方法重寫一樣)北京傳智播客教育面試題1.如何使用virtual和override?Personper=newStudent();per.SayHI()調(diào)用的子類重寫的SayHi方法(語法、應(yīng)用(多態(tài)))2.如何使用abstract和override?3.“方法重載overload”、“方法重寫override"、"隱藏new"是同一個(gè)概念嗎?4.抽象類和接口的區(qū)別?見備注1.抽象類適用于同一系列,并且有需要繼承的成員。接口適用于不同系列的類具有相同的動(dòng)作(行為、動(dòng)作、方法)。對(duì)于不是相同的系列,但具有相同的行為,這個(gè)就考慮使用接口。接口解決了類不能多繼承問題。北京傳智播客教育知識(shí)補(bǔ)充:標(biāo)志枚舉(*)1.枚舉:(QQ的狀態(tài),在線、隱身、忙碌…)PublicenumMyColor:byte{//byte表示限制枚舉中的值。White,Red=100,Green}//枚舉對(duì)應(yīng)的都是一個(gè)常量值,所以編譯的時(shí)候就會(huì)替換成對(duì)應(yīng)的數(shù)值。獲取當(dāng)前枚舉的基礎(chǔ)值類型:Enum.GetUnderlyingType(typeof(MyColor))【byte】,枚舉基礎(chǔ)類型可以是除了char以外的任何整型,準(zhǔn)許使用的枚舉類型有byte、sbyte、short、ushort、int、uint、long或ulong。1>將枚舉轉(zhuǎn)換為數(shù)值:(int)MyColor.Red;2>將枚舉轉(zhuǎn)換為字符串:MyColor.Red.ToString()3>將字符串轉(zhuǎn)換為枚舉:MyColormc=(MyColor)Enum.Parse(typeof(MyColor),"Red");2.標(biāo)志枚舉:(當(dāng)可以具有多個(gè)狀態(tài)時(shí),普通枚舉就不夠用了(狀態(tài)可以組合))FileAttributes,普通枚舉中的每個(gè)值是互斥的,而標(biāo)志枚舉中每個(gè)值是可以互相組合的。見備注1FlagsAttribute特性。讓兩個(gè)標(biāo)志枚舉組合:枚舉.V1|枚舉.V2判斷當(dāng)前值中是否包含V1:枚舉mj=…;if(mj&枚舉.V1==枚舉.V1)表示存在V1北京傳智播客教育結(jié)構(gòu)體(*)值類型在沒有面向?qū)ο?、在沒有類的情況下如何組織一些相關(guān)的數(shù)據(jù)?一種值類型,不具有面向?qū)ο蟮奶卣?,通常用來封裝小型相關(guān)變結(jié)構(gòu)體是一個(gè)值類型。(非常像類的量組)System.Drawing.Point、Size、Color注意:結(jié)構(gòu)使用時(shí)可以new,也可以不new。如果不new,則使用前必須為結(jié)構(gòu)成員賦值。(當(dāng)結(jié)構(gòu)中有屬性,并且聲明結(jié)構(gòu)后需要使用到屬性時(shí),必須new.)在結(jié)構(gòu)中不能為變量直接賦初值,除非const、static結(jié)構(gòu)可以實(shí)現(xiàn)接口,但不能繼承。結(jié)構(gòu)的使用方法與類很相似。什么時(shí)候使用類?什么時(shí)候使用結(jié)構(gòu)?1.是否需要使用面向?qū)ο蟮奶匦裕悍庋b、繼承、多態(tài)。,如果需要在某些情況下被繼承或者使用多態(tài)等特性則只能用類。當(dāng)類型中(類或結(jié)構(gòu))的成員比較多的時(shí)候,則考慮使用類。結(jié)構(gòu)與類的詳細(xì)區(qū)別見備注。使用結(jié)構(gòu)時(shí)注意裝箱、拆箱的性能差異。北京傳智播客教育類型轉(zhuǎn)換CAST隱式類型轉(zhuǎn)換doublenum=10;//sizeof(double)/sizeof(int)顯示類型轉(zhuǎn)換intn=(int)num;把學(xué)生轉(zhuǎn)換為人是隱式轉(zhuǎn)換,把人轉(zhuǎn)換為學(xué)生則是顯式轉(zhuǎn)換(強(qiáng)制轉(zhuǎn)換)Students=newStudent();Personp=s;//隱式類型轉(zhuǎn)換Studentstu=(Student)p;//顯示類型轉(zhuǎn)換、objas類型。只有在內(nèi)存存儲(chǔ)上存在交集的類型之間才能進(jìn)行隱式轉(zhuǎn)換。不能用Cast轉(zhuǎn)換string/int,只能用Convert。Convert.ToInt32/Convert.ToString北京傳智播客教育補(bǔ)充:Convert將任意類型轉(zhuǎn)換成字符串:ToString()將字符串轉(zhuǎn)換成“數(shù)值類型”(int、float、double):int.Parse(stringstr);、int.TryParse(stringstr,outintn);//很常用,推薦。double.Parse(stringstr);、double.TryParse(stringstr,outdoubled);……Parse()轉(zhuǎn)換失敗報(bào)異常,TryParse()轉(zhuǎn)換失敗不報(bào)異常。再說as與直接類型轉(zhuǎn)換:(*)if(pisStudent){Studentstu=(Student)p;}CLR會(huì)進(jìn)行兩次類型檢查if(檢查一次){//再檢查一次}通過GetType(),GetType()不允許重寫。Studentstu=pasStudent;//推薦,效率高于第一種,如果轉(zhuǎn)換失敗返回null,而不會(huì)報(bào)異常。北京傳智播客教育類型轉(zhuǎn)換ConvertConvert考慮數(shù)據(jù)意義的轉(zhuǎn)換。Convert是一個(gè)加工、改造的過程。若要進(jìn)行其它類型的轉(zhuǎn)換可以使用Convert.ToInt32、Convert.ToString等。Convert可以把object類型轉(zhuǎn)換為其它類型stringstr=null;

intnum=0;

num=Convert.ToInt32(str);

Console.Write(num+“\r\n”);

num=Int32.Parse(str);

Console.Write(num+“\r\n”);

Int32.TryParse(str,outnum);

Console.Write(num+"\r\n");當(dāng)遇到類型轉(zhuǎn)換的時(shí)候不知道該怎么轉(zhuǎn),可以去Convert中找找。北京傳智播客教育異常處理1什么是異常?程序運(yùn)行時(shí)發(fā)生的錯(cuò)誤。(錯(cuò)誤的出現(xiàn)并不總是程序員人的原因,有時(shí)應(yīng)用程序會(huì)因?yàn)樽罱K用戶或運(yùn)行代碼的環(huán)境改變而發(fā)生錯(cuò)誤。比如:1.連接數(shù)據(jù)庫時(shí)數(shù)據(jù)庫服務(wù)器停電了;2.操作文件時(shí)文件沒了、權(quán)限不足等;3.計(jì)算器用戶輸入的被除數(shù)是0;4.使用對(duì)象時(shí)對(duì)象為null;等等。).net為我們把“發(fā)現(xiàn)錯(cuò)誤(try)”的代碼與“處理錯(cuò)誤(catch)”的代碼分離開來。異常處理的一般代碼模式:try{…可能發(fā)生異常的代碼…}catch{…對(duì)異常的處理…}finally{…無論是否發(fā)生異常、是否捕獲異常都會(huì)執(zhí)行的代碼…}try塊:可能出問題的代碼。當(dāng)遇到異常時(shí),后續(xù)代碼不執(zhí)行。catch塊:對(duì)異常的處理。記錄日志(log4net),繼續(xù)向上拋出等操作。(只有發(fā)生了異常,才會(huì)執(zhí)行。)finally塊:代碼清理、資源釋放等。無論是否發(fā)生異常都會(huì)執(zhí)行。案例:intx=5;inty=0;intz=x/y;程序運(yùn)行運(yùn)行時(shí)出錯(cuò),后續(xù)的內(nèi)容無法運(yùn)行程序一旦有一個(gè)功能發(fā)生異常,整個(gè)程序崩潰其它功能也無法正常運(yùn)行北京傳智播客教育異常處理2異常處理代碼的其他幾種形式:try→多個(gè)catch→一個(gè)finallytry→(1個(gè)或多個(gè)catch),多個(gè)catch的順序問題。沒有finally。try→finally(只能有一個(gè)),沒有catch也可以。注意點(diǎn):發(fā)生異常后,try塊中,異常代碼后的代碼不會(huì)執(zhí)行。finally塊中的代碼,無論是否發(fā)生異常都會(huì)執(zhí)行。finally中不能寫return語句。try中有return語句,finally也會(huì)執(zhí)行即便沒有catch(或者沒有找到合適的catch塊),finally中的代碼也會(huì)執(zhí)行,但finally之后的代碼則不會(huì)。(見備注1.)Exceptionex異常也是對(duì)象,封裝了異常發(fā)生時(shí)的一些信息。Exception類主要屬性:Message、StackTrace、InnerException(*)扔出自己的異常,扔:throw,抓住:catch建議:通過邏輯判斷(if-else)減少異常發(fā)生的可能性!在多級(jí)方法嵌套調(diào)用的時(shí)候,如果發(fā)生了異常,則會(huì)終止所有相關(guān)方法的調(diào)用,并且釋放相關(guān)的資源。北京傳智播客教育代碼觀察static

intGetNumber(){

try{

intn1=10;

intn2=0;

intn3=n1/n2;

return100;}

catch(Exceptionex){

Console.WriteLine("*******異常了*********");

return1000;}

finally{

Console.WriteLine("finally中的代碼!!!!");}}問題:1.finally中的代碼會(huì)不會(huì)執(zhí)行?2.方法會(huì)不會(huì)返回值?3.如果有返回值,是多少?北京傳智播客教育函數(shù)返回值(函數(shù)參數(shù)前的修飾符)params

可變參數(shù)無論有幾個(gè)參數(shù),必須出現(xiàn)在參數(shù)列表的最后??梢詾榭勺儏?shù)直接傳遞一個(gè)對(duì)應(yīng)類型的數(shù)組。ref

僅僅是一個(gè)地址,引用傳遞,可以把值傳遞強(qiáng)制改為引用傳遞out

讓函數(shù)可以輸出多個(gè)值1.在方法中必須為out參數(shù)賦值2.out參數(shù)的變量在傳遞之前不需要賦值,即使賦值了也不能在方法中使用。(賦值沒意義)ref參數(shù)在傳遞之前必須賦值在方法中可以不為ref參數(shù)賦值,可以直接使用。ref應(yīng)用場(chǎng)景內(nèi)部對(duì)外部的值進(jìn)行改變,out則是內(nèi)部為外部變量賦值,out一般用在函數(shù)有多個(gè)返回值的場(chǎng)所。北京傳智播客教育ref與out案例案例1:兩個(gè)int變量的交換,用方法做。ref?out案例2:模擬登陸,返回登陸是否成功(bool),如果登陸失敗,提示用戶是用戶名錯(cuò)誤還是密碼錯(cuò)誤”admin”,“888888”【兩個(gè)返回值,一個(gè)bool,一個(gè)string】ref?outswap(intn,intm){//交換兩個(gè)變量}cw(n,m)boollogin(stringuid,stringpwd){}北京傳智播客教育方法重載1.方法名稱相同2.方法簽名不同方法名參數(shù)類型、個(gè)數(shù)、(順序)參數(shù)的修飾符(ref、out、params)不包含方法返回值。北京傳智播客教育Equals、==、ReferenceEquals方法比較兩個(gè)對(duì)象是否為同一個(gè)對(duì)象?什么是同一個(gè)對(duì)象?為什么字符串的Equals和別的不一樣?//string的Equals方法判斷的是字符串的內(nèi)容是否相同(重寫了Object中的Equals方法。)

//而object中的Equals方法是判斷對(duì)象的地址是否相同查看String類的==運(yùn)算符,內(nèi)部調(diào)用的也是Equalsobject.Equals();//用這個(gè)來比較兩個(gè)對(duì)象。//補(bǔ)充一個(gè):如何判斷str1與str2是否為同一個(gè)對(duì)象?Equals已經(jīng)不可靠了。判斷兩個(gè)對(duì)象是否相同要用:object.object.ReferenceEquals();北京傳智播客教育常用類庫String學(xué)習(xí).net就是學(xué)習(xí)它的無數(shù)個(gè)類庫怎么用,先看兩個(gè)簡(jiǎn)單的字符串的一些特性:不可變性(ToUpper演示)字符串暫存池(拘留池)(針對(duì)字符串常量)內(nèi)部維護(hù)一個(gè)哈希表key為字符串,value是地址。每次為一個(gè)新變量賦值都會(huì)找key中是否有,如果有則直接把value中的地址賦值給新變量(*用的少)(暫存、拘留、駐留)字符串留用(Intern,針對(duì)變量常量,見備注1)。對(duì)于動(dòng)態(tài)字符串本身在哈希表中沒有,通過這種Intern可以添加到該哈希表中,目的為了提高性能。String.Intern(xx),

Intern方法使用暫存池來搜索與str值相等的字符串。如果存在這樣的字符串,則返回暫存池中它的引用。如果不存在,則向暫存池添加對(duì)str的引用,然后返回該引用。String.IsInterned(xx),此方法在暫存池中查找str。如果已經(jīng)將str放入暫存池中,則返回對(duì)此實(shí)例的引用;否則返回nullNothingnullptrnull引用北京傳智播客教育String字符串,字符串可以看成字符數(shù)組,不可變特性(通過for循環(huán),修改string中的元素,失??!)。屬性Length//獲得字符串中字符的個(gè)數(shù)?!盿A我你他”→5方法IsNullOrEmpty() 靜態(tài)方法,判斷為null或者為””(靜態(tài)方法)ToCharArray()將string轉(zhuǎn)換為char[]ToLower() 小寫,必須接收返回值。(因?yàn)椋鹤址牟豢勺?;ToUpper()大寫。Equals() 比較兩個(gè)字符串是否相同。忽略大小寫的比較,paration.IndexOf()如果沒有找到對(duì)應(yīng)的數(shù)據(jù),返回-1.//面試題:統(tǒng)計(jì)一個(gè)字符串中,”天安門”出現(xiàn)的次數(shù)。 LastIndexOf() 如果沒有找到對(duì)應(yīng)的數(shù)據(jù),返回-1Substring() //2個(gè)重載,截取字符串。Split()//分割字符串。 Join() 靜態(tài)方法Format () 靜態(tài)方法Replace() s北京傳智播客教育注意:對(duì)字符串的操作一定要用變量接收返回值。(字符串是不能變的,每次都是構(gòu)建一個(gè)新的字符串)strings=“abc”;s=s.Replace(‘c’,’C’);北京傳智播客教育字符串的處理練習(xí)1課上練習(xí)1:接收用戶輸入的字符串,將其中的字符以與輸入相反的順序輸出。"abc"→"cba“.課上練習(xí)2:接收用戶輸入的一句英文,將其中的單詞以反序輸出?!癐loveyou"→“Ievoluoy"課上練習(xí)3:”2012年12月21日”從日期字符串中把年月日分別取出來,打印到控制臺(tái)課上練習(xí)4:把csv文件中的聯(lián)系人姓名和電話顯示出來。簡(jiǎn)單模擬csv文件,csv文件就是使用,分割數(shù)據(jù)的文本,輸出:姓名:張三電話:string[]lines=File.ReadAllLines(“1.csv”,Encoding.Default);//讀取文件中的所有行,到數(shù)組中。北京傳智播客教育字符串的處理練習(xí)2練習(xí)5:123-456---7---89-----123----2把類似的字符串中重復(fù)符號(hào)”-”去掉,既得到123-456-7-89-123-2.split()、StringSplitOptions.RemoveEmptyEntriesJoin()練習(xí)6:從文件路徑中提取出文件名(包含后綴)。比如從c:\a\b.txt中提取出b.txt這個(gè)文件名出來。以后還會(huì)學(xué)更簡(jiǎn)單的方式:“正則表達(dá)式”,項(xiàng)目中我們用微軟提供的:Path.GetFileName();(更簡(jiǎn)單。)練習(xí)7:“[port=21,type=ftp]”,這個(gè)字符串表示IP地址為的服務(wù)器的21端口提供的是ftp服務(wù),其中如果“,type=ftp”部分被省略,則默認(rèn)為http服務(wù)。請(qǐng)用程序解析此字符串,然后打印出“IP地址為***的服務(wù)器的***端口提供的服務(wù)為***”line.Contains(“type=”)[port=21]練習(xí)8:求員工工資文件中,員工的最高工資、最低工資、平均工資北京傳智播客教育作業(yè):“北京傳智播客軟件培訓(xùn),傳智播客.net培訓(xùn),傳智播客Java培訓(xùn)。傳智播客官網(wǎng):。北京傳智播客歡迎您?!薄T谝陨献址姓?qǐng)統(tǒng)計(jì)出”傳智播客”出現(xiàn)的次數(shù)。找IndexOf()的重載。北京傳智播客教育常用類庫StringBuilder高效的字符串操作當(dāng)大量進(jìn)行字符串操作的時(shí)候,比如,很多次的字符串的拼接操作。String對(duì)象是不可變的。每次使用System.String類中的一個(gè)方法時(shí),都要在內(nèi)存中創(chuàng)建一個(gè)新的字符串對(duì)象,這就需要為該新對(duì)象分配新的空間。在需要對(duì)字符串執(zhí)行重復(fù)修改的情況下,與創(chuàng)建新的String對(duì)象相關(guān)的系統(tǒng)開銷可能會(huì)非常大。如果要修改字符串而不創(chuàng)建新的對(duì)象,則可以使用System.Text.StringBuilder類。例如,當(dāng)在一個(gè)循環(huán)中將許多字符串連接在一起時(shí),使用StringBuilder類可以提升性能。StringBuilder!=String//將StringBuilder轉(zhuǎn)換為String.用ToString();StringBuilder僅僅是拼接字符串的工具,大多數(shù)情況下還需要把StringBuilder轉(zhuǎn)換為String.StringBuildersb=newStringBuilder();sb.Append();//追加字符串sb.ToString();//把StringBuilder轉(zhuǎn)換為字符串。sb.Insert();sb.Replace();案例:使用程序拼html中的tableString大量拼接演示。北京傳智播客教育垃圾回收(*)CLR的一個(gè)核心功能—垃圾回收。垃圾回收的目的:提高內(nèi)存利用率。垃圾回收器,只回收托管堆中的內(nèi)存資源,不回收其他資源(數(shù)據(jù)庫連接、文件句柄、網(wǎng)絡(luò)端口等)。什么樣的對(duì)象才會(huì)被回收?沒有變量引用的對(duì)象。沒有變量引用的對(duì)象,表示可以被回收了(null),斷了線的風(fēng)箏,再也回不來了。大學(xué)食堂(自己收盤子)、大排檔(不需要程序員自己收盤子)什么時(shí)間回收?不確定,當(dāng)程序需要新內(nèi)存的時(shí)候開始執(zhí)行回收。GC.Collect();//手動(dòng)調(diào)用垃圾回收器。不建議使用,垃圾回收時(shí)會(huì)暫停一下(非常短暫)讓程序自動(dòng)去GC。垃圾回收器中“代”的概念:共3代:第0代、第1代、第2代。各代的回收頻率:第0代最高,其次第1代,再次第2代。也就是說越老的對(duì)象生存幾率越大。.net中垃圾回收機(jī)制:pact(標(biāo)記和壓縮),一開始假設(shè)所有對(duì)象都是垃圾。除了內(nèi)存資源外的其他資源怎么辦?~或者Dispose()弱引用:WeakReference,對(duì)于創(chuàng)建比較耗時(shí)的對(duì)象可以使用弱引用。見備注1.IsALive判斷是否已死。北京傳智播客教育集合類(增、刪、查、改、遍歷)

ArrayList、Hashtable、List<T>、Dictionary<K,V>數(shù)組特點(diǎn):類型統(tǒng)一、長(zhǎng)度固定。集合常用操作添加、遍歷、移除命名空間System.Collections

ArrayList可變長(zhǎng)度數(shù)組,使用類似于數(shù)組屬性Capacity(集合中可以容納元素的個(gè)數(shù),翻倍增長(zhǎng));Count(集合中實(shí)際存放的元素的個(gè)數(shù)。)方法Add()AddRange(ICollectionc)

Remove()RemoveAt()Clear()Contains()ToArray()Sort()排序\Reverse();//反轉(zhuǎn)Hashtable鍵值對(duì)的集合,類似于字典,Hashtable在查找元素的時(shí)候,速度很快。Add(objectkey,objectvalue);hash[“key”]hash[“key”]=“修改”;.ContainsKey(“key”);Remove(“key”);遍歷:hash.Keyshash.Values/DictionaryEntry鍵值對(duì)集合中的“鍵”,絕對(duì)不能重復(fù)。北京傳智播客教育案例:兩個(gè)(ArrayList)集合{“a”,“b”,“c”,“d”,“e”}和{“d”,“e”,“f”,“g”,“h”},把這兩個(gè)集合去除重復(fù)項(xiàng)合并成一個(gè)。案例:隨機(jī)生成10個(gè)1-100之間的數(shù)放到ArrayList中,要求這10個(gè)數(shù)不能重復(fù),并且都是偶數(shù)(添加10次,可能循環(huán)很多次。)Randomrandom=newRandom();random.next(1,101);//隨即生成1-100之間的數(shù)。練習(xí):有一個(gè)字符串是用空格分隔的一系列整數(shù),寫一個(gè)程序把其中的整數(shù)做如下重新排列打印出來:奇數(shù)顯示在左側(cè)、偶數(shù)顯示在右側(cè)。比如”2783229511”顯示成”7392822….”。注意事項(xiàng):不要把Random的實(shí)例化放到循環(huán)里面!可以使用兩個(gè)集合來降低產(chǎn)生隨機(jī)數(shù)的循環(huán)次數(shù)。Random在循環(huán)中會(huì)降低執(zhí)行效率(每次new的時(shí)候的種子是一樣的,當(dāng)前時(shí)間。)(*)。北京傳智播客教育泛型集合:使用泛型集合List<T>\Dictionary<K,V>書櫥命名空間System.Collections.GenericList<T>類似于ArrayList,ArrayList的升級(jí)版。各種方法:Sort()、Max()、Min()、Sum()…Dictionary<K,V>類似于Hashtable,Hashtable的升級(jí)版。推薦使用泛型集合。T,K,V就像一把鎖,鎖住集合只能存某種特定的類型,這里的T,K,V也可以是其它字母

泛型集合可以進(jìn)行foreach遍歷,是因?yàn)閷?shí)現(xiàn)了IEnumerable<T>具有了GetEnumerator()方法先看foreach的本質(zhì)。(*)北京傳智播客教育泛型集合案例:把分揀奇偶數(shù)的程序用泛型實(shí)現(xiàn)。List<int>練習(xí)1:將int數(shù)組中的奇數(shù)放到一個(gè)新的int數(shù)組中返回。練習(xí)2:從一個(gè)整數(shù)的List<int>中取出最大數(shù)(找最大值)。別用max方法。練習(xí):把123轉(zhuǎn)換為:壹貳叁。Dictionary<char,char>練習(xí):計(jì)算字符串中每種字母出現(xiàn)的次數(shù)(面試題)?!癳toChinaworld”,不區(qū)分大小寫,打印“W2”“e2”“o3”……提示:Dictionary<char,int>,char的很多靜態(tài)方法。char.IsLetter()案例:簡(jiǎn)繁體轉(zhuǎn)換。Dictionary。課下練習(xí):英漢翻譯。WinForm做。發(fā)英漢詞典txt。課下練習(xí):火星文翻譯器。發(fā)字庫。(作業(yè)。)案例:編寫一個(gè)函數(shù)進(jìn)行日期轉(zhuǎn)換,將輸入的中文日期轉(zhuǎn)換為阿拉伯?dāng)?shù)字日期,比如:二零一二年十二月月二十一日要轉(zhuǎn)換為2012-12-21。(處理“十”的問題:1.*月十日;2.*月十三日;3.*月二十三日;4.*月三十日;)4中情況對(duì)“十”的不同翻譯。1→10;2→1;3→不翻譯;4→0【年部分不可能出現(xiàn)’十’,都出現(xiàn)在了月與日部分?!繙y(cè)試數(shù)據(jù):二零一二年十二月二十一日(2012年12月21日)、二零零九年七月九日、二零一零年十月二十四日、二零一零年十月二十日北京傳智播客教育補(bǔ)充(裝箱、拆箱):box、unbox比較泛型集合List<T>與ArrayList的性能。循環(huán)增加整數(shù)、引用類型比較性能。(裝箱、拆箱)見備注。//1.裝箱、拆箱必須是:值類型→引用類型或引用類型→值類型。

//object,接口。值類型是可以實(shí)現(xiàn)接口。

//Personp=newStudent();//這個(gè)叫隱式類型轉(zhuǎn)換,不叫裝箱。

//Studentstu=(Student)p;//這個(gè)叫顯示類型轉(zhuǎn)換,不叫拆箱。

//int類型為什么能裝箱到object類型,但不能裝箱到string類型或Person類型,

//因?yàn)閛bject類型是int類型的父類。

//2.拆箱時(shí),必須用裝箱時(shí)的類型來拆箱

//裝箱時(shí)如果是int,拆箱必須用int,不能用double

//3.方法重載時(shí),如果具有該類型的重載,那么就不叫拆箱或裝箱。intn=10;

Console.WriteLine(n);//沒有發(fā)生裝箱,因?yàn)榉椒ㄖ剌d。//4.接口與值類型之間的裝箱與拆箱。

//5.字符串連接:1+”aaa”+100,發(fā)生了幾次裝箱

//string.Concat(s1,s2,n3,d4);判斷是否發(fā)生了裝箱,及次數(shù)。北京傳智播客教育代碼閱讀//1.以下代碼進(jìn)行了幾次裝箱?(3次裝箱,1次拆箱,注意數(shù)字與字符串相加,最終調(diào)用的是string.Contact())intn=10;objecto=n;n=100;Console.WriteLine(n+","+(int)o);Console.ReadKey();//通過Reflector查看,并說明為什么?//2.以下代碼裝箱了?如果發(fā)生了裝箱,請(qǐng)說明哪句代碼裝箱了,為什么?(*)intn=10;strings1=n.ToString();strings2=n.GetType().ToString();//由于GetType()不是虛方法子類沒有重寫,所以調(diào)用時(shí)需要通過object來調(diào)用,查看ILConsole.WriteLine(s1+"\t\t\t"+s2);//3.以下代碼有沒有發(fā)生裝箱,如果有,幾次?strings1="a";intn1=10;doubled1=99.9;objecto=10;strings2="x";strings3=s1+n1+d1+o+s2;Console.WriteLine(s3);Console.ReadKey();北京傳智播客教育var類型推斷北京傳智播客教育自定義泛型(*)使用泛型的好處:類比List<T>與ArrayList對(duì)于值類型與引用類型操作的性能差異(1.性能2.垃圾回收次數(shù)(裝箱拆箱))。GC.CollectionCount(0)已經(jīng)對(duì)第0代垃圾回收的次數(shù)。泛型的目的:還是代碼重用。T:一般叫做“類型參數(shù)”,把數(shù)據(jù)類型作為參數(shù)傳遞。一般用T類表示或者以大寫T開頭的比如:TKey,TValue、TOutput、TResult…泛型,在.net2.0版本才開始引入。泛型類、泛型接口、泛型方法(泛型方法中的類型推斷,參見備注1.)、泛型委托(*)===============使用where關(guān)鍵字進(jìn)行類型約束=====================北京傳智播客教育foreach(*)演示一下。不需要掌握。可枚舉類型(具有GetEnumerator()方法)、枚舉器(具有IEnumerator接口中的成員的類)IEnumerable實(shí)現(xiàn)該接口即為可枚舉類型IEnumerator實(shí)現(xiàn)該接口為枚舉器foreach遍歷類型推斷為object而不是實(shí)際類型,需要實(shí)現(xiàn)泛型版本的接口快捷語法:yieldyieldreturn表達(dá)式y(tǒng)ieldbreak;當(dāng)yield語句所在的方法的返回值為IEnumerable<T>時(shí),表示自動(dòng)生成一個(gè)可迭代類型當(dāng)yield語句所在的方法的返回值為IEnumertor<T>時(shí),表示自動(dòng)生成一個(gè)迭代器通過yield快速為某類型創(chuàng)建正向與反向迭代器演示通過IEnumerator接口遍歷序列。GetEnumerator()方法。foreach遍歷修改數(shù)據(jù)???絕對(duì)不行。//1.foreach循環(huán)是只讀的。不能用來修改數(shù)據(jù)。//2.foreach循環(huán)式只進(jìn)的,并且是一條一條循環(huán)的。北京傳智播客教育神奇的Dictionary自己動(dòng)手寫Dictionary<string,string>。Dictionary性能測(cè)試。為什么速度這么快?查字典為什么能這么快?目錄中記錄了每個(gè)漢字的頁碼,查找的時(shí)候先看漢字的頁碼,再翻到指定的頁就可以非常快速的找到詞條了。Dictionary中有一個(gè)存儲(chǔ)鍵值對(duì)的區(qū)域,這個(gè)區(qū)域的每個(gè)存儲(chǔ)單元有地址編號(hào),根據(jù)hashCode算法,計(jì)算key的值的鍵值對(duì)應(yīng)該存儲(chǔ)的地址,將鍵值對(duì)放入指定的地址即可。查找的時(shí)候首先計(jì)算key的地址,就可以找到數(shù)據(jù)了。根據(jù)key找房間號(hào),而不是逐個(gè)房間找。(*)為什么Dictionary這么快:當(dāng)把一個(gè)kvp,采用一個(gè)固定算法(散列算法)根據(jù)key來計(jì)算這個(gè)kvp存放的地址。取的時(shí)候也是根據(jù)要找的key可以快速算出kvp存放的地址。散列算法。案例見備注1.北京傳智播客教育文件操作常用相關(guān)類File//操作文件,靜態(tài)類,對(duì)文件整體操作??截?、刪除、剪切等。Directory//操作目錄(文件夾),靜態(tài)類。DirectoryInfo//文件夾的一個(gè)“類”,用來描述一個(gè)文件夾對(duì)象(獲取指定目錄下的所有目錄時(shí)返回一個(gè)DirectoryInfo數(shù)組。)FileInfo//文件類,用來描述一個(gè)文件對(duì)象。獲取指定目錄下的所有文件時(shí),返回一個(gè)FileInfo數(shù)組。Path//對(duì)文件或目錄的路徑進(jìn)行操作(很方便)【字符串】Stream//文件流,抽象類。FileStream//文件流,MemoryStream(內(nèi)存流),NetworkStream(網(wǎng)絡(luò)流)StreamReader//快速讀取文本文件StreamWriter//快速寫入文本文件GZipStream北京傳智播客教育Path類(對(duì)字符串操作),不用刻意記。目錄和文件操作的命名控件System.IOstringChangeExtension(stringpath,stringextension)(*)修改文件的后綴,“修改”支持字符串層面的,沒有真的給文件改名strings=Path.ChangeExtension(@"C:\temp\F3.png","jpg")stringCombine(stringpath1,stringpath2)將兩個(gè)路徑合成一個(gè)路徑,比用+好,可以方便解決不加斜線的問題,自動(dòng)處理路徑分隔符的問題strings=bine(@"c:\temp","a.jpg")stringGetDirectoryName(stringpath)(*)得到文件的路徑名。Path.GetDirectoryName(@"c:\temp\a.jpg")stringGetExtension(stringpath)得到文件的擴(kuò)展名stringGetFileName(stringpath)得到文件路徑的文件名部分stringGetFileNameWithoutExtension(stringpath)得到去除擴(kuò)展名的文件名stringGetFullPath(stringpath)得到文件的全路徑??梢愿鶕?jù)相對(duì)路徑獲得絕對(duì)路徑。stringGetTempFileName()得到一個(gè)唯一的臨時(shí)文件名(*)stringGetTempPath()得到臨時(shí)文件夾的路徑(*)北京傳智播客教育操作目錄(Directory)資料管理器為了實(shí)現(xiàn)目錄樹,所以要掌握讀取目錄的類D

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(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)論