




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
1、C# 程序設(shè)計(jì)第5章 類和對(duì)象n面向?qū)ο蟮幕靖拍蠲嫦驅(qū)ο蟮幕靖拍?n類和對(duì)象的定義及類的成員類和對(duì)象的定義及類的成員 n構(gòu)造函數(shù)與析構(gòu)函數(shù)構(gòu)造函數(shù)與析構(gòu)函數(shù)n方法重載與運(yùn)算符重載方法重載與運(yùn)算符重載n索引器索引器5.1 面向?qū)ο蟮幕靖拍?.1.1 什么是面向?qū)ο蟪绦蛟O(shè)計(jì)方法面向過程的設(shè)計(jì)方法暴露出越來越多的不足,主要有: (1)功能與數(shù)據(jù)分離,不符合人們對(duì)現(xiàn)實(shí)世界的認(rèn)識(shí),而且要保持功能與數(shù)據(jù)的相容也十分困難。 (2)基于模塊的設(shè)計(jì)方式,導(dǎo)致軟件修改困難。 (3)自頂向下的設(shè)計(jì)方法,限制了軟件的可重用性,降低了開發(fā)效率,也導(dǎo)致最后開發(fā)出來的系統(tǒng)難以維護(hù)。5.1.1 什么是面向?qū)ο蟪绦蛟O(shè)計(jì)方
2、法面向?qū)ο蟪绦蛟O(shè)計(jì)是將數(shù)據(jù)和對(duì)數(shù)據(jù)的操作視為一個(gè)相互依賴、不可分割的整體,采用數(shù)據(jù)抽象和信息隱蔽技術(shù),可以簡化現(xiàn)實(shí)世界中大多數(shù)問題的求解過程。面向?qū)ο蟪绦蛟O(shè)計(jì)具有三大特征:封裝、繼承和多態(tài)性。 封裝是將數(shù)據(jù)和處理數(shù)據(jù)的方法捆綁在一起,外部對(duì)數(shù)據(jù)的操作要通過合法途徑調(diào)用被封裝在內(nèi)部的處理數(shù)據(jù)方法,才能對(duì)數(shù)據(jù)進(jìn)行操作。封裝可以有效地保證數(shù)據(jù)的安全性,并能隱藏了類的實(shí)現(xiàn)細(xì)節(jié),程序員使用時(shí)不需要知道類是如何實(shí)現(xiàn)的,只要知道其所提供的公有成員進(jìn)行操作就行了。 1封裝繼承是指一個(gè)新定義的類通過另一個(gè)類得到,在擁有了另一個(gè)類的所有特征的基礎(chǔ)上,加入新類所特有的特征。兩個(gè)類之間就具有了繼承關(guān)系。被繼承的類稱為
3、基類或父類,繼承了父類的類稱為派生類或子類。 2繼承 多態(tài)是指同一個(gè)消息或操作作用于不同的對(duì)象,可以有不同的解釋,產(chǎn)生不同的執(zhí)行效果。多態(tài)性包括兩個(gè)方面:編譯多態(tài)性和運(yùn)行時(shí)多態(tài)性。 編譯多態(tài)性指在類中設(shè)計(jì)的多個(gè)方法完成相類似的功能,可以取相同的方法名,以提高程序的可讀性。 3多態(tài)性運(yùn)行時(shí)多態(tài)性是在類繼承的基礎(chǔ)上,方法的一對(duì)多關(guān)系,即指被繼承的類(稱為基類)與繼承它的多個(gè)類(稱為派生類)有相同的方法,執(zhí)行基類方法時(shí)若滿足一定條件,可以使實(shí)際執(zhí)行的是派生類的方法,具體執(zhí)行哪一個(gè)派生類的方法由基類對(duì)象與各派生類對(duì)象的關(guān)系決定。 多態(tài)性可以避免同樣的行為使用不同的方法名,合理運(yùn)用多態(tài)性可使得程序設(shè)計(jì)更
4、趨簡潔合理。3多態(tài)性5.2 類的聲明和對(duì)象的創(chuàng)建類是C#語言支持面向?qū)ο笏枷氲闹匾獧C(jī)制,是C#語言實(shí)現(xiàn)數(shù)據(jù)隱藏和封裝的基本單元,是將一個(gè)數(shù)據(jù)結(jié)構(gòu)與一個(gè)操作緊密地結(jié)合,是實(shí)現(xiàn)面向?qū)ο笃渌匦缘幕A(chǔ)。對(duì)象是類的實(shí)例,用對(duì)象模擬現(xiàn)實(shí)世界中的事物比用一般的數(shù)據(jù)變量更確切。5.2 類的聲明和對(duì)象的創(chuàng)建類是描述一組具有相同屬性(數(shù)據(jù)成員)和行為特征(成員函數(shù))的對(duì)象。在系統(tǒng)實(shí)現(xiàn)中,類是一種共享機(jī)制,提供了類對(duì)象共享的操作實(shí)現(xiàn)。5.2 類的聲明和對(duì)象的創(chuàng)建類是代碼復(fù)用的基本單位,可以實(shí)現(xiàn)抽象數(shù)據(jù)類型、創(chuàng)建對(duì)象、實(shí)現(xiàn)屬性和行為的封裝。 類提供了完整的解決特定問題的能力,因?yàn)轭惷枋隽藬?shù)據(jù)結(jié)構(gòu)(對(duì)象屬性)、算法(
5、對(duì)象行為)和外部接口(消息協(xié)議)。5.2.1 類的定義C#語言在使用類之前必須定義類,再根據(jù)類生成一個(gè)實(shí)例對(duì)象。對(duì)象是一個(gè)動(dòng)態(tài)的概念,Visual C#.NET的程序一般是由若干個(gè)對(duì)象組成。定義類的一般格式如下: 類修飾符 class類名 :基類類名成員定義列表;例:定義一個(gè)公共類,其中包含一個(gè)字段、兩個(gè)方法 public class Student string name; public void SetName(string newName) name = newName; public void ShowName() Console.WriteLine(name); 5.2.2 類的成員
6、C#中類是一種引用類型,其成員可以包括數(shù)據(jù)成員(常量和字段)、方法成員(構(gòu)造函數(shù)、方法、屬性、事件、索引器)及嵌套類型等。類的成員可以在類中聲明或者直接從基類中繼承而來。 5.2.2 類的成員類的具體成員有以下類型:(1)常量:是類的數(shù)據(jù)成員中值始終不變化的量。常量為類的所有對(duì)象所共享,用關(guān)鍵字const修飾。只能為靜態(tài),不用static修飾,默認(rèn)為私有訪問權(quán)限。5.2.2 類的成員類的具體成員有以下類型:(2)字段:是類中的變量。若用關(guān)鍵字static修飾,則該變量由類的所有對(duì)象所共享,使用“類名.字段”方式訪問,若沒有關(guān)鍵字static修飾,為對(duì)象成員,用“對(duì)象名.字段”方式訪問。若用re
7、adonly修飾,對(duì)象初始化時(shí)給定只讀值,且該值以后不能再改變。 5.2.2 類的成員類的具體成員有以下類型:(3)方法:是在類中聲明的函數(shù),為類的對(duì)象提供某個(gè)方面的行為。若用static修飾,該方法屬于類,通過類名調(diào)用。出現(xiàn)最多的靜態(tài)方法是Main()方法,是C#應(yīng)用程序的入口。5.2.2 類的成員類的具體成員有以下類型:(4)屬性:定義一個(gè)類的屬性,通過讀和寫操作訪問這個(gè)屬性。(5)事件:屬性是一種與當(dāng)前類和對(duì)象關(guān)聯(lián),主要用于用方法的形式訪問類的數(shù)據(jù)成員的機(jī)制。 5.2.2 類的成員類的具體成員有以下類型:(6)索引:是另一種與當(dāng)前對(duì)象關(guān)聯(lián),主要用方法的形式方便地訪問類的某一集合數(shù)據(jù)類型成
8、員的機(jī)制。(7)操作符:定義了一個(gè)可以被類的實(shí)例使用的操作符號(hào)。(8)構(gòu)造函數(shù):初始化類的實(shí)例。每新建一個(gè)對(duì)象,都會(huì)自動(dòng)調(diào)用構(gòu)造函數(shù)來完成對(duì)對(duì)象的初始化操作。5.2.2 類的成員類的具體成員有以下類型:(9)析構(gòu)函數(shù):與構(gòu)造函數(shù)相反,在類對(duì)象被釋放之前要調(diào)用析構(gòu)函數(shù)。(10)靜態(tài)構(gòu)造函數(shù):在初始化類本身的時(shí)候調(diào)用。(11)類型:代表類內(nèi)部的類型。5.2.2 類的成員用戶完全可以根據(jù)具體需要定義類的成員,但定義時(shí)需要注意以下幾個(gè)原則: (1)由于構(gòu)造函數(shù)規(guī)定為和類名相同,析構(gòu)函數(shù)名規(guī)定為類名前加一個(gè)“”(波浪線符號(hào)),所以其他成員名就不能命名為和類同名或是類名前加波浪線。 5.2.2 類的成員用
9、戶完全可以根據(jù)具體需要定義類的成員,但定義時(shí)需要注意以下幾個(gè)原則: (2)類中的常量、變量、屬性、事件或類型不能與其他類成員同名。 (3)類中的方法名不能和類中其他成員同名,包括其他非方法成員和其他方法成員。 5.2.2 類的成員用戶完全可以根據(jù)具體需要定義類的成員,但定義時(shí)需要注意以下幾個(gè)原則: (4) 如果沒有顯式指定類成員訪問修飾符,默認(rèn)類型為私有類型修飾符。 5.2.2 類的成員類的每個(gè)成員都需要設(shè)定訪問修飾符,不同的修飾符會(huì)造成對(duì)成員訪問能力不一樣。C#中成員主要有以下幾種: (1)公有成員(2)私有成員。(3) 保護(hù)成員(4) 內(nèi)部成員。例:類的成員訪問修飾符的作用 class B
10、aseClass private int I; protected int J; public int K; public void SetA() I = 1; J = 2; K = 3; ; class ClassA : BaseClass public void SetB() BaseClass BaseA = new BaseClass(); BaseA.I = 11; BaseA.J = 22; BaseA.K = 33; ;class ClassC public void SetB() ClassA BaseA = new ClassA(); BaseA.I = 111; BaseA
11、.J = 221; BaseA.K = 331; 例:靜態(tài)成員與非靜態(tài)成員定義與訪問的區(qū)別 class myClass public int a; static public int b; void Fun1() a=10; b=20; static void Fun2() a=10; b=20; class Test static void Main() myClass A=new myClass(); A.a=10; A.b=10; myClass.a=20; myClass.b=20; 5.2.3 對(duì)象的聲明對(duì)象是類的具體實(shí)現(xiàn),也稱為類的實(shí)例。類是對(duì)一組具有相同特征對(duì)象的抽象描述,所有這
12、些對(duì)象都是這個(gè)類的實(shí)例。在程序設(shè)計(jì)語言中,類是一種數(shù)據(jù)類型,而對(duì)象是該類型的變量,變量名即是某個(gè)具體對(duì)象的標(biāo)識(shí)。類和對(duì)象的關(guān)系相當(dāng)于普通數(shù)據(jù)類型與其變量的關(guān)系。類是一種邏輯抽象概念。5.2.3 對(duì)象的聲明聲明一個(gè)類只是定義了一種新的數(shù)據(jù)類型,對(duì)象聲明才真正創(chuàng)建了這種數(shù)據(jù)類型的物理實(shí)體。由同一個(gè)類創(chuàng)建的各個(gè)對(duì)象具有完全相同的數(shù)據(jù)結(jié)構(gòu),但其數(shù)據(jù)值可能不同。5.2.3 對(duì)象的聲明類的實(shí)例相當(dāng)于一個(gè)變量,創(chuàng)建類實(shí)例的格式及功能如下:類名 實(shí)例名 = new 類名(參數(shù));其中new關(guān)鍵字實(shí)際上是調(diào)用構(gòu)造函數(shù)來完成實(shí)例的初始化工作。例:Student stu1 = new Student ();5.2.
13、3 對(duì)象的聲明創(chuàng)建實(shí)例也可以分成兩步:先定義實(shí)例變量,然后用new關(guān)鍵字創(chuàng)建實(shí)例,如:類名 實(shí)例名; 實(shí)例名 = new 類名(參數(shù)); 例如,使用下述兩條語句:Student stu1;Stu1= new Student ();例:對(duì)象的聲明 public class Student string name; public Student() name = unknown; public void SetName(string newName) name = newName; public void ShowName() Console.WriteLine(name); class Prog
14、ram static void Main() Student stu1; stu1 = new Student(); stu1.SetName(劉兵); stu1.ShowName() ; Console.ReadLine(); 5.3.1 構(gòu)造函數(shù) 構(gòu)造函數(shù)理解成一種特殊的方法成員,并在每次創(chuàng)建對(duì)象時(shí)被自動(dòng)調(diào)用。使用構(gòu)造函數(shù)要注意以下幾個(gè)問題:(1)構(gòu)造函數(shù)的名稱與類名相同; (2)構(gòu)造函數(shù)不聲明返回類型; 5.3 成員函數(shù) 5.3 成員函數(shù) (3)構(gòu)造函數(shù)通常是公有的(使用public訪問限制修飾符聲明),如果聲明為保護(hù)的(protected)或私有的(private),則該構(gòu)造函數(shù)不能用
15、于類的實(shí)例化; (4)構(gòu)造函數(shù)的代碼中通常只進(jìn)行對(duì)象初始化工作,而不應(yīng)執(zhí)行其他操作; (5)構(gòu)造函數(shù)在創(chuàng)建對(duì)象時(shí)被自動(dòng)調(diào)用,不能像其他方法那樣顯式地調(diào)用構(gòu)造函數(shù)。例:默認(rèn)構(gòu)造函數(shù)對(duì)成員初始化 public class Student public string S_name; protected int S_age; protected string S_number; public Student() S_name = Unknown; S_age = 18; S_number =201108501; class Program static void Main() Student stu1
16、; stu1 = new Student(); Console.WriteLine(stu1 .S_name); 例:帶參數(shù)的構(gòu)造函數(shù)對(duì)成員初始化 public class Student public string S_name; protected int S_age; protected string S_number; public Student() S_name = Unknown; S_age = 18; S_number =201108501; public Student(string name,int age,string number) S_name = name; S_
17、age = age; S_number = number; public void Show() Console.WriteLine(S_name); Console.WriteLine(S_age); Console.WriteLine(S_number ); class Program static void Main() Student stu1=new Student();Student stu2 = new Student(“劉兵,20,201005101); stu1.Show(); stu2.Show(); Console.ReadLine(); 例:靜態(tài)構(gòu)造函數(shù) public
18、class Student public string S_name; public static int S_test; static Student() Console.WriteLine(靜態(tài)構(gòu)造函數(shù)之前:0, S_test); S_test+; Console.WriteLine(靜態(tài)構(gòu)造函數(shù)之后:0, S_test); public Student(string name) S_name = name; Console.WriteLine(S_name); Console.WriteLine(使用帶參數(shù)構(gòu)造函數(shù)之前:0, S_test); S_test+; Console.Write
19、Line(使用帶參數(shù)構(gòu)造函數(shù)之后:0, S_test); 例:靜態(tài)構(gòu)造函數(shù) public class Student public string S_name; public static int S_test; static Student() Console.WriteLine(靜態(tài)構(gòu)造函數(shù)之前:0, S_test); S_test+; Console.WriteLine(靜態(tài)構(gòu)造函數(shù)之后:0, S_test); public Student(string name) S_name = name; Console.WriteLine(S_name); Console.WriteLine(使
20、用帶參數(shù)構(gòu)造函數(shù)之前:0, S_test); S_test+; Console.WriteLine(使用帶參數(shù)構(gòu)造函數(shù)之后:0, S_test); class Program static void Main() Student stu1 = new Student(劉兵); Console.ReadLine(); 對(duì)象使用完畢之后,在釋放對(duì)象時(shí)就會(huì)自動(dòng)調(diào)用類的析構(gòu)函數(shù)(Destructor)。在析構(gòu)函數(shù)中,可以釋放在此類中所申請(qǐng)占據(jù)的重要資源 5.3.2 析構(gòu)函數(shù) 5.3.2 析構(gòu)函數(shù) 使用析構(gòu)函數(shù)時(shí)需要注意的問題有: (1)析構(gòu)函數(shù)的名稱與類名相同,但在名稱前面加了一個(gè)符號(hào)“”; (2)析
21、構(gòu)函數(shù)不接受任何參數(shù),也不返回任何值; 5.3.2 析構(gòu)函數(shù) 使用析構(gòu)函數(shù)時(shí)需要注意的問題有: (3)析構(gòu)函數(shù)不能使用任何訪問限制修飾符; (4)析構(gòu)函數(shù)的代碼中通常只進(jìn)行銷毀對(duì)象的工作,而不應(yīng)執(zhí)行其他的操作; (5) 析構(gòu)函數(shù)不能被繼承,也不能被顯式地調(diào)用。例:靜態(tài)構(gòu)造函數(shù) public class Student public string S_name; public static int S_test; public Student(string name) S_name = name; Console.WriteLine(S_name); Console.WriteLine(使用帶參
22、數(shù)構(gòu)造函數(shù)之前:0, S_test); S_test+; Console.WriteLine(使用帶參數(shù)構(gòu)造函數(shù)之后:0, S_test); Student() Console.WriteLine(析構(gòu)函數(shù)被調(diào)用!); class Program static void Main() Student stu1 = new Student(劉兵); Console.ReadLine(); 5.4 屬性屬性是對(duì)字段的擴(kuò)展,是通過屬性訪問函數(shù)來控制對(duì)字段的訪問。屬性訪問函數(shù)包括get訪問函數(shù)和set訪問函數(shù),分別用于對(duì)字段的讀取和修改。 屬性定義格式: 訪問修飾符 屬性名 get return ;
23、set = value; 其中:訪問修飾符:一般屬性的返回類型為public。 返回類型:一般屬性用于訪問某一數(shù)據(jù)成員,這樣返回類型與數(shù)據(jù)成員的類型相同。 get訪問器用于返回與返回類型相同的類型值。 set訪問器主要用于給某一數(shù)據(jù)成員賦值,也可用于其他用途。 存儲(chǔ)空間名一般指某一數(shù)據(jù)成員,也可以是其他變量等。5.4 屬性可以把get訪問函數(shù)和set訪問函數(shù)都視為類的特殊方法成員。其中g(shù)et訪問函數(shù)進(jìn)行讀操作,并通過return語句返回結(jié)果;而set訪問函數(shù)進(jìn)行寫操作,value表示要傳遞給屬性的值。無論是get訪問函數(shù)的返回值,還是傳遞給set訪問函數(shù)的值,其類型都應(yīng)與屬性所聲明的數(shù)據(jù)類型保
24、持一致。 5.4 屬性定義屬性時(shí)可以同時(shí)包含兩個(gè)訪問函數(shù),也可以只聲明一個(gè)訪問函數(shù)。如果只有g(shù)et訪問函數(shù),則表明屬性的值不能被修改;如果只有set訪問函數(shù),則表明屬性的值只能寫不能讀。 例:類的屬性 public class Student private string S_name; public string Name get return S_name; set S_name = value; class Program static void Main() Student stu1 = new Student(); stu1.Name = 劉兵; Console.WriteLine(
25、stu1 .Name ); Console.ReadLine(); 5.4 屬性類成員屬性與一個(gè)一般的類成員變量有很大的不同。主要體現(xiàn)有以下幾個(gè)不同: 1外部程序不需要、也不可能知道內(nèi)部成員變量的具體存儲(chǔ)機(jī)制。 2通過只提供get函數(shù)、只提供set函數(shù)、或者二者都提供,從而設(shè)定成員屬性分別為只讀、只寫、或者可讀可寫。 5.4 屬性3在讀操作或者寫操作時(shí)都可以先進(jìn)行一定的操作,其中包括數(shù)據(jù)校驗(yàn)。 4對(duì)一個(gè)動(dòng)態(tài)成員變量,可以在第一次訪問發(fā)生時(shí)才為其申請(qǐng)資源,這樣會(huì)減少運(yùn)行系統(tǒng)的開銷 屬性使用時(shí)感覺是調(diào)用類的數(shù)據(jù)成員,而屬性實(shí)際上是方法,既是方法就可以有方法的語句,實(shí)現(xiàn)一些控制。 例:使用屬性不直接
26、對(duì)類的數(shù)據(jù)成員操作 public class Student private Student() private static Student studentUser = new Student(); private string netStation = http:/; private string user = liubing; private string secret = 123456; public static Student GetInfo() return studentUser; public string Login set if (value = 888) Console
27、.WriteLine(網(wǎng)站名為: + Station); Console.WriteLine(用戶名: + this.user); Console.WriteLine(用戶密碼: + this.secret); else Console.WriteLine(對(duì)不起,密碼錯(cuò)誤!); 例:使用屬性不直接對(duì)類的數(shù)據(jù)成員操作 static void Main() string studentName = Liu, MM, Jiang, zhuang ; bool login = false; string member; Console.Write(請(qǐng)輸入學(xué)生姓名:); member = Consol
28、e.ReadLine(); for (int i = 0; i =y) return x; else return y; public static void WriteMin(int x, int y) int temp=x; if (xy) temp=y; Console.WriteLine(0和1中的最小值是:2。, x, y, temp ); class Program static void Main() Console.WriteLine(6和8中的最大值是:0。,Test.Max(168,861); Test.WriteMin(168, 861); Console.ReadLin
29、e(); 5.5.2 靜態(tài)和非靜態(tài)的方法 1. 靜態(tài)和非靜態(tài)的方法的區(qū)別 C#的類定義中可以包含兩種方法靜態(tài)的和非靜態(tài)的,使用了static 修飾符的方法為靜態(tài)方法,反之則是非靜態(tài)的。靜態(tài)方法是一種特殊的成員方法,不屬于類的某一個(gè)具體的實(shí)例,非靜態(tài)方法可以訪問類中的任何成員,而靜態(tài)方法只能訪問類中的靜態(tài)成員 class myTestint x;/定義非靜態(tài)成員 xstatic int y;/定義靜態(tài)成員 ystatic int Access() x = 1; /錯(cuò)誤不允許訪問y = 2; /正確允許訪問5.5.2 靜態(tài)和非靜態(tài)的方法 2靜態(tài)方法的調(diào)用 若要調(diào)用的方法是靜態(tài)方法,則用類名“點(diǎn)”出
30、方法,格式為 :類名.方法名( 實(shí)際參數(shù)表 )例如 通過Test類名調(diào)用WriteMin靜態(tài)方法:Test.WriteMin(168, 861);5.5.3 方法重載 static void Main() int i=10, j=20,sum_I; double x=30.3, y=40.4,sum_D; sum_I = total_I(i,j); sum_D = total_D(x, y); Console.WriteLine(sum_I); Console.WriteLine(sum_D); Console.ReadLine(); 5.5.3 方法重載 /兩個(gè)整數(shù)之和 static int
31、 total_I(int pi, int pj) return pi + pj; /兩個(gè)雙精度數(shù)之和 static double total_D(double px, double py) return px + py; 例:函數(shù)重載 class Program static void Main() int i=10, j=20,sum_I; double x=30.3, y=40.4,sum_D; /調(diào)用重載函數(shù)sum_I = total(i,j); sum_D = total(x, y); Console.WriteLine(sum_I); Console.WriteLine(sum_D)
32、; Console.ReadLine(); /函數(shù)重載 static int total(int pi, int pj) return pi + pj; /函數(shù)重載 static double total(double px, double py) return px + py; 1構(gòu)造方法重載 public Student() S_name = Unknown; S_age = 18; S_number =201108501; public Student(string name,int age,string number) S_name = name; S_age = age; S_num
33、ber = number; 2輸入型參數(shù)引用重載 static void add(int x,int y) Console.WriteLine(非ref參數(shù)的方法調(diào)用); Console.WriteLine(x加y的和等于0,x+y); static void add(ref int x, ref int y) Console.WriteLine(ref參數(shù)的方法調(diào)用); Console.WriteLine(x加y的和等于0, x + y); static void Main() int first = 168; int second = 861; add(first ,second ); a
34、dd(ref first, ref second); Console.ReadLine(); 5.6 索引函數(shù)一個(gè)類索引器就好像一個(gè)數(shù)組下標(biāo),可以通過它去訪問類屬性。且使用return語句為get訪問函數(shù)返回結(jié)果,使用value關(guān)鍵字給set訪問函數(shù)傳遞屬性的值。不同之處在于: (1)索引函數(shù)以this關(guān)鍵字加數(shù)組形式的下標(biāo)進(jìn)行定義,并通過數(shù)組形式的下標(biāo)進(jìn)行訪問;索引函數(shù)的定義方法如下:public int thisint index / get and set 訪問函數(shù)5.6 索引函數(shù)(2)索引函數(shù)的get訪問函數(shù)和set訪問函數(shù)帶有參數(shù)(一般為整數(shù)類型或字符串類型); (3)索引函數(shù)不能是
35、靜態(tài)的。例: 輸入型參數(shù)引用重載 private int arr = new int100; public int thisint index get if (index = 100) return 0; else return arrindex; set if (!(index = 100) arrindex = value; static void Main() IndexerClass test = new IndexerClass();test3 = 256; test5 = 1024; for (int i = 0; i =7; i+) System.Console.WriteLin
36、e(第0個(gè)元素的值是:1, i, testi); Console.ReadLine(); 例:索引類型為字符串類型 class DayCollection string days = Sun, Mon, Tues, Wed, Thurs, Fri, Sat ; private int GetDay(string testDay) int i = 0; foreach (string day in days) if (day = testDay) return i; i+; return -1; public int thisstring day get return (GetDay(day);
37、 static void Main() DayCollection week = new DayCollection(); System.Console.WriteLine(weekFri); System.Console.WriteLine(weekMade-up Day); Console.ReadLine(); 5.7 this關(guān)鍵字關(guān)鍵字 C#中的保留字this用于指代一個(gè)變量,且僅限于在類的非靜態(tài)方法成員中使用,包括類的構(gòu)造函數(shù)、非靜態(tài)方法、屬性、索引函數(shù)及事件。this的含義為: (1)在類的構(gòu)造函數(shù)中出現(xiàn)的this作為一個(gè)值類型,表示對(duì)正在構(gòu)造的對(duì)象本身的引用。5.7 this關(guān)
38、鍵字關(guān)鍵字 (2)在類的方法中出現(xiàn)的this作為一個(gè)值類型,表示對(duì)調(diào)用該方法的對(duì)象的引用。(3)在結(jié)構(gòu)的構(gòu)造函數(shù)中出現(xiàn)的this作為一個(gè)變量類型,表示對(duì)正在構(gòu)造的結(jié)構(gòu)的引用。(4)在結(jié)構(gòu)的方法中出現(xiàn)this作為一個(gè)變量類型,表示對(duì)調(diào)用該方法的結(jié)構(gòu)的引用。例:this關(guān)鍵字的使用 class Employee private string name; private string number; private decimal salary = 3000.00m; public Employee(string name, string number) = name; this
39、.number = number; public void printEmployee() Console.WriteLine(姓名: 0n工號(hào): 1, name, number); Console.WriteLine(應(yīng)交稅額: 0:C, Tax.CalcTax(this); public decimal Salary get return salary; class Tax public static decimal CalcTax(Employee E) return 0.08m * E.Salary; class Program static void Main() Employee
40、E1 = new Employee(劉兵, 0757);E1.printEmployee(); Console.ReadLine(); 例:this關(guān)鍵字的使用 class TestF public int x = 5; public void F(int x) Console.WriteLine(類中this.x的值是0, this.x); Console.WriteLine(構(gòu)造函數(shù)中形參x的值0, x); static void Main() int x = 10; TestF a = new TestF(); a.F(x); Console.WriteLine(對(duì)象a中x的值是0, a
41、.x); Console.WriteLine(變量x的值是:0,x); Console.ReadLine(); 5.8 運(yùn)算符重載 C#中允許被重載的操作符包括: (1)一元操作符:+ - ! + - (T) true false (2)二元操作符:+ - * / % & | = != = 和=和=5.8 運(yùn)算符重載 運(yùn)算符重載的定義格式如下: public static operator (參數(shù)列表)例如重截MyPoint類的加法運(yùn)算符:public static MyPoint operator +(MyPoint me,MyPoint you)例:this關(guān)鍵字的使用 publi
42、c class ComplexNumber private int real; private int imaginary; public ComplexNumber() : this(0, 0) public ComplexNumber(int r, int i) real = r; imaginary = i; public override string ToString() return (System.String.Format(0 + 1i, real, imaginary); public static ComplexNumber operator +(ComplexNumber
43、 a, ComplexNumber b) return new ComplexNumber(a.real + b.real, a.imaginary + b.imaginary); public static ComplexNumber operator -(ComplexNumber a, ComplexNumber b) return new ComplexNumber(a.real - b.real, a.imaginary - b.imaginary); static void Main() ComplexNumber a = new ComplexNumber(10, 12); Co
44、mplexNumber b = new ComplexNumber(8, 9); System.Console.WriteLine(Complex Number a = 0, a.ToString(); System.Console.WriteLine(Complex Number b = 0, b.ToString(); ComplexNumber sum = a + b; System.Console.WriteLine(Complex Number sum = 0, sum.ToString(); ComplexNumber difference = a - b; System.Cons
45、ole.WriteLine(Complex Number difference = 0, difference.ToString(); Console.ReadLine(); 數(shù)組復(fù)制 int lbArray = new int410,8,6,4; int copyArray1 = new intlbArray.Length; int copyArray2 = new intlbArray.Length; int copyArray3 = new intlbArray.Length; int copyArray4 = new intlbArray.Length; /第一種復(fù)制數(shù)組方法 for
46、(int i = 0; i != lbArray.Length ; i+) copyArray1i = lbArrayi; /第二種復(fù)制數(shù)組方法 lbArray.CopyTo(copyArray2,0); /第三種復(fù)制數(shù)組方法 Array.Copy(lbArray, copyArray3, lbArray.Length); /第四種復(fù)制數(shù)組方法 copyArray4 = (int)lbArray.Clone();2數(shù)組排序 (1)Array.Sort(arr,beginIndex,count)用于對(duì)一維arr數(shù)組的部分元素進(jìn)行排序,從beginIndex索引開始,操作count個(gè)元素,默認(rèn)是從
47、小到大進(jìn)行排序。(2)Array.Reverse(arr,beginIndex,count)反轉(zhuǎn)一維arr數(shù)組或部分arr數(shù)組中元素順序(即從大到小進(jìn)行排序),從beginIndex索引開始,操作count個(gè)元素?cái)?shù)組排序?qū)嵗?int lbArray = new int48,4,10,6; int sortArray = new intlbArray.Length ;/復(fù)制數(shù)組 Array.Copy(lbArray, sortArray, lbArray.Length); /逆序數(shù)組排序 Array.Reverse(sortArray);/復(fù)制數(shù)組 Array.Copy(lbArray, sor
48、tArray, lbArray.Length); /從小到大進(jìn)行排序 Array.Sort(sortArray);/復(fù)制數(shù)組 Array.Copy(lbArray, sortArray, lbArray.Length); Array.Sort(sortArray,2, 2); 在C#語言中提供了兩種主要的方法進(jìn)行數(shù)組的排序,分別如下:(1)Array.IndexOf(arr,obj,beginIndex,count) (2)Array.LastIndexOf(arr,obj)3數(shù)組的查找 int lbArray = new int 3, 2, 1, 2, 5, 2, 4 ;Console.Wr
49、iteLine(數(shù)組第一次出現(xiàn)2的索引位: + Array.IndexOf(lbArray, 2); Console.WriteLine(數(shù)組最后一次出現(xiàn)2的索引位: + Array.LastIndexOf(lbArray, 2);Console.WriteLine(使用IndexOf方法數(shù)組中間出現(xiàn)2的索引位: + Array.IndexOf(lbArray, 2, 2, 3);Console.WriteLine(使用LastIndexOf方法在數(shù)組中間出現(xiàn)2的索引位: + Array.LastIndexOf(lbArray, 2, 4, 3);數(shù)組查找實(shí)例 4.2.3 多維數(shù)組多維數(shù)組 數(shù)
50、組有一個(gè)維度,數(shù)組的維度又稱為秩。維度為 1 的數(shù)組稱為一維數(shù)組。維度大于 1 的數(shù)組稱為多維數(shù)組。根據(jù)維度的大小稱多維數(shù)組為二維數(shù)組、三維數(shù)組等。 4.2.3 多維數(shù)組多維數(shù)組 維度的長度確定該維度的下標(biāo)的有效范圍:對(duì)于長度為 n 的維度,下標(biāo)范圍可以為0 n-1。 數(shù)組中的元素總數(shù)是數(shù)組中各維度長度的乘積。 聲明二維數(shù)組并賦初值的方法如下:int, arr = 1, 11, 2, 12, 3, 13 ;此賦值為“橫向掃描”賦值,該例相當(dāng)于如下對(duì)每個(gè)二維數(shù)組元素賦值的結(jié)果:arr0, 0 = 1;arr0, 1 = 11;arr1, 0 = 2;arr1, 1 = 12;arr2, 0 =
51、3;arr2, 1 = 13;二維數(shù)組的定義、初始化及遍歷方法 int i, j; int, lbArray = new int3,20,1,10,11,20,21; int m = lbArray.GetLength(0); int n = lbArray.GetLength(1); Console .WriteLine(lbArray數(shù)組的第一維的長度是:0,m); Console .WriteLine(lbArray數(shù)組的第二維的長度是:0,n); Console.WriteLine(lbArray數(shù)組的元素個(gè)數(shù)是:0, lbArray.Length); for(i=0;im;i+) f
52、or(j=0;jn;j+) Console.Write( lbArray01=2,i,j,lbArrayi,j); Console.WriteLine(); 4.2.4 交錯(cuò)數(shù)組是一種不規(guī)則的二維數(shù)組,其與矩形數(shù)組(二維數(shù)組)最大的差異在于數(shù)組中每一行的長度并不相同,可以想象成把不同長度的一維數(shù)組組合而成的二維數(shù)組,所以交錯(cuò)數(shù)組也被稱為“數(shù)組中的數(shù)組”,比規(guī)格的矩形數(shù)組節(jié)省了內(nèi)存空間。 4.2.4 交錯(cuò)數(shù)組(1)交錯(cuò)數(shù)組中行的聲明是固定的,方法如下:int lbArray = new int4;(2)交錯(cuò)數(shù)組每行初始化lbArray 0 = new int5;/定義5列l(wèi)bArray 1 =
53、new int4; /定義4列l(wèi)bArray 2 = new int2; /定義2列l(wèi)bArray 3 = new int3; /定義3列4.2.4 交錯(cuò)數(shù)組(3)采用索引賦值法,給單個(gè)元素賦值 lbArray 20 = 5; lbArray 32 = 33;還可以在聲明數(shù)組時(shí)將其初始化,如:int lbArray = new intnew int 2,4,6,8,10,new int 1,0, 3,0,new int 5,9 , new int 0,11, 33;例:交錯(cuò)數(shù)組實(shí)例 int lbArray = new int2lbArray0 = new int 1, 2, 3, 4, 5,
54、6 ; lbArray1 = new int 9, 8, 7, 6, 5;for (int i = 0; i lbArray.Length; i+) for (int j = 0; j lbArrayi.Length; j+) Console.Write(lbArrayij); Console.WriteLine(); Console.WriteLine(-); 4.2.5 將數(shù)組作為參數(shù)傳遞數(shù)組可作為參數(shù)傳遞給方法。因?yàn)閿?shù)組是引用類型,所以方法可以更改元素的值。 將初始化的一維數(shù)組傳遞給方法:PrintArray(theArray);上面的行中調(diào)用的方法可定義為:void PrintArra
55、y(int arr) /方法代碼例:將一維數(shù)組作為參數(shù)傳遞的方法 static void Main(string args) string weekDays = new string Sun, Mon, Tue, Wed, Thu, Fri, Sat ; / 通過方法傳遞數(shù)組 PrintArray(weekDays); Console.ReadLine(); static void PrintArray(string arr) for (int i = 0; i arr.Length; i+) Console.WriteLine (arr0 = 1,i,arri); 例:將二維數(shù)組作為參數(shù)傳遞
56、的方法 static void Main(string args) PrintArray(new int, 1, 2 , 3, 4 , 5, 6 , 7, 8 ); Console.ReadLine();static void PrintArray(int, arr) for (int i = 0; i arr.GetLength(0) ; i+) for (int j = 0; j arr.GetLength(1); j+) System.Console.WriteLine(Element(0,1)=2, i, j, arri, j); 4.2.6 params 關(guān)鍵字的應(yīng)用在某些情況下,方
57、法的參數(shù)個(gè)數(shù)是不可預(yù)知的。要接受未知數(shù)目的參數(shù),要使用關(guān)鍵字params。該關(guān)鍵字用于函數(shù)參數(shù)列表中,聲明參數(shù)列表的最后面。params關(guān)鍵字一般與數(shù)組一起使用。當(dāng)值被傳遞給函數(shù)時(shí),編譯器首先查看是否有匹配的函數(shù)。如果有,則調(diào)用該函數(shù);如果沒有,編譯器將查看是否有包含參數(shù)params的函數(shù)。如果找到這樣的函數(shù),編譯器將參數(shù)列表放到一個(gè)數(shù)組中,并將該數(shù)組傳遞給函數(shù)。 public class ParamExample public int Sum(params int list) int total = 0; foreach (int i in list) total += i; return
58、total; class Program static void Main() ParamExample pe = new ParamExample(); int total = pe.Sum(1, 2, 3, 4, 5, 6, 7); Console.WriteLine(total); / total=28 Console.ReadLine(); (1)params關(guān)鍵字只能修飾一維數(shù)組。例如:public static int Sum(params int, table)(2)不能僅基于params關(guān)鍵字來重載方法,params關(guān)鍵字不是方法簽名的組成部分。例如:public static
59、 int Min(int array)public static int Min(params int array)關(guān)于params數(shù)組,有幾點(diǎn)需要注意:(3)不允許對(duì)params數(shù)組使用ref或out關(guān)鍵字。 (4)params數(shù)組必須是最后一個(gè)參數(shù)(即每個(gè)方法只能有一個(gè)params數(shù)組)。 (5)類型轉(zhuǎn)換規(guī)則適用于params參數(shù)。 (6)沒有使用params數(shù)組的方法總是比使用了params數(shù)組的方法優(yōu)先權(quán)高。 (7)創(chuàng)建沒有params數(shù)組的方法可以作為一個(gè)有用的優(yōu)化技術(shù) 關(guān)于params數(shù)組,有幾點(diǎn)需要注意: 字符串是引用類型。字符串不是字符數(shù)組,因?yàn)閿?shù)組元素可以更改,而字符串是常量
60、,常量不允許更改,所以字符串是一個(gè)整體。 作為常量的字符串將一組緊挨在一起的字符視為一個(gè)整體。使用 string 關(guān)鍵字定義字符串類型變量,string 是System.String 的別名。 4.3 字符串字符串主要用于保存顯示的文本信息。為了和變量區(qū)分,定義字符串的文本必須放在兩個(gè)雙引號(hào)(“)之間,并且不能在行之間拆分。如果要在字符串內(nèi)容中包含雙引號(hào)字符,則需要使用轉(zhuǎn)義字符“”后跟一個(gè)雙引號(hào),即“”。4.3.1 字符串類型定義在C#中,編譯系統(tǒng)支持兩種形式的字符串:規(guī)則字符串和逐字字符串。規(guī)則字符串由包含在雙引號(hào)中的零個(gè)或多個(gè)字符組成,例如“hello”,逐字字符串由字符后跟起始雙引號(hào)字符、零個(gè)或
溫馨提示
- 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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 消防設(shè)施操作員培訓(xùn)模塊1 職業(yè)道德
- 室外環(huán)境智能監(jiān)測數(shù)據(jù)分析平臺(tái)考核試卷
- 體驗(yàn)式營銷在衛(wèi)生潔具渠道中的應(yīng)用考核試卷
- 跨文化管理在衛(wèi)生陶瓷企業(yè)員工激勵(lì)中的應(yīng)用考核試卷
- 智能藥品監(jiān)管與合規(guī)系統(tǒng)構(gòu)建考核試卷
- 中等教育學(xué)校文化氛圍中的性別平等教育考核試卷
- 噴射系統(tǒng)與發(fā)動(dòng)機(jī)冷卻系統(tǒng)的相互作用考核試卷
- 數(shù)字體溫計(jì)材質(zhì)的能效分析考核試卷
- 期末考點(diǎn)突破:任務(wù)型閱讀20篇-外研版(三起)四年級(jí)英語下學(xué)期專項(xiàng)訓(xùn)練(含答案解析)
- 化學(xué)平衡 -2025年新高二化學(xué)暑假課(人教版)
- 危險(xiǎn)品運(yùn)輸資格(裝卸管理人員)考試2025年題庫及答案
- 2025年行政執(zhí)法資格證考試試題庫及答案
- 肺炎臨床教學(xué)查房
- 保險(xiǎn)銷售品質(zhì)管理辦法
- 職業(yè)技能《水泥質(zhì)量檢測工》知識(shí)競賽試題庫與答案
- 2025年四川省瀘州市中考招生考試數(shù)學(xué)真題試卷(真題+答案)
- 集成電路及半導(dǎo)體行業(yè)特氣安全培訓(xùn)
- 吞咽障礙的護(hù)理和措施
- 2025年湖南省中考數(shù)學(xué)真題(解析版)
- 2025年西藏自治區(qū)公務(wù)員遴選考試申論真題
- 生產(chǎn)車間獎(jiǎng)罰管理制度
評(píng)論
0/150
提交評(píng)論