版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認(rèn)領(lǐng)
文檔簡介
1、dotnet02C#程序設(shè)計基礎(chǔ)第二章 C程序設(shè)計基礎(chǔ)dotnet02C#程序設(shè)計基礎(chǔ)第一個第一個C#程序程序Hello,World!n創(chuàng)建控制臺應(yīng)用程序創(chuàng)建控制臺應(yīng)用程序n完整對象路徑命名空間名完整對象路徑命名空間名.類名類名n例如,如何訪問例如,如何訪問System.Text.StringBuilder類?類?System.Text.StringBuilder using System.Text;nConsole.WriteLine(“Hello,World!”);n調(diào)試運行調(diào)試運行F5, 非調(diào)試運行非調(diào)試運行CtrlF5(忽略斷點)(忽略斷點)dotnet02C#程序設(shè)計基礎(chǔ)nCTS(C
2、ommon Type System)是一個所有)是一個所有.NET語言都支持的語言都支持的數(shù)據(jù)數(shù)據(jù)類型類型(或者說中間語言(或者說中間語言(IL)中使用的預(yù)定義數(shù)據(jù)類型)的)中使用的預(yù)定義數(shù)據(jù)類型)的集合集合,確,確保這些語言可以相互傳送數(shù)據(jù),體現(xiàn)了保這些語言可以相互傳送數(shù)據(jù),體現(xiàn)了.NET語言的互操作性。語言的互操作性。 n值類型值類型直接存儲其值,存儲在直接存儲其值,存儲在堆棧堆棧Stack中;而中;而引用類型引用類型存儲存儲對其值對其值的內(nèi)存地址的引用的內(nèi)存地址的引用,存儲在運行庫托管,存儲在運行庫托管堆堆heap中。中。n我們必須在設(shè)計類型的時候就決定類型實例的行為。這種決定非常重我們
3、必須在設(shè)計類型的時候就決定類型實例的行為。這種決定非常重要,用要,用CLR via C#作者作者Jeffrey Richter的話的話來說,來說,“不理解引不理解引用類型和值類型區(qū)別的程序員將會給代碼引入詭異的用類型和值類型區(qū)別的程序員將會給代碼引入詭異的bug和性能問題和性能問題(I believe that a developer who misunderstands the difference between reference types and value types will introduce subtle bugs and performance issues into th
4、eir code.)”。這就要求我。這就要求我們正確理解和使用值類型和引用類型。們正確理解和使用值類型和引用類型。n關(guān)于正確理解和使用值類型和引用類型,參見關(guān)于正確理解和使用值類型和引用類型,參見C的值類型和引用類型的值類型和引用類型dotnet02C#程序設(shè)計基礎(chǔ)n具體的值類型和引用類型見課本具體的值類型和引用類型見課本P31 P38nC數(shù)據(jù)類型不過是數(shù)據(jù)類型不過是CTS類型的別名而已。類型的別名而已。n如,如,int只不過是只不過是System.Int32的馬甲(別名)的馬甲(別名)而已而已n即即int i; 可以用可以用 System.Int32 i; 代替代替nFramework De
5、sign Guidelines一書中說:我們要一書中說:我們要避免在標(biāo)志符中使用語言特有的名字(別名)避免在標(biāo)志符中使用語言特有的名字(別名)來稱呼它們。來稱呼它們。因為別名沒有增加任何價值,反而引起了大量的混淆。因為別名沒有增加任何價值,反而引起了大量的混淆。n所以,常用的所以,常用的Convert.ToInt32()而不是而不是ToInt(),Convert.ToInt64()而不是而不是ToLong()。 dotnet02C#程序設(shè)計基礎(chǔ)C#的命名規(guī)范的命名規(guī)范n參見參見 (VS.80).aspxn標(biāo)識符標(biāo)識符 大小寫方式大小寫方式 示例示例 n類類PascalAppDomain n接口
6、接口PascalIDisposable n方法方法PascalToString n命名空間命名空間PascalSystem.Drawing n參數(shù)參數(shù)CameltypeName n屬性屬性PascalBackColor n枚舉類型枚舉類型PascalErrorLevel n枚舉值枚舉值PascalFatalError n事件事件PascalValueChanged n異常類異常類PascalWebException n只讀的靜態(tài)字段只讀的靜態(tài)字段PascalRedValue dotnet02C#程序設(shè)計基礎(chǔ)裝箱裝箱boxing 拆箱拆箱unboxingn裝箱裝箱將一個將一個值類型值類型實例實例
7、轉(zhuǎn)換為轉(zhuǎn)換為一個相同內(nèi)容的一個相同內(nèi)容的引用類型引用類型實例實例當(dāng)想把值類型實例作為某方法(參數(shù)定義為引用類型)的參數(shù)時,當(dāng)想把值類型實例作為某方法(參數(shù)定義為引用類型)的參數(shù)時,裝箱發(fā)生裝箱發(fā)生基于基于CLR的語言隱藏了裝箱過程,程序員不需顯式轉(zhuǎn)換,但帶來的語言隱藏了裝箱過程,程序員不需顯式轉(zhuǎn)換,但帶來性能上的問題性能上的問題例:例:int i = 1; object o = i; / boxing int j = (int) o; / unboxing n拆箱拆箱裝箱的逆過程,需顯式轉(zhuǎn)換裝箱的逆過程,需顯式轉(zhuǎn)換n如果應(yīng)用程序頻繁地把值類型變量作為對象處理,最好最初使用引用如果應(yīng)用程序頻繁地
8、把值類型變量作為對象處理,最好最初使用引用類型聲明。類型聲明。 dotnet02C#程序設(shè)計基礎(chǔ)類型轉(zhuǎn)換類型轉(zhuǎn)換n隱式轉(zhuǎn)換隱式轉(zhuǎn)換編譯器自動進行編譯器自動進行byte bData = 20; int iCount = bData; int iCount = 20; byte bData = iCount ;編譯通過編譯通過報錯,為什么?報錯,為什么?n顯式轉(zhuǎn)換顯式轉(zhuǎn)換上面的錯誤怎么修改才能編譯通過?上面的錯誤怎么修改才能編譯通過?int iCount = 20; byte bData = (byte)iCount ;但是,顯示轉(zhuǎn)換時可能會發(fā)生截斷或溢出。但是,顯示轉(zhuǎn)換時可能會發(fā)生截斷或溢出。d
9、otnet02C#程序設(shè)計基礎(chǔ)n強制轉(zhuǎn)換強制轉(zhuǎn)換數(shù)值字符串?dāng)?shù)值字符串?dāng)?shù)值,如,數(shù)值,如,”123”123nConvert類:類:將一個基本數(shù)據(jù)類型轉(zhuǎn)換為另一個基本數(shù)據(jù)類型將一個基本數(shù)據(jù)類型轉(zhuǎn)換為另一個基本數(shù)據(jù)類型 string str = 123;int i = Convert.ToInt32(str);Console.WriteLine(“Int32: 0”, i);nParse方法方法: 將數(shù)字的字符串表示形式轉(zhuǎn)換為它的等效將數(shù)字的字符串表示形式轉(zhuǎn)換為它的等效 32 位有符號整數(shù)。一個指示操作是否成功的返回值。位有符號整數(shù)。一個指示操作是否成功的返回值。 string str = 123;
10、Int32 int32Val;Int32.TryParse(str, out int32Val);Console.WriteLine(Int32: 0, int32Val);數(shù)值數(shù)值數(shù)值字符串,如,數(shù)值字符串,如,123 ” 123 ”nConvert.ToString()方法方法n各數(shù)值類型的各數(shù)值類型的ToString()方法方法dotnet02C#程序設(shè)計基礎(chǔ)nString to DateTime string str = 2008-2-10 11:00:00;DateTime dt = new DateTime();dt = DateTime.Parse(str);Console.Wr
11、iteLine(DateTime: 0, dt);nDateTime to String dt = System.DateTime.Now;String MyString;MyString = dt.ToString();Console.WriteLine(DateTime: 0, dt);dotnet02C#程序設(shè)計基礎(chǔ)字符串常用操作字符串常用操作n字符串常用操作字符串常用操作Length屬性、ToCharArray()方法(打散)、SubString()方法(截?。?、IndexOf()(字符匹配)、PadLeft()(填充)、Replace()、Splite()、Format()、Conc
12、at()、Join()等nSystem.Text.StringBuilder類:類:4個以上字符串連接時,更高的性能個以上字符串連接時,更高的性能string returnNumber = ;for(int i = 0; i1000; i+) returnNumber = returnNumber + i.ToString(); String 對象一旦生成不可改變(Immutable).每次使用 System.String 類中的方法時,都要在內(nèi)存中創(chuàng)建一個新的字符串對象,而且為該新對象分配新的空間。原來的內(nèi)存空間等待垃圾回收器回收。dotnet02C#程序設(shè)計基礎(chǔ)String returnN
13、umber = ;StringBuilder sb = new StringBuilder();DateTime startDateTimeString;DateTime startDateTimeStringBuilder;TimeSpan ts;startDateTimeString = DateTime.Now;returnNumber = ; for (int i = 0; i 10000; i+) returnNumber = returnNumber + i.ToString(); ts = DateTime.Now.Subtract(startDateTimeString); C
14、onsole.WriteLine(String: 0, ts.Milliseconds); startDateTimeStringBuilder = DateTime.Now; for (int i = 0; i 10000; i+) sb.Append(i.ToString(); returnNumber = sb.ToString(); ts = DateTime.Now.Subtract(startDateTimeStringBuilder); Console.WriteLine(StringBuilder:0, ts.Milliseconds);運行結(jié)果:String: 359Stri
15、ngBuilder: 15dotnet02C#程序設(shè)計基礎(chǔ)字符串比較字符串比較(=、Equals or CompareTo?)nEquals比較兩個比較兩個對象對象是否相等,即兩個對象是否包含是否相等,即兩個對象是否包含相同的內(nèi)容相同的內(nèi)容也就是比較引用類型是否是對同一個對象的引用也就是比較引用類型是否是對同一個對象的引用 equals操作表示的兩個變量是否是對同一個對象的引用,即堆中操作表示的兩個變量是否是對同一個對象的引用,即堆中的內(nèi)容是否相同。的內(nèi)容是否相同。 n=比較比較基本數(shù)據(jù)類型基本數(shù)據(jù)類型,如果兩個,如果兩個值相同值相同,則結(jié)果為,則結(jié)果為true 比較比較引用引用時,如果引用時
16、,如果引用指向內(nèi)存中的同一對象指向內(nèi)存中的同一對象,結(jié)果為,結(jié)果為true=操作比較的是兩個變量的值是否相等,對于引用型變量表示的操作比較的是兩個變量的值是否相等,對于引用型變量表示的是兩個變量在堆中存儲的地址是否相同,即棧中的內(nèi)容是否相同。是兩個變量在堆中存儲的地址是否相同,即棧中的內(nèi)容是否相同。 nCompareTo相等返回相等返回0dotnet02C#程序設(shè)計基礎(chǔ)class Test static void Main(string args) / Create two equal but distinct strings string a = new string(new char h,
17、 e, l, l, o ); string b = new 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); 字符串是一個特殊的引用
18、型類型,在字符串是一個特殊的引用型類型,在C#語言中,重載了語言中,重載了string 對象的很對象的很多方法方法多方法方法(包括包括equals()方法方法),使,使string對象用起來就像是值類型對象用起來就像是值類型一樣。一樣。 TrueTrueFalseTruedotnet02C#程序設(shè)計基礎(chǔ)=、Equals or CompareTo?n對只關(guān)心內(nèi)容的對只關(guān)心內(nèi)容的引用類型引用類型直接使用直接使用Equals也可以使用也可以使用=,但一定要做轉(zhuǎn)化,比如,但一定要做轉(zhuǎn)化,比如ToString()方法方法n對值類型,使用可讀性較好的對值類型,使用可讀性較好的dotnet02C#程序設(shè)計基
19、礎(chǔ)集合集合n一定要謹(jǐn)慎選擇一定要謹(jǐn)慎選擇 System.Collections 類類 當(dāng)需要當(dāng)需要大小可按需動態(tài)增加大小可按需動態(tài)增加,并希望,并希望通過索引來進行通過索引來進行訪問訪問的數(shù)組的時候,使用的數(shù)組的時候,使用ArrayList .當(dāng)需要一個能實現(xiàn)當(dāng)需要一個能實現(xiàn)后進先出后進先出的集合時,使用的集合時,使用Stack.當(dāng)需要一個當(dāng)需要一個先進先出先進先出的集合時,使用的集合時,使用Queue.當(dāng)需要一個可以當(dāng)需要一個可以按按Key值來查詢值來查詢的數(shù)組是,使用的數(shù)組是,使用Hashtable.當(dāng)需要一個當(dāng)需要一個按順序排列按順序排列的集合時的集合時,SortedList.dotne
20、t02C#程序設(shè)計基礎(chǔ)C#的控制結(jié)構(gòu)的控制結(jié)構(gòu)nforeach語句,允許迭代語句,允許迭代(iterates)某個集合某個集合(Collection)類型內(nè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);nfor語句和語句和foreach語句的區(qū)別:語句的區(qū)別:for的代碼塊中可以更改迭代元素的值,而的代
21、碼塊中可以更改迭代元素的值,而foreach不能不能foreach比比for有有更快的執(zhí)行效率更快的執(zhí)行效率dotnet02C#程序設(shè)計基礎(chǔ)類類n與與Java類基本相同類基本相同nC類內(nèi)可包含類內(nèi)可包含字段(字段( Attribute )、方法和、方法和屬性屬性( Property )n屬性屬性使類能夠以一種公開的方法獲取和設(shè)置值,同時隱藏使類能夠以一種公開的方法獲取和設(shè)置值,同時隱藏實現(xiàn)或驗證代碼,如實現(xiàn)或驗證代碼,如 class TimePeriod private double seconds; public double Hours get return seconds / 3600;
22、 set seconds = value * 3600; dotnet02C#程序設(shè)計基礎(chǔ)class Program static void Main() TimePeriod t = new TimePeriod(); / Assigning the Hours property導(dǎo)致導(dǎo)致 set 訪問器訪問器(accessor)被調(diào)用被調(diào)用. t.Hours = 24; / Evaluating the Hours property導(dǎo)致導(dǎo)致get訪問器訪問器( accessor)被調(diào)用被調(diào)用. System.Console.WriteLine(Time in hours: + t.Hours
23、); n盡量不要公開字段,屬性是更好的選擇盡量不要公開字段,屬性是更好的選擇。dotnet02C#程序設(shè)計基礎(chǔ)Property 屬性n許多類型都定義了可以被檢索或者修改的狀態(tài)信息。通常情況下,這些狀態(tài)信息作為類型的字段成員實現(xiàn)。例如npublic sealed class Employee n public String Name; /員工姓名n public Int32 Age; /員工年齡n n用下述形式的代碼很容易地獲得或者設(shè)置對象的狀態(tài)信息:nEmployee e = new Employee(); ne.Name = Jeffrey Richter; /設(shè)置員工姓名ne.Age =
24、41; /設(shè)置員工年齡nConsole.WriteLin); /顯示 Jeffrey Richtern但是,開發(fā)人員可以使用下述形式的代碼很容易地破壞對象Employee:ne.Age=-5; /怎么會有人是-5歲呢?dotnet02C#程序設(shè)計基礎(chǔ)于是,將前述代碼重寫為下述形式:public sealed class Employee private String m_Name; /私有字段 private Int32 m_Age; /私有字段 public String GetName() return(m_Name); public void SetName(String value)
25、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 to 0); m_Age = value; dotnet02C#程序設(shè)計基礎(chǔ)ne.SetName(Jeffrey Richter); /更新員工姓名nString EmployeeName = e.
26、GetName();/檢索員工姓名ne.SetAge(41); /更新員工年齡ne.SetAge(-5); /拋出ArgumentOutOfRangeException異常nInt32 EmployeeAge = e.GetAge();/檢索員工年齡n我們看到數(shù)據(jù)密封有兩個缺點:首先,因為不得不實現(xiàn)額外的方法,所以必須編寫更多的代碼;其次,類型的用戶必須調(diào)用方法,而不能簡單地引用一個單獨的字段名。n就個人而言,我認(rèn)為這些缺點微不足道。盡管如此,編程語言和CLR還是提供了一種稱為屬性的機制減輕了第一個缺點的影響并完全消除了第二個缺點的影響。dotnet02C#程序設(shè)計基礎(chǔ)public seale
27、d 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 new ArgumentOutOfRangeException(value, value.ToString(), The value
28、 must be greater than or equal to 0); _Age = value; dotnet02C#程序設(shè)計基礎(chǔ)n于是,我們可以ne.Name = Jeffrey Richter; /“設(shè)置”員工姓名nString EmployeeName = e.Name; /“獲取”員工姓名ne.Age = 41; /“設(shè)置”員工年齡ne.Age = -5; /拋出ArgumentOutOfRangeException異常nInt32 EmployeeAge = e.Age; /“獲取”員工年齡dotnet02C#程序設(shè)計基礎(chǔ)n編譯器編譯這個類型時,編譯器會發(fā)現(xiàn)其中定義的Name和
29、Age兩個屬性。因為這兩個屬性都有g(shù)et和set訪問器方法,所以編譯器將在Employee類型中生成4個get、set方法定義,就像第22頁ppt所示dotnet02C#程序設(shè)計基礎(chǔ)C# 接口接口 - what is interfacenAn interface looks like a class, but has no implementation. nThe only thing it contains are definitions of events, indexers, methods and/or properties. nThe reason interfaces only p
30、rovide definitions is because they are inherited by classes and structs, which must provide an implementation for each interface member defined.dotnet02C#程序設(shè)計基礎(chǔ)C#接口接口n一個類實現(xiàn)了某個接口,就相當(dāng)于聲明其一個類實現(xiàn)了某個接口,就相當(dāng)于聲明其能夠完成某項工作能夠完成某項工作。比如一。比如一個類實現(xiàn)了個類實現(xiàn)了IComparable接口,就相當(dāng)于聲明了它可以完成對自身實接口,就相當(dāng)于聲明了它可以完成對自身實例進行比較的工作。例進行比較
31、的工作。 n舉個例子舉個例子:某公司有一臺特殊打印機某公司有一臺特殊打印機,還可以使用一年還可以使用一年,一年后可能換為另一年后可能換為另一種打印機一種打印機,這兩種打印機都特殊而貴這兩種打印機都特殊而貴.所以現(xiàn)在的程序希望換了打印機所以現(xiàn)在的程序希望換了打印機后也少量修改就可用后也少量修改就可用.方法方法:1,定義一個打印機接口定義一個打印機接口.2,定義打印機類定義打印機類A,B,分別實現(xiàn)此接口分別實現(xiàn)此接口.3,定義一個工廠類定義一個工廠類,在類中可選擇返回由在類中可選擇返回由A實現(xiàn)的接口實現(xiàn)的接口,或者由或者由B實現(xiàn)的接實現(xiàn)的接口口.4,在程序中使用打印機時在程序中使用打印機時,就可以
32、使用工廠類來調(diào)用打印機就可以使用工廠類來調(diào)用打印機,而不需要知而不需要知道具體的是什么打印機道具體的是什么打印機.如果打印機換了如果打印機換了,只需要修改工廠類就行只需要修改工廠類就行了了.如果有一千個地方都調(diào)用過如果有一千個地方都調(diào)用過打印機打印機,就不需要一個一個修改就不需要一個一個修改.修改一個地方就行了修改一個地方就行了.接口充當(dāng)一個隔離接口充當(dāng)一個隔離層的作用層的作用.dotnet02C#程序設(shè)計基礎(chǔ)interface IPrint bool PrintData(string data); class CanonPrint : IPrint public virtual bool PrintData(string data) /具體業(yè)務(wù)邏輯具體業(yè)務(wù)邏輯 Console.WriteLine(data); return true; class HPPrint : IPrint public virtual bool PrintData(string data) /具體業(yè)務(wù)邏輯略具體業(yè)務(wù)邏輯略 Console.WriteLine(data); return tr
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025標(biāo)準(zhǔn)的特約經(jīng)銷商合同
- 2025安徽省合肥市勞動合同范本
- 2025天津工業(yè)大學(xué)技術(shù)合同審批表
- 地產(chǎn)項目開發(fā)建設(shè)合同
- 房地產(chǎn)銷售代理合同樣本
- 大數(shù)據(jù)分析平臺共建合同
- 技能培訓(xùn)場地租賃合同
- 建筑施工勞務(wù)大包合同年
- 裝修意外免責(zé)合同范本
- 建筑工程意向合同協(xié)議書
- GB/T 21369-2024火力發(fā)電企業(yè)能源計量器具配備和管理要求
- 2025年全體員工安全意識及安全知識培訓(xùn)
- 2025警察公安派出所年終總結(jié)工作匯報
- 機動車檢測站新?lián)Q版20241124質(zhì)量管理手冊
- 2024年決戰(zhàn)行測5000題言語理解與表達(培優(yōu)b卷)
- 中國游戲發(fā)展史課件
- 2025年慢性阻塞性肺疾病全球創(chuàng)議GOLD指南修訂解讀課件
- 第三單元名著導(dǎo)讀《駱駝祥子》整本書閱讀教學(xué)設(shè)計+2023-2024學(xué)年統(tǒng)編版語文七年級下冊
- 工程數(shù)學(xué)試卷及答案
- 《PLC應(yīng)用技術(shù)(西門子S7-1200)第二版》全套教學(xué)課件
- 第01講 直線的方程(九大題型)(練習(xí))
評論
0/150
提交評論