




版權(quán)說(shuō)明:本文檔由用戶(hù)提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、第二章 C程序設(shè)計(jì)基礎(chǔ)1第一個(gè)C#程序Hello,World!創(chuàng)建控制臺(tái)應(yīng)用程序完整對(duì)象路徑命名空間名.類(lèi)名例如,如何訪(fǎng)問(wèn)System.Text.StringBuilder類(lèi)?System.Text.StringBuilder using System.Text;Console.WriteLine(“Hello,World!”);調(diào)試運(yùn)行F5, 非調(diào)試運(yùn)行CtrlF5(忽略斷點(diǎn))2CTS(Common Type System)是一個(gè)所有.NET語(yǔ)言都支持的數(shù)據(jù)類(lèi)型(或者說(shuō)中間語(yǔ)言(IL)中使用的預(yù)定義數(shù)據(jù)類(lèi)型)的集合,確保這些語(yǔ)言可以相互傳送數(shù)據(jù),體現(xiàn)了.NET語(yǔ)言的互操作性。 值類(lèi)型直接存儲(chǔ)
2、其值,存儲(chǔ)在堆棧Stack中;而引用類(lèi)型存儲(chǔ)對(duì)其值的內(nèi)存地址的引用,存儲(chǔ)在運(yùn)行庫(kù)托管堆heap中。我們必須在設(shè)計(jì)類(lèi)型的時(shí)候就決定類(lèi)型實(shí)例的行為。這種決定非常重要,用CLR via C#作者Jeffrey Richter的話(huà)來(lái)說(shuō),“不理解引用類(lèi)型和值類(lèi)型區(qū)別的程序員將會(huì)給代碼引入詭異的bug和性能問(wèn)題(I believe that a developer who misunderstands the difference between reference types and value types will introduce subtle bugs and performance issue
3、s into their code.)”。這就要求我們正確理解和使用值類(lèi)型和引用類(lèi)型。關(guān)于正確理解和使用值類(lèi)型和引用類(lèi)型,參見(jiàn)C的值類(lèi)型和引用類(lèi)型3具體的值類(lèi)型和引用類(lèi)型見(jiàn)課本P31 P38C數(shù)據(jù)類(lèi)型不過(guò)是CTS類(lèi)型的別名而已。如,int只不過(guò)是System.Int32的馬甲(別名)而已即int i; 可以用 System.Int32 i; 代替Framework Design Guidelines一書(shū)中說(shuō):我們要避免在標(biāo)志符中使用語(yǔ)言特有的名字(別名)來(lái)稱(chēng)呼它們。因?yàn)閯e名沒(méi)有增加任何價(jià)值,反而引起了大量的混淆。所以,常用的Convert.ToInt32()而不是ToInt(),Convert
4、.ToInt64()而不是ToLong()。 4C#的命名規(guī)范參見(jiàn) (VS.80).aspx標(biāo)識(shí)符 大小寫(xiě)方式 示例 類(lèi)PascalAppDomain 接口PascalIDisposable 方法PascalToString 命名空間PascalSystem.Drawing 參數(shù)CameltypeName 屬性PascalBackColor 枚舉類(lèi)型PascalErrorLevel 枚舉值PascalFatalError 事件PascalValueChanged 異常類(lèi)PascalWebException 只讀的靜態(tài)字段PascalRedValue 5裝箱boxing 拆箱unboxing裝箱
5、將一個(gè)值類(lèi)型實(shí)例轉(zhuǎn)換為一個(gè)相同內(nèi)容的引用類(lèi)型實(shí)例當(dāng)想把值類(lèi)型實(shí)例作為某方法(參數(shù)定義為引用類(lèi)型)的參數(shù)時(shí),裝箱發(fā)生基于CLR的語(yǔ)言隱藏了裝箱過(guò)程,程序員不需顯式轉(zhuǎn)換,但帶來(lái)性能上的問(wèn)題例:int i = 1; object o = i; / boxing int j = (int) o; / unboxing 拆箱裝箱的逆過(guò)程,需顯式轉(zhuǎn)換如果應(yīng)用程序頻繁地把值類(lèi)型變量作為對(duì)象處理,最好最初使用引用類(lèi)型聲明。 6類(lèi)型轉(zhuǎn)換隱式轉(zhuǎn)換編譯器自動(dòng)進(jìn)行byte bData = 20; int iCount = bData; int iCount = 20; byte bData = iCount ;編譯通
6、過(guò)報(bào)錯(cuò),為什么?顯式轉(zhuǎn)換上面的錯(cuò)誤怎么修改才能編譯通過(guò)?int iCount = 20; byte bData = (byte)iCount ;但是,顯示轉(zhuǎn)換時(shí)可能會(huì)發(fā)生截?cái)嗷蛞绯觥?強(qiáng)制轉(zhuǎn)換數(shù)值字符串?dāng)?shù)值,如,”123”123Convert類(lèi):將一個(gè)基本數(shù)據(jù)類(lèi)型轉(zhuǎn)換為另一個(gè)基本數(shù)據(jù)類(lèi)型 string str = 123;int i = Convert.ToInt32(str);Console.WriteLine(“Int32: 0”, i);Parse方法: 將數(shù)字的字符串表示形式轉(zhuǎn)換為它的等效 32 位有符號(hào)整數(shù)。一個(gè)指示操作是否成功的返回值。 string str = 123;Int32
7、 int32Val;Int32.TryParse(str, out int32Val);Console.WriteLine(Int32: 0, int32Val);數(shù)值數(shù)值字符串,如,123 ” 123 ”Convert.ToString()方法各數(shù)值類(lèi)型的ToString()方法8String to DateTime string str = 2008-2-10 11:00:00;DateTime dt = new DateTime();dt = DateTime.Parse(str);Console.WriteLine(DateTime: 0, dt);DateTime to String
8、 dt = System.DateTime.Now;String MyString;MyString = dt.ToString();Console.WriteLine(DateTime: 0, dt);9字符串常用操作字符串常用操作Length屬性、ToCharArray()方法(打散)、SubString()方法(截?。?、IndexOf()(字符匹配)、PadLeft()(填充)、Replace()、Splite()、Format()、Concat()、Join()等System.Text.StringBuilder類(lèi):4個(gè)以上字符串連接時(shí),更高的性能string returnNumber
9、 = ;for(int i = 0; i1000; i+) returnNumber = returnNumber + i.ToString(); String 對(duì)象一旦生成不可改變(Immutable).每次使用System.String類(lèi)中的方法時(shí),都要在內(nèi)存中創(chuàng)建一個(gè)新的字符串對(duì)象,而且為該新對(duì)象分配新的空間。原來(lái)的內(nèi)存空間等待垃圾回收器回收。10String returnNumber = ;StringBuilder sb = new StringBuilder();DateTime startDateTimeString;DateTime startDateTimeStringBui
10、lder;TimeSpan ts;startDateTimeString = DateTime.Now;returnNumber = ; for (int i = 0; i 10000; i+) returnNumber = returnNumber + i.ToString(); ts = DateTime.Now.Subtract(startDateTimeString); Console.WriteLine(String: 0, ts.Milliseconds); startDateTimeStringBuilder = DateTime.Now; for (int i = 0; i 1
11、0000; i+) sb.Append(i.ToString(); returnNumber = sb.ToString(); ts = DateTime.Now.Subtract(startDateTimeStringBuilder); Console.WriteLine(StringBuilder:0, ts.Milliseconds);運(yùn)行結(jié)果:String: 359StringBuilder: 1511字符串比較(=、Equals or CompareTo?)Equals比較兩個(gè)對(duì)象是否相等,即兩個(gè)對(duì)象是否包含相同的內(nèi)容也就是比較引用類(lèi)型是否是對(duì)同一個(gè)對(duì)象的引用 equals操作表示的
12、兩個(gè)變量是否是對(duì)同一個(gè)對(duì)象的引用,即堆中的內(nèi)容是否相同。 =比較基本數(shù)據(jù)類(lèi)型,如果兩個(gè)值相同,則結(jié)果為true 比較引用時(shí),如果引用指向內(nèi)存中的同一對(duì)象,結(jié)果為true=操作比較的是兩個(gè)變量的值是否相等,對(duì)于引用型變量表示的是兩個(gè)變量在堆中存儲(chǔ)的地址是否相同,即棧中的內(nèi)容是否相同。 CompareTo相等返回012class Test static void Main(string args) / Create two equal but distinct strings string a = new string(new char h, e, l, l, o ); string b = ne
13、w string(new char h, e, l, l, o ); Console.WriteLine(a = b); Console.WriteLine(a.Equals(b); / Now lets see what happens with the same tests but / with variables of type object object c = a; object d = b; Console.WriteLine(c = d); Console.WriteLine(c.Equals(d); 字符串是一個(gè)特殊的引用型類(lèi)型,在C#語(yǔ)言中,重載了string 對(duì)象的很多方法
14、方法(包括equals()方法),使string對(duì)象用起來(lái)就像是值類(lèi)型一樣。 TrueTrueFalseTrue13=、Equals or CompareTo?對(duì)只關(guān)心內(nèi)容的引用類(lèi)型直接使用Equals也可以使用=,但一定要做轉(zhuǎn)化,比如ToString()方法對(duì)值類(lèi)型,使用可讀性較好的14集合一定要謹(jǐn)慎選擇 System.Collections 類(lèi) 當(dāng)需要大小可按需動(dòng)態(tài)增加,并希望通過(guò)索引來(lái)進(jìn)行訪(fǎng)問(wèn)的數(shù)組的時(shí)候,使用ArrayList.當(dāng)需要一個(gè)能實(shí)現(xiàn)后進(jìn)先出的集合時(shí),使用Stack.當(dāng)需要一個(gè)先進(jìn)先出的集合時(shí),使用Queue.當(dāng)需要一個(gè)可以按Key值來(lái)查詢(xún)的數(shù)組是,使用Hashtable.當(dāng)
15、需要一個(gè)按順序排列的集合時(shí),SortedList.15C#的控制結(jié)構(gòu)foreach語(yǔ)句,允許迭代(iterates)某個(gè)集合(Collection)類(lèi)型內(nèi)的所有元素string arrString = Tom,Jack,Mickey;foreach (string s in arrString) Console.WriteLine(s);int arrList = 1,2,3,4;foreach (int i in arrList) Console.WriteLine(i);for語(yǔ)句和foreach語(yǔ)句的區(qū)別:for的代碼塊中可以更改迭代元素的值,而foreach不能foreach比f(wàn)or有
16、更快的執(zhí)行效率16類(lèi)與Java類(lèi)基本相同C類(lèi)內(nèi)可包含字段( Attribute )、方法和屬性( Property )屬性使類(lèi)能夠以一種公開(kāi)的方法獲取和設(shè)置值,同時(shí)隱藏實(shí)現(xiàn)或驗(yàn)證代碼,如 class TimePeriod private double seconds; public double Hours get return seconds / 3600; set seconds = value * 3600; 17class Program static void Main() TimePeriod t = new TimePeriod(); / Assigning the Hours
17、property導(dǎo)致 set 訪(fǎng)問(wèn)器(accessor)被調(diào)用. t.Hours = 24; / Evaluating the Hours property導(dǎo)致get訪(fǎng)問(wèn)器( accessor)被調(diào)用. System.Console.WriteLine(Time in hours: + t.Hours); 盡量不要公開(kāi)字段,屬性是更好的選擇。18Property 屬性許多類(lèi)型都定義了可以被檢索或者修改的狀態(tài)信息。通常情況下,這些狀態(tài)信息作為類(lèi)型的字段成員實(shí)現(xiàn)。例如public sealed class Employee public String Name; /員工姓名 public Int3
18、2 Age; /員工年齡 用下述形式的代碼很容易地獲得或者設(shè)置對(duì)象的狀態(tài)信息:Employee e = new Employee(); e.Name = Jeffrey Richter; /設(shè)置員工姓名e.Age = 41; /設(shè)置員工年齡Console.WriteLine(e.Name); /顯示 Jeffrey Richter但是,開(kāi)發(fā)人員可以使用下述形式的代碼很容易地破壞對(duì)象Employee:e.Age=-5; /怎么會(huì)有人是-5歲呢?19于是,將前述代碼重寫(xiě)為下述形式:public sealed class Employee private String m_Name; /私有字段 p
19、rivate Int32 m_Age; /私有字段 public String GetName() return(m_Name); public void SetName(String value) m_Name = value; public Int32 GetAge() return(m_Age); public void SetAge(Int32 value) if (value 0) throw new ArgumentOutOfRangeException(value, value.ToString(), The value must be greater than or equal
20、 to 0); m_Age = value; 20e.SetName(Jeffrey Richter); /更新員工姓名String EmployeeName = e.GetName();/檢索員工姓名e.SetAge(41); /更新員工年齡e.SetAge(-5); /拋出ArgumentOutOfRangeException異常Int32 EmployeeAge = e.GetAge();/檢索員工年齡我們看到數(shù)據(jù)密封有兩個(gè)缺點(diǎn):首先,因?yàn)椴坏貌粚?shí)現(xiàn)額外的方法,所以必須編寫(xiě)更多的代碼;其次,類(lèi)型的用戶(hù)必須調(diào)用方法,而不能簡(jiǎn)單地引用一個(gè)單獨(dú)的字段名。就個(gè)人而言,我認(rèn)為這些缺點(diǎn)微不足道。盡管
21、如此,編程語(yǔ)言和CLR還是提供了一種稱(chēng)為屬性的機(jī)制減輕了第一個(gè)缺點(diǎn)的影響并完全消除了第二個(gè)缺點(diǎn)的影響。21public sealed class Employee private String _Name; / 添加_避免命名沖突 private Int32 _Age; / 添加_避免命名沖突 public String Name get return(_Name); set _Name = value; /關(guān)鍵字value通常表示新設(shè)的值 public Int32 Age get return(_Age); set if (value 0) /關(guān)鍵字value通常表示新設(shè)的值 throw n
22、ew ArgumentOutOfRangeException(value, value.ToString(), The value must be greater than or equal to 0); _Age = value; 22于是,我們可以e.Name = Jeffrey Richter; /“設(shè)置”員工姓名String EmployeeName = e.Name; /“獲取”員工姓名e.Age = 41; /“設(shè)置”員工年齡e.Age = -5; /拋出ArgumentOutOfRangeException異常Int32 EmployeeAge = e.Age; /“獲取”員工年
23、齡23編譯器編譯這個(gè)類(lèi)型時(shí),編譯器會(huì)發(fā)現(xiàn)其中定義的Name和Age兩個(gè)屬性。因?yàn)檫@兩個(gè)屬性都有g(shù)et和set訪(fǎng)問(wèn)器方法,所以編譯器將在Employee類(lèi)型中生成4個(gè)get、set方法定義,就像第22頁(yè)ppt所示24C# 接口 - what is interfaceAn interface looks like a class, but has no implementation. The only thing it contains are definitions of events, indexers, methods and/or properties. The reason interf
24、aces only provide definitions is because they are inherited by classes and structs, which must provide an implementation for each interface member defined.25C#接口一個(gè)類(lèi)實(shí)現(xiàn)了某個(gè)接口,就相當(dāng)于聲明其能夠完成某項(xiàng)工作。比如一個(gè)類(lèi)實(shí)現(xiàn)了IComparable接口,就相當(dāng)于聲明了它可以完成對(duì)自身實(shí)例進(jìn)行比較的工作。 舉個(gè)例子:某公司有一臺(tái)特殊打印機(jī),還可以使用一年,一年后可能換為另一種打印機(jī),這兩種打印機(jī)都特殊而貴.所以現(xiàn)在的程序希望換了打印
25、機(jī)后也少量修改就可用.方法:1,定義一個(gè)打印機(jī)接口.2,定義打印機(jī)類(lèi)A,B,分別實(shí)現(xiàn)此接口.3,定義一個(gè)工廠(chǎng)類(lèi),在類(lèi)中可選擇返回由A實(shí)現(xiàn)的接口,或者由B實(shí)現(xiàn)的接口.4,在程序中使用打印機(jī)時(shí),就可以使用工廠(chǎng)類(lèi)來(lái)調(diào)用打印機(jī),而不需要知道具體的是什么打印機(jī).如果打印機(jī)換了,只需要修改工廠(chǎng)類(lèi)就行了.如果有一千個(gè)地方都調(diào)用過(guò)打印機(jī),就不需要一個(gè)一個(gè)修改.修改一個(gè)地方就行了.接口充當(dāng)一個(gè)隔離層的作用.26interface IPrint bool PrintData(string data); class CanonPrint : IPrint public virtual bool PrintData(string data) /具體業(yè)務(wù)邏輯 Console.WriteLine(data); return true; class HPPrint : IPrint public virtual bool PrintData(string data) /具體業(yè)務(wù)邏輯略 Console.WriteLine(data); return true; 27class PrintFactory public IPrin
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶(hù)所有。
- 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ì)用戶(hù)上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶(hù)上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶(hù)因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025年高性能特種合金材料項(xiàng)目合作計(jì)劃書(shū)
- 同城工地出售合同范本
- 合作建材協(xié)議合同范例
- 共同投資協(xié)議合同范本
- 賣(mài)地買(mǎi)房合同范本
- 卷宗管理服務(wù)合同范例
- 合同范本庫(kù)編制說(shuō)明
- 資質(zhì)借用合同范本
- 農(nóng)田煙桿出售合同范本
- 幼兒園塑膠地板購(gòu)銷(xiāo)施工合同范本
- 2025年湖南環(huán)境生物職業(yè)技術(shù)學(xué)院?jiǎn)握新殬I(yè)技能測(cè)試題庫(kù)及答案一套
- 14 文言文二則 學(xué)弈 教學(xué)設(shè)計(jì)-2024-2025學(xué)年語(yǔ)文六年級(jí)下冊(cè)統(tǒng)編版
- Unit 4 Eat Well(大單元教學(xué)設(shè)計(jì))2024-2025學(xué)年七年級(jí)英語(yǔ)下冊(cè)同步備課系列(人教版2024)
- 2024-2030年中國(guó)游戲直播行業(yè)市場(chǎng)深度分析及投資策略研究報(bào)告
- 統(tǒng)編版小學(xué)語(yǔ)文六年級(jí)下冊(cè)第四單元《理想和信念》作業(yè)設(shè)計(jì)
- 2025年春季學(xué)期學(xué)校工作計(jì)劃及安排表
- 化驗(yàn)班組安全培訓(xùn)
- 第一課+追求向上向善的道德【中職專(zhuān)用】中職思想政治《職業(yè)道德與法治》高效課堂(高教版2023·基礎(chǔ)模塊)
- 生豬屠宰獸醫(yī)衛(wèi)生檢驗(yàn)人員理論考試題庫(kù)及答案
- 教師的五重境界公開(kāi)課教案教學(xué)設(shè)計(jì)課件案例試卷
- (新版)傳染病防治監(jiān)督試題庫(kù)(含答案)
評(píng)論
0/150
提交評(píng)論