《ASP NET開(kāi)發(fā)與應(yīng)用實(shí)踐》課件第3章_第1頁(yè)
《ASP NET開(kāi)發(fā)與應(yīng)用實(shí)踐》課件第3章_第2頁(yè)
《ASP NET開(kāi)發(fā)與應(yīng)用實(shí)踐》課件第3章_第3頁(yè)
《ASP NET開(kāi)發(fā)與應(yīng)用實(shí)踐》課件第3章_第4頁(yè)
《ASP NET開(kāi)發(fā)與應(yīng)用實(shí)踐》課件第3章_第5頁(yè)
已閱讀5頁(yè),還剩71頁(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)介

本章教學(xué)目標(biāo)C#語(yǔ)言的基本語(yǔ)法C#語(yǔ)言中的各種數(shù)據(jù)類(lèi)型C#語(yǔ)言中數(shù)據(jù)類(lèi)型的相互轉(zhuǎn)換C#程序控制結(jié)構(gòu)設(shè)計(jì)C#語(yǔ)言中類(lèi)的設(shè)計(jì)及對(duì)象的使用C#語(yǔ)言中類(lèi)的繼承實(shí)現(xiàn)13.1C#概述3.1.1C#簡(jiǎn)介C#(讀做"Csharp")是微軟公司在2000年7月發(fā)布的一種全新且簡(jiǎn)單、安全、面向?qū)ο蟮某绦蛟O(shè)計(jì)語(yǔ)言,是專(zhuān)門(mén)為.NET的應(yīng)用而開(kāi)發(fā)的語(yǔ)言。它吸收了C++、VisualBasic、Delphi、Java等語(yǔ)言的優(yōu)點(diǎn),體現(xiàn)了當(dāng)今最新的程序設(shè)計(jì)技術(shù)的功能和精華。C#繼承了C語(yǔ)言的語(yǔ)法風(fēng)格,同時(shí)又繼承了C++的面向?qū)ο筇匦?。不同的是,C#的對(duì)象模型已經(jīng)面向Internet進(jìn)行了重新設(shè)計(jì),使用的是.NET框架的類(lèi)庫(kù);23.1C#概述3.1.2C#的特點(diǎn)自動(dòng)內(nèi)存管理交叉語(yǔ)言處理增加安全版本支持完全面向?qū)ο?3.1C#概述43.1.3C#語(yǔ)法規(guī)則1.語(yǔ)句C#的每條語(yǔ)句都用一個(gè)分號(hào)來(lái)結(jié)束,為了程序的可讀性和易維護(hù)性,建議一行一語(yǔ)句,C#編譯器自動(dòng)過(guò)濾回車(chē)符之類(lèi)的空白字符。2.代碼塊C#是一個(gè)塊結(jié)構(gòu)的編程語(yǔ)言,代碼塊使用“{”和“}”來(lái)界定,代碼塊中可以包含任意條語(yǔ)句,也可以根本不包含語(yǔ)句。3.大小寫(xiě)C#代碼嚴(yán)格區(qū)分大小寫(xiě),這與其他許多編程語(yǔ)言是不同的,否則將會(huì)引起編譯出錯(cuò)。3.1C#概述3.1.3C#語(yǔ)法規(guī)則4.注釋在C#中,可以使用兩種方式來(lái)注釋代碼:?jiǎn)涡凶⑨尯投嘈凶⑨尅涡凶⑨屖褂谩?/”來(lái)標(biāo)記注釋?zhuān)浜罂梢跃帉?xiě)任何內(nèi)容,但一次只能注釋一行語(yǔ)句,使用多行注釋時(shí),C#以“/*”標(biāo)記注釋的起始位置,以“*/”標(biāo)記注釋結(jié)束。5.變量的命名變量名的第一個(gè)字符必須是字母、下劃線(_)或@;其后的字符可以是字母、下劃線、數(shù)字等。不能使用C#中的關(guān)鍵字作為變量名,如using、namespace等,因?yàn)檫@些關(guān)鍵字對(duì)與C#編譯器而言有特定的含義。53.1C#概述63.1.4C#程序編寫(xiě)步驟1.打開(kāi)開(kāi)發(fā)工具visualstudio20103.1C#概述

73.1.4C#程序編寫(xiě)步驟2.創(chuàng)建項(xiàng)目在菜單項(xiàng)中,點(diǎn)擊文件->新建->項(xiàng)目。3.1C#概述3.1.4C#程序編寫(xiě)步驟3.選擇模板在左側(cè)的模板列表選擇“VirsualC#“,在中間的項(xiàng)目類(lèi)型中選擇“控制臺(tái)應(yīng)用程序”,在下方“名稱(chēng)”一欄輸入想要保存項(xiàng)目的名稱(chēng)“ConsoleApplication1”,在“位置”一欄輸入(選擇)要保存項(xiàng)目文件的文件夾的名稱(chēng)“C:\Users\ashley\Desktop\c#程序編寫(xiě)步驟\”83.1C#概述93.1C#概述103.1.4C#程序編寫(xiě)步驟4.編寫(xiě)程序在主程序Main方法中輸入相應(yīng)的編程代碼,如:Console.Write("歡迎使用C#語(yǔ)言!");3.2C#語(yǔ)言的數(shù)據(jù)類(lèi)型11C#語(yǔ)言中有兩種類(lèi)型:值類(lèi)型(value

type)和引用類(lèi)型(referencetype)。值類(lèi)型的變量直接包含它們的數(shù)據(jù),而引用類(lèi)型的變量存儲(chǔ)對(duì)它們的數(shù)據(jù)的引用,后者稱(chēng)為對(duì)象。對(duì)于引用類(lèi)型,兩個(gè)變量可能引用同一個(gè)對(duì)象,因此對(duì)一個(gè)變量的操作可能影響另一個(gè)變量所引用的對(duì)象。對(duì)于值類(lèi)型,每個(gè)變量都有它們自己的數(shù)據(jù)副本(除ref和out參數(shù)變量外),因此對(duì)一個(gè)變量的操作不可能影響另一個(gè)變量。3.2C#語(yǔ)言的數(shù)據(jù)類(lèi)型

123.2.1值類(lèi)型值類(lèi)型直接存儲(chǔ)它的數(shù)據(jù)內(nèi)容,包括簡(jiǎn)單類(lèi)型、結(jié)構(gòu)和枚舉三種。1.簡(jiǎn)單數(shù)據(jù)類(lèi)型主要包括整數(shù)類(lèi)型、浮點(diǎn)類(lèi)型、小數(shù)類(lèi)型、布爾類(lèi)型和字符類(lèi)型

2.結(jié)構(gòu)結(jié)構(gòu)類(lèi)型是一種值類(lèi)型,主要用于創(chuàng)建小型的對(duì)象以節(jié)省內(nèi)存。定義一個(gè)Point結(jié)構(gòu)的代碼如下:publicstructPoint{publicintX;publicintY;}3.2C#語(yǔ)言的數(shù)據(jù)類(lèi)型

133.2.1值類(lèi)型3.枚舉枚舉類(lèi)型是由一組特定常量構(gòu)成的一組數(shù)據(jù)結(jié)構(gòu),是值類(lèi)型的一種特殊形式,當(dāng)需要一個(gè)由指定常量集合組成的數(shù)據(jù)類(lèi)型時(shí),使用枚舉類(lèi)型。枚舉聲明可以顯式地聲明byte、sbyte、short、ushort、int、uint、long或ulong類(lèi)型作為對(duì)應(yīng)的基礎(chǔ)類(lèi)型。沒(méi)有顯式地聲明基礎(chǔ)類(lèi)型的枚舉聲明意味著所對(duì)應(yīng)的基礎(chǔ)類(lèi)型是int。enumweek:long//基礎(chǔ)類(lèi)型為long型{Monday,Tuesday,Wedesday,Thursday,Friday,Saturday,Sunday}3.2C#語(yǔ)言的數(shù)據(jù)類(lèi)型

143.2.1值類(lèi)型在默認(rèn)情況下,第一個(gè)枚舉數(shù)的值為0,后面每個(gè)枚舉數(shù)的值依次遞增1,但也可以改變這種默認(rèn)的情況,強(qiáng)制讓枚舉的成員{直從l或者其他任意值開(kāi)始。枚舉的成員不能相同,但成員值可以相同。enumWeek:int{Monday=5, //元素值為5Tuesday, //元素值為6Wednesday, //元素值為7Thursday=1, //元素值為1Friday, //元素值為2Saturday, //元素值為3Sunday=5//元素值為5}3.2C#語(yǔ)言的數(shù)據(jù)類(lèi)型

153.2.2引用類(lèi)型

引用類(lèi)型所存儲(chǔ)的實(shí)際數(shù)據(jù)是當(dāng)前引用值的地址,因此引用類(lèi)型數(shù)據(jù)的值會(huì)隨著所指向的值的不同而變化,同一個(gè)數(shù)據(jù)也可以有多個(gè)引用。C#中引用類(lèi)型數(shù)據(jù)有4種:類(lèi)類(lèi)型(class)、數(shù)組類(lèi)型(array)、接口類(lèi)型(interface)和委托類(lèi)型(delegate)。這四種類(lèi)型將在后面的內(nèi)容中講到。3.2C#語(yǔ)言的數(shù)據(jù)類(lèi)型

163.2.2引用類(lèi)型

引用類(lèi)型所存儲(chǔ)的實(shí)際數(shù)據(jù)是當(dāng)前引用值的地址,因此引用類(lèi)型數(shù)據(jù)的值會(huì)隨著所指向的值的不同而變化,同一個(gè)數(shù)據(jù)也可以有多個(gè)引用。C#中引用類(lèi)型數(shù)據(jù)有4種:類(lèi)類(lèi)型(class)、數(shù)組類(lèi)型(array)、接口類(lèi)型(interface)和委托類(lèi)型(delegate)。這四種類(lèi)型將在后面的內(nèi)容中講到。3.2C#語(yǔ)言的數(shù)據(jù)類(lèi)型

173.2.3裝箱和拆箱2.拆箱轉(zhuǎn)換和裝箱轉(zhuǎn)換正好相反,拆箱轉(zhuǎn)換是指將一個(gè)對(duì)象類(lèi)型顯式地轉(zhuǎn)換成一個(gè)值類(lèi)型,或是將一個(gè)接口類(lèi)型顯式地轉(zhuǎn)換成一個(gè)執(zhí)行該接口的值類(lèi)型。拆箱的過(guò)程分為兩步:首先檢查這個(gè)對(duì)象實(shí)例,看它是否為給定的值類(lèi)型的裝箱值。然后把這個(gè)實(shí)例的值拷貝給值類(lèi)型的變量。例如:inti=10;objectobj=i;intj=(int)obj;3.3常量、變量和運(yùn)算符183.3.1常量常量就是其值固定不變的量,從數(shù)據(jù)類(lèi)型角度來(lái)看,常量的類(lèi)型可以是任何一種值類(lèi)型或引用類(lèi)型常量修飾符可以是new、public、protected、internal、private或protectedinternal。常量的數(shù)據(jù)類(lèi)型必須是以下類(lèi)型之一:sbyte,byte,short,ushort,int,uint,long,ulong,char,float,double,decimal,bool,string,枚舉類(lèi)型(enum-type)或引用類(lèi)型(reference-type)。例如:publicconstdoubleX=1.0,Y=2.0,Z=3.0;3.3常量、變量和運(yùn)算符193.3.2變量在使用過(guò)程中,值可以改變的量稱(chēng)為變量。使用變量的一條重要原則是:變量必須先定義后使用。變量可以在定義時(shí)被賦值,也可以在定義時(shí)不被賦值。一個(gè)定義時(shí)被賦值的變量很好地定義了一個(gè)初始值,一個(gè)定義時(shí)不被賦值的變量沒(méi)有初始值。1.變量的命名2.變量的類(lèi)型3.靜態(tài)變量4.非靜態(tài)變量5.局部變量3.4數(shù)組203.4.1數(shù)組的概念在進(jìn)行批量處理數(shù)據(jù)的時(shí)候,我們要用到數(shù)組。數(shù)組是一組類(lèi)型相同的有序數(shù)據(jù)。數(shù)組按照數(shù)組名、數(shù)據(jù)元素的類(lèi)型和維數(shù)來(lái)進(jìn)行描述。C#中提供的System.Array類(lèi)是所有數(shù)組類(lèi)型的基類(lèi)。3.4.2數(shù)組的定義

在C#中,數(shù)組分為:一維數(shù)組、多維數(shù)組(矩形數(shù)組)和數(shù)組的數(shù)組(交錯(cuò)數(shù)組)。1.一維數(shù)組int[]arr=newint[5];//長(zhǎng)度為5的int型數(shù)組2.多維數(shù)組int[,]a2=newint[,]{{1,2,3},{4,5,6}};3.交錯(cuò)數(shù)組int[][]c=newint[][]{newint[]{1,2},newint[]{3,4,5}};3.4數(shù)組213.4.3數(shù)組的使用數(shù)組必須在初始化之后才可以使用int[]Array=newint[3];Array[0]=2;Array[1]=3;Array[2]=4;int[]Array1=newint[3]{2,3,4};//數(shù)組聲明及初始化int[]Array2=newint[]{2,3,4};//數(shù)組聲明及初始化3.4數(shù)組3.4.4數(shù)組的操作通過(guò)循環(huán)的方式遍歷數(shù)組中的元素,例如:int[]arr=newint[5];for(inti=0;i<arr.Length;i++){arr[i]=i*i;}for(inti=0;i<arr.Length;i++){Console.WriteLine("arr[{0}]={1}",i,arr[i]);}3.5C#程序控制結(jié)構(gòu)C#程序執(zhí)行方式并非都是直線順序結(jié)構(gòu),還有選擇結(jié)構(gòu)和循環(huán)結(jié)構(gòu)。而選擇結(jié)構(gòu)和循環(huán)結(jié)構(gòu)需要流程控制語(yǔ)句。流程控制語(yǔ)句主要有選擇語(yǔ)句和循環(huán)語(yǔ)句。3.5.1選擇結(jié)構(gòu)設(shè)計(jì)1.if語(yǔ)句if語(yǔ)句是最常用的選擇語(yǔ)句,它根據(jù)布爾表達(dá)式的值來(lái)判斷是否執(zhí)行后面的內(nèi)嵌語(yǔ)句,語(yǔ)法形式為:if(布爾表達(dá)式)嵌入語(yǔ)句或if(布爾表達(dá)式)嵌入語(yǔ)句else嵌入語(yǔ)句3.5C#程序控制結(jié)構(gòu)C#程序執(zhí)行方式并非都是直線順序結(jié)構(gòu),還有選擇結(jié)構(gòu)和循環(huán)結(jié)構(gòu)。而選擇結(jié)構(gòu)和循環(huán)結(jié)構(gòu)需要流程控制語(yǔ)句。流程控制語(yǔ)句主要有選擇語(yǔ)句和循環(huán)語(yǔ)句。3.5.1選擇結(jié)構(gòu)設(shè)計(jì)1.if語(yǔ)句if語(yǔ)句是最常用的選擇語(yǔ)句,它根據(jù)布爾表達(dá)式的值來(lái)判斷是否執(zhí)行后面的內(nèi)嵌語(yǔ)句,語(yǔ)法形式為:if(布爾表達(dá)式)嵌入語(yǔ)句或if(布爾表達(dá)式)嵌入語(yǔ)句else嵌入語(yǔ)句3.5C#程序控制結(jié)構(gòu)3.5.2循環(huán)結(jié)構(gòu)設(shè)計(jì)循環(huán)語(yǔ)句可以實(shí)現(xiàn)一個(gè)程序模塊的重復(fù)執(zhí)行。它對(duì)于我們簡(jiǎn)化程序,更好地組織算法有著重要的意義。C#為我們提供了四種循環(huán)語(yǔ)句,分別適用于不同的情形。while語(yǔ)句while語(yǔ)句有條件地將內(nèi)嵌語(yǔ)句執(zhí)行0遍或若干遍。語(yǔ)句的格式為:while(布爾表達(dá)式)嵌入語(yǔ)句do-while語(yǔ)句do-while語(yǔ)句與while語(yǔ)句不同的是:它首先執(zhí)行嵌入語(yǔ)句,然后判斷布爾表達(dá)式的值是否為true。其語(yǔ)法形式為:do{嵌入語(yǔ)句}while(布爾表達(dá)式)3.5C#程序控制結(jié)構(gòu)

3.for語(yǔ)句for語(yǔ)句是C#中使用頻率最高的循環(huán)語(yǔ)句。在事先知道循環(huán)次數(shù)的情況下,使用for語(yǔ)句是比較方便的。for語(yǔ)句的格式為:for(初始化;循環(huán)控制條件;循環(huán)控制)嵌入語(yǔ)句4.foreach語(yǔ)句foreach語(yǔ)句表示收集一個(gè)集合中的各元素,并針對(duì)各個(gè)元素執(zhí)行內(nèi)嵌語(yǔ)句。語(yǔ)句的格式為:foreach(類(lèi)型標(biāo)識(shí)符in表達(dá)式)嵌入語(yǔ)句3.6類(lèi)、對(duì)象和方法

3.6.1類(lèi)的概念類(lèi)是面向?qū)ο蟮某绦蛟O(shè)計(jì)的基本構(gòu)成模塊。從定義上講,類(lèi)是一種數(shù)據(jù)結(jié)構(gòu),這種數(shù)據(jù)結(jié)構(gòu)可能包含數(shù)據(jù)成員,函數(shù)成員以及其它的嵌套類(lèi)型。其中數(shù)據(jù)成員類(lèi)型有常量域和事件,函數(shù)成員類(lèi)型有方法、屬性、索引指示器、操作符、構(gòu)造函數(shù)和析構(gòu)函數(shù)。在C#中,類(lèi)的聲明格式如下:屬性集類(lèi)修飾符class類(lèi)名繼承方式基類(lèi)名{類(lèi)體}其中,關(guān)鍵字class、類(lèi)名和類(lèi)體是必需項(xiàng),其他項(xiàng)是可選項(xiàng)。類(lèi)的修飾符可以是以下幾種之一或者是它們的組合在類(lèi)的聲明中同一修飾符不允許出現(xiàn)多次。3.6類(lèi)、對(duì)象和方法

1.類(lèi)的成員類(lèi)的成員可以分為兩大類(lèi):類(lèi)本身所聲明的以及從基類(lèi)中繼承而來(lái)的。類(lèi)的成員有以下類(lèi)型:成員常量 代表與類(lèi)相關(guān)聯(lián)的常量值類(lèi)中的變量(字段)成員方法 復(fù)雜執(zhí)行類(lèi)中的計(jì)算和其它操作屬性 用于定義類(lèi)中的值 并對(duì)它們進(jìn)行讀寫(xiě)事件 用于說(shuō)明發(fā)生了什么事情索引指示器 允許像使用數(shù)組那樣為類(lèi)添加路徑列表操作符 定義類(lèi)中特有的操作構(gòu)造函數(shù)和析構(gòu)函數(shù)2.靜態(tài)成員和非靜態(tài)成員若將類(lèi)中的某個(gè)成員聲明為static該成員稱(chēng)為靜態(tài)成員。類(lèi)中的成員要么是靜態(tài),要么是非靜態(tài)的。一般說(shuō)來(lái),靜態(tài)成員是屬于類(lèi)所有的,非靜態(tài)成員則屬于類(lèi)的實(shí)例對(duì)象。3.6類(lèi)、對(duì)象和方法

3.6.1類(lèi)的概念3.成員常量關(guān)鍵字const用于聲明常量,后跟數(shù)據(jù)類(lèi)型的聲明。類(lèi)的常量可以加上以下修飾符newpublicprotectedinternalprivate3.6類(lèi)、對(duì)象和方法

3.6.2對(duì)象的生成構(gòu)造函數(shù)用于執(zhí)行類(lèi)的實(shí)例的初始化(對(duì)象的生成),每個(gè)類(lèi)都有構(gòu)造函數(shù),即使我們沒(méi)有聲明它,編譯器也會(huì)自動(dòng)地為我們提供一個(gè)默認(rèn)的構(gòu)造函數(shù)。在生成對(duì)象的時(shí)候,系統(tǒng)將最先執(zhí)行構(gòu)造函數(shù)中的語(yǔ)句。實(shí)際上,任何構(gòu)造函數(shù)的執(zhí)行都隱式地調(diào)用了系統(tǒng)提供默認(rèn)的構(gòu)造函數(shù)base()。使用構(gòu)造函數(shù)請(qǐng)注意以下幾個(gè)問(wèn)題:一個(gè)類(lèi)的構(gòu)造函數(shù)通常與類(lèi)名相同構(gòu)造函數(shù)不聲明返回類(lèi)型一般地,構(gòu)造函數(shù)總是public類(lèi)型的,如果是private類(lèi)型的,表明類(lèi)不能被實(shí)例化,這通常用于只含有靜態(tài)成員的類(lèi)。在構(gòu)造函數(shù)中不要做對(duì)類(lèi)的實(shí)例進(jìn)行初始化以外的事情,也不要嘗試顯式地調(diào)用構(gòu)造函數(shù)。3.6類(lèi)、對(duì)象和方法

3.6.3函數(shù)與方法方法是類(lèi)中用于執(zhí)行計(jì)算或其它行為的成員。方法的聲明格式為:方法修飾符返回類(lèi)型方法名(形參列表){方法體}方法的修飾符可以是:newpublicprotectedinternalprivatestaticvirtualsealedoverrideabstractextern3.6類(lèi)、對(duì)象和方法

3.6.3函數(shù)與方法1.返回值方法的返回值的類(lèi)型可以是合法的C#的數(shù)據(jù)類(lèi)型。C#在方法的執(zhí)行部分通過(guò)return語(yǔ)句得到返回值。2.方法中的參數(shù)C#中方法的參數(shù)有四種類(lèi)型值參數(shù) 不含任何修飾符引用型參數(shù) 以ref修飾符聲明輸出參數(shù) 以out修飾符聲明數(shù)組型參數(shù) 以params修飾符聲明(1)值參數(shù)(2)引用型參數(shù)(3)輸出參數(shù)(4)數(shù)組型參數(shù)(5)靜態(tài)和非靜態(tài)的方法3.6類(lèi)、對(duì)象和方法

3.6.4類(lèi)的繼承C#中派生類(lèi)從它的直接基類(lèi)中繼承成員、方法、變量、屬性、事件和索引指示器。除了構(gòu)造函數(shù)和析構(gòu)函數(shù),派生類(lèi)隱式地繼承了直接基類(lèi)的所有成員。C#中的繼承符合下列規(guī)則:繼承是可傳遞的。如果C從B中派生B又從A中派生,那么C不僅繼承了B中聲明的成員,同樣也繼承了A中的成員。Object類(lèi)作為所有類(lèi)的基類(lèi)派生類(lèi)應(yīng)當(dāng)是對(duì)基類(lèi)的擴(kuò)展 派生類(lèi)可以添加新的成員。但不能除去已經(jīng)繼承的成員的定義構(gòu)造函數(shù)和析構(gòu)函數(shù)不能被繼承,除此以外的其它成員,不論對(duì)它們定義了怎樣的訪問(wèn)方式,都能被繼承?;?lèi)中成員的訪問(wèn)方式只能決定派生類(lèi)能否訪問(wèn)它們派生類(lèi)如果定義了與繼承而來(lái)的成員同名的新成員,就可以覆蓋已繼承的成員。但這并不因?yàn)檫@派生類(lèi)刪除了這些成員,只是不能再訪問(wèn)這些成員類(lèi)可以定義虛方法,虛屬性以及虛索引指示器。它的派生類(lèi)能夠重載這些成員,從而實(shí)現(xiàn)類(lèi)可以展示出多態(tài)性3.6類(lèi)、對(duì)象和方法

3.6.4類(lèi)的繼承1.覆蓋上面提到類(lèi)的成員聲明中可以聲明與繼承而來(lái)的成員同名的成員,這時(shí)我們稱(chēng)派生類(lèi)的成員覆蓋hide了基類(lèi)的成員。這種情況下編譯器不會(huì)報(bào)告錯(cuò)誤,但會(huì)給出一個(gè)警告。對(duì)派生類(lèi)的成員使用new關(guān)鍵字可以關(guān)閉這個(gè)警告。2.虛方法當(dāng)類(lèi)中的方法聲明前加上了virtual修飾符,我們稱(chēng)之為虛方法,反之為非虛。使用了virtual修飾符后,不允許再有static,abstract或override修飾符。對(duì)于非虛的方法,無(wú)論被其所在類(lèi)的實(shí)例調(diào)用,還是被這個(gè)類(lèi)的派生類(lèi)的實(shí)例調(diào)用,方法的執(zhí)行方式不變。而對(duì)于虛方法,它的執(zhí)行方式可以被派生類(lèi)改變,這種改變是通過(guò)方法的重載來(lái)實(shí)現(xiàn)的。3.6類(lèi)、對(duì)象和方法

3.6.5委托和事件委托是一個(gè)類(lèi)型安全的對(duì)象,它指向程序中另一個(gè)以后會(huì)被調(diào)用的方法(或多個(gè)方法)。通俗的說(shuō),委托是一個(gè)可以引用方法的對(duì)象,當(dāng)創(chuàng)建一個(gè)委托,也就創(chuàng)建一個(gè)引用方法的對(duì)象,進(jìn)而就可以調(diào)用那個(gè)方法,即委托可以調(diào)用它所指的方法。1.定義委托類(lèi)型訪問(wèn)修飾符delegate返回類(lèi)型委托名(形參)2.聲明委托對(duì)象委托名委托實(shí)例名;3.創(chuàng)建委托對(duì)象(確定與哪些方法進(jìn)行綁定)委托實(shí)例名=new委托名(某個(gè)類(lèi)的方法)4.使用委托調(diào)用方法委托實(shí)例名(實(shí)參)3.6類(lèi)、對(duì)象和方法

委托注意事項(xiàng):(1)委托和方法必須具有相同的參數(shù)。(2)委托可以調(diào)用多個(gè)方法,即一個(gè)委托對(duì)象可以維護(hù)一個(gè)可調(diào)用方法的列表而不是單獨(dú)的一個(gè)方法,稱(chēng)為多路廣播(多播)。(3)使用+=和-=運(yùn)算實(shí)現(xiàn)方法的增加和減少。publicdelegateintCall(intnum1,intnum2);//第一步:定義委托類(lèi)型classSimpleMath{publicintMultiply(intnum1,intnum2){returnnum1*num2;}publicintDivide(intnum1,intnum2){returnnum1/num2;}}3.6類(lèi)、對(duì)象和方法

classTest{staticvoidMain(string[]args){CallobjCall;//第二步:聲明委托對(duì)象SimpleMathobjMath=newSimpleMath();objCall=newCall(objMath.Multiply);//第三步:創(chuàng)建委托對(duì)象,將方法與委托關(guān)聯(lián)起來(lái)CallobjCall1=newCall(objMath.Divide);objCall+=objCall1;//向委托增加一個(gè)方法intresult=objCall(7,9);//調(diào)用委托實(shí)例,先執(zhí)objMath.Multiply,然后執(zhí)行objMath.DivideConsole.WriteLine("結(jié)果為{0}",result);}}程序的輸出為:結(jié)果為03.6類(lèi)、對(duì)象和方法

修飾符event委托類(lèi)型事件名;向類(lèi)中添加事件需要使用event關(guān)鍵字,并提供委托類(lèi)型和事件名稱(chēng)。例如:publicclassEventSource{publicdelegatevoidTestEventDelegate(objectsender,System.EventArgse);publiceventTestEventDelegateTestEvent;privatevoidRaiseTestEvent(){/*...*/}}3.6類(lèi)、對(duì)象和方法

要接收某個(gè)事件的類(lèi)可以創(chuàng)建一個(gè)方法來(lái)接收該事件,然后向類(lèi)事件自身添加該方法的一個(gè)委托。這個(gè)過(guò)程稱(chēng)為“訂閱事件”。首先,接收類(lèi)必須具有與事件自身具有相同簽名(如委托簽名)的方法。然后,該方法(稱(chēng)為事件處理程序)可以采取適當(dāng)?shù)牟僮鱽?lái)響應(yīng)該事件。例如:publicclassEventReceiver{publicvoidReceiveTestEvent(objectsender,System.EventArgse){Console.Write("Eventreceivedfrom");Console.WriteLine(sender.ToString());}}

3.6類(lèi)、對(duì)象和方法要接收某個(gè)事件的類(lèi)可以創(chuàng)建一個(gè)方法來(lái)接收該事件,然后向類(lèi)事件自身添加該方法的一個(gè)委托。這個(gè)過(guò)程稱(chēng)為“訂閱事件”。首先,接收類(lèi)必須具有與事件自身具有相同簽名(如委托簽名)的方法。然后,該方法(稱(chēng)為事件處理程序)可以采取適當(dāng)?shù)牟僮鱽?lái)響應(yīng)該事件。例如:publicclassEventReceiver{publicvoidReceiveTestEvent(objectsender,System.EventArgse){Console.Write("Eventreceivedfrom");Console.WriteLine(sender.ToString());}}40

3.6類(lèi)、對(duì)象和方法若要取消訂閱事件,接收器可以使用減法賦值運(yùn)算符(-=)從源對(duì)象的事件中移除事件處理程序的委托。例如:publicvoidUnSubscribe(EventSourcesource){TestEventDelegatetemp=newTestEventDelegate(ReceiveTestEvent);source.TestEvent-=temp;}41

3.6類(lèi)、對(duì)象和方法3.6.6字符串操作字符串類(lèi)型是引用類(lèi)型,字符串是使用string關(guān)鍵字聲明的、由一個(gè)或多個(gè)字符組成的一組字符。它有兩種表達(dá)方式:用雙引號(hào)引起來(lái);用@引起來(lái),它可以把字符串中的特殊字的特殊性去掉,字符串中的所有字符均被認(rèn)為是普通字符。例如:stringmyname=“”;stringfilepath=@”c:\windows”;//“\w”不是轉(zhuǎn)義字符下面介紹幾種常見(jiàn)的字符串操作。(1)字符串中字符訪問(wèn)(s[i])strings="ABCD";Console.WriteLine(s[0]);//輸出"A";Console.WriteLine(s.Length);//輸出442

3.6類(lèi)、對(duì)象和方法(2)字符串轉(zhuǎn)換為字符數(shù)組(ToCharArray)strings="ABCD";char[]arr=s.ToCharArray();//把字符串轉(zhuǎn)換為字符數(shù)組{'A','B','C','D'}Console.WriteLine(arr[0]);//輸出數(shù)組的第一個(gè)元素,輸出"A"(3)截取子串(Substring)strings="ABCD";Console.WriteLine(s.Substring(1));//從第2位開(kāi)始(索引從0開(kāi)始)截取一直到字符串結(jié)束,輸出"BCD"Console.WriteLine(s.Substring(1,2));//從第2位開(kāi)始截取2位,輸出"BC"43

3.6類(lèi)、對(duì)象和方法(4)匹配索引(IndexOf)strings="ABCABCD";Console.WriteLine(s.IndexOf('A'));//從字符串頭部開(kāi)始搜索第一個(gè)匹配字符A的位置索引,輸出"0"Console.WriteLine(s.IndexOf("BCD"));//從字符串頭部開(kāi)始搜索第一個(gè)匹配字符串BCD的位置,輸出"4"Console.WriteLine(s.LastIndexOf('C'));//從字符串尾部開(kāi)始搜索第一個(gè)匹配字Console.WriteLine(s.LastIndexOf("AB"));//從字符串尾部開(kāi)始搜索第一個(gè)匹配字符串BCD的位置,輸出"3"Console.WriteLine(s.IndexOf('E'));//從字符串頭部開(kāi)始搜索第一個(gè)匹配字符串E的位置,沒(méi)有匹配輸出"-1";Console.WriteLine(s.Contains("ABCD"));//判斷字符串中是否存在另一個(gè)字符串"ABCD",輸出true44

3.6類(lèi)、對(duì)象和方法(5)大小寫(xiě)轉(zhuǎn)換(ToUpper和ToLower)strings="aBcD";Console.WriteLine(s.ToLower());//轉(zhuǎn)化為小寫(xiě),輸出"abcd"Console.WriteLine(s.ToUpper());//轉(zhuǎn)化為大寫(xiě),輸出"ABCD"(6)截頭去尾(Trim)strings

="__AB__CD__";

Console.WriteLine(s.Trim('_'));

//

移除字符串中頭部和尾部的'_'字符,輸出"AB__CD"

Console.WriteLine(s.TrimStart('_'));

//

移除字符串中頭部的'_'字符,輸出"AB__CD__"

Console.WriteLine(s.TrimEnd('_'));

//

移除字符串中尾部的'_'字符,輸出"__AB__CD"

Console.WriteLine(s.Replace("_",

""));

//

把字符串中的"_"替換為空字符串,輸出"ABCD"45

3.6類(lèi)、對(duì)象和方法(7)替換字符(串)(Replace)strings

="A_B_C_D";

Console.WriteLine(s.Replace('_',

'-'));

//

把字符串中的'_'字符替換為'-',輸出"A-B-C-D"(8)分割為字符串?dāng)?shù)組(Split)

strings

="AA,BB,CC,DD";

string[]arr1

=

s.Split(',');

//

以','字符對(duì)字符串進(jìn)行分割,返回字符串?dāng)?shù)組

Console.WriteLine(arr1[0]);

//

輸出"AA"

Console.WriteLine(arr1[1]);

//

輸出"BB"

Console.WriteLine(arr1[2]);

//

輸出"CC"

Console.WriteLine(arr1[3]);

//

輸出"DD"46

3.6類(lèi)、對(duì)象和方法9)格式化(靜態(tài)方法Format)Console.WriteLine(string.Format("{0}+{1}={2}",

1,

2,

1+2));Console.WriteLine(string.Format("{0}/{1}={2:0.000}",

1,

3,

1.00/3.00));Console.WriteLine(string.Format("{0:yyyy年MM月dd日}",DateTime.Now));

47

3.6類(lèi)、對(duì)象和方法(10)連接成一個(gè)字符串(+運(yùn)算、靜態(tài)方法Concat、靜態(tài)方法Join和實(shí)例方法StringBuilder.Append)strings

="A,B,C,D";strings1=”,E,F”;strings2=s+s1;Console.WriteLine(s2);

//輸出“A,B,C,D,E,F”string[]arr3

=

s.Split(',');

//

arr={"A","B","C","D"}Console.WriteLine(string.Concat(arr3));

//

將一個(gè)字符串?dāng)?shù)組連接成一個(gè)字符串,輸出"ABCD"

Console.WriteLine(string.Join(",",arr3));

//

以","作為分割符號(hào)將一個(gè)字符串?dāng)?shù)組連接成一個(gè)字符串,輸出"A,B,C,D"

StringBuildersb

=new

StringBuilder();

//

聲明一個(gè)字符串構(gòu)造器實(shí)例sb.Append("A");

//

使用字符串構(gòu)造器連接字符串能獲得更高的性能

sb.Append('B');

Console.WriteLine(sb.ToString());//

輸出"AB"48

3.6類(lèi)、對(duì)象和方法

493.6.7日期和時(shí)間使用DateTime結(jié)構(gòu)創(chuàng)建、表示日期和時(shí)間。使用Now屬性獲取系統(tǒng)日期。例如:DateTimeBirthday=newDateTime(2012,8,14);DateTimetoday=DateTime.Now;日期類(lèi)型可以使用Year、Month、Day、DayOfWeek、Hour、Minute、Second等屬性訪問(wèn)日期中的年份、月份、日、星期、小時(shí)、分鐘和秒。例如:intmonth=Birthday.Month;inthour=today.Hour;3.6類(lèi)、對(duì)象和方法3.6.8數(shù)據(jù)轉(zhuǎn)換在編程的過(guò)程中,需要對(duì)不同類(lèi)型的數(shù)據(jù)進(jìn)行相互轉(zhuǎn)換,在C#中提供了5中常用的轉(zhuǎn)換方式。1.隱式轉(zhuǎn)換當(dāng)對(duì)簡(jiǎn)單的值類(lèi)型進(jìn)行轉(zhuǎn)換時(shí),如果是按照Byte,short,int,long,float,double從左到右(從短到長(zhǎng))進(jìn)行轉(zhuǎn)換的時(shí)候,可以直接進(jìn)行轉(zhuǎn)換(隱式轉(zhuǎn)換),不用做任何說(shuō)明。例如:inta=10;longb=a;Console.Write("b的值為:"+b);3.6類(lèi)、對(duì)象和方法2.顯示轉(zhuǎn)換對(duì)值類(lèi)型進(jìn)行轉(zhuǎn)換時(shí),從長(zhǎng)字節(jié)轉(zhuǎn)換成短字節(jié),直接轉(zhuǎn)換的話,編譯器會(huì)提示“無(wú)法將類(lèi)型*轉(zhuǎn)換為類(lèi)型*,存在一個(gè)顯示轉(zhuǎn)換”,這時(shí)需要進(jìn)行強(qiáng)制轉(zhuǎn)換(顯示轉(zhuǎn)換)。例如:longa=10;intb=(int)a;Console.Write("b的值為:"+b);

3.6類(lèi)、對(duì)象和方法3.toString()轉(zhuǎn)換當(dāng)把值類(lèi)型轉(zhuǎn)換成字符串類(lèi)型時(shí),可以直接調(diào)用值類(lèi)型的方法toString()進(jìn)行轉(zhuǎn)換。例如:inta=256;stringb=a.ToString();Console.Write("b的值為:"+b);3.6類(lèi)、對(duì)象和方法4.parse方法值類(lèi)型都有parse方法,可以將字符串轉(zhuǎn)換為對(duì)應(yīng)的數(shù)據(jù)類(lèi)型,例如:inta=256;stringb="256";if(int.Parse(b)==a){Console.Write("a和b的值相等!");}3.6類(lèi)、對(duì)象和方法5.Convert類(lèi)Convert類(lèi)有很多的轉(zhuǎn)換數(shù)據(jù)類(lèi)型的方法,它將繼承自O(shè)bject類(lèi)型的對(duì)象轉(zhuǎn)換為指定的類(lèi)型。例如:stringt=“28.9”;doublevalue=Convert.ToDouble(t);經(jīng)典案例一、案例功能說(shuō)明本章典型案例,主要是實(shí)現(xiàn)一個(gè)模擬銀行ATM機(jī)操作的控制臺(tái)程序。讓開(kāi)發(fā)者掌握C#程序的基本語(yǔ)法、類(lèi)型、類(lèi)的設(shè)計(jì)及對(duì)象的使用等內(nèi)容,加深對(duì)C#程序編寫(xiě)的認(rèn)識(shí)。二、案例要求(1)編寫(xiě)Accounter銀行賬戶類(lèi),具有賬戶賬戶和賬戶金額的屬性,開(kāi)戶、存錢(qián)、取錢(qián)等方法。(2)通過(guò)控制臺(tái)程序?qū)崿F(xiàn)對(duì)Accounter類(lèi)的對(duì)象屬性及方法的訪問(wèn)。三、操作和實(shí)現(xiàn)步驟(1)建立一個(gè)工程文件夾為模擬銀行ATM機(jī)操作。(2)啟動(dòng)VS2010,選擇新建項(xiàng)目。選擇建立控制臺(tái)應(yīng)用程序。添加一個(gè)名為ConsoleApplication1的項(xiàng)目,項(xiàng)目位置在模擬銀行ATM機(jī)操作文件夾中,如下圖所示。55經(jīng)典案例56經(jīng)典案例57(3)項(xiàng)目新建成功后,打開(kāi)“解決方案資源管理器”,可以看到解決方案中包括了剛才生成的控制臺(tái)程序的項(xiàng)目,選擇項(xiàng)中的Program.cs文件,雙擊打開(kāi),可以看到VS2010已經(jīng)幫我們編寫(xiě)了一部分程序,如下圖所示。經(jīng)典案例58(4)在解決方案資源管理器中選擇項(xiàng)目,【右鍵】->【添加】->【新建項(xiàng)】。(5)在彈出的界面中,選擇“類(lèi)”,并把名稱(chēng)改為“Accounter.cs”。如下圖所示。經(jīng)典案例59(6)在“解決方案資源管理器”中,雙擊“Accounter.cs”,編寫(xiě)類(lèi)的代碼,代碼如下所示。usingSystem;usingSystem.Collections.Generic;usingSystem.Linq;usingSystem.Text;namespaceConsoleApplication1//類(lèi)的命名空間,在訪問(wèn)類(lèi)時(shí),可以使用類(lèi)的命名空間.類(lèi)名的方式{classAccounter//類(lèi)名{privatestringnumber;//字段成員,表示賬戶賬號(hào)信息publicstringNumber//屬性成員,對(duì)number字段進(jìn)行了封裝,用public修飾符表示可以對(duì)外公開(kāi)訪問(wèn){get{returnnumber;}//獲取屬性值的get訪問(wèn)器set{number=value;}//設(shè)置屬性值的set訪問(wèn)器}privatedecimalmoney;//字段成員,表示賬戶金額信息publicdecimalMoney//屬性成員,對(duì)money字段進(jìn)行了封裝{get{returnmoney;}set{money=value;}}經(jīng)典案例60publicAccounter(stringn,decimalm)//類(lèi)的構(gòu)造函數(shù),帶有參數(shù),可以對(duì)2個(gè)字段成員進(jìn)行值的初始化{number=n;money=m;}publicvoidSave(decimalm)//存錢(qián)的方法,方法沒(méi)有返回值{money+=m;//實(shí)現(xiàn)對(duì)money字段的加操作}//實(shí)現(xiàn)對(duì)money字段的累加計(jì)算publicboolDraw(decimalm)//取錢(qián)的方法{if(money>=m)//判斷取錢(qián)的金額是否超過(guò)賬戶的金額{money-=m;//實(shí)現(xiàn)對(duì)money字段的減操作returntrue;//返回true表示操作成功}else{returnfalse;//返回true表示操作失敗,余額不足}}

}}經(jīng)典案例61(7)在“解決方案資源管理器”中,雙擊“Program.cs”,編寫(xiě)Main方法的代碼,代碼如下所示。staticvoidMain(string[]args){Console.WriteLine("歡迎光臨銀行ATM機(jī)!");//屏幕輸出歡迎信息Console.WriteLine("賬戶未創(chuàng)建,請(qǐng)先創(chuàng)建賬戶");Console.WriteLine("請(qǐng)輸入你要?jiǎng)?chuàng)建的賬戶的賬號(hào):");stringnumber=Console.ReadLine();//讀取用戶輸入的賬戶Console.WriteLine("請(qǐng)輸入你要?jiǎng)?chuàng)建的賬戶的初始金額:");decimalinitmoney=decimal.Parse(Console.ReadLine());//讀取用戶輸入的初始金額,并進(jìn)行類(lèi)型轉(zhuǎn)換Accounteraccounter=newAccounter(number,initmoney);//生成Accounter類(lèi)的對(duì)象,為對(duì)象的2個(gè)字段進(jìn)行初始化Console.WriteLine("賬戶創(chuàng)建成功!");經(jīng)典案例62while(true){Console.WriteLine("請(qǐng)選擇你要的操作1:存錢(qián)2:取錢(qián)3:退出");//屏幕輸出選擇信息,提示用戶選擇stringa=Console.ReadLine();if(a=="3")//用戶選擇了退出break;//break結(jié)束while循環(huán)switch(a){case"1"://用戶選擇了存錢(qián)Console.WriteLine("請(qǐng)輸入你要存錢(qián)的金額:");decimalm1=decimal.Parse(Console.ReadLine());//獲取用戶輸入的存款金額并轉(zhuǎn)換為decimal類(lèi)型accounter.Save(m1);//調(diào)用對(duì)象的方法,進(jìn)行存款Console.WriteLine("存錢(qián)成功,當(dāng)前賬戶金額為:{0}",accounter.Money.ToString());//顯示賬戶的余額信息break;case"2"://用戶選擇了取錢(qián)Console.WriteLine("請(qǐng)輸入你要取錢(qián)的金額:");經(jīng)典案例63decimalm2=decimal.Parse(Console.ReadLine());if(accounter.Draw(m2))//調(diào)用對(duì)象的方法,進(jìn)行取款{Console.WriteLine("取錢(qián)成功,當(dāng)前賬戶金額為:{0}",accounter.Money.ToString());//取錢(qián)成功,顯示賬戶的余額信息}else{Console.WriteLine("取錢(qián)失敗,當(dāng)前賬戶余額不足!");//取錢(qián)成功,顯示提示信息}break;default:break;//用戶其它的選擇不執(zhí)行任何操作}}}經(jīng)典案例64

(8)運(yùn)行程序,出現(xiàn)程序的運(yùn)行界面,如下圖所示。經(jīng)典案例65

(9)按照程序屏幕的提示,進(jìn)行操作,可以看到程序的運(yùn)行結(jié)果。經(jīng)典案例66

(9)按照程序屏幕的提示,進(jìn)行操作,可以看到程序的運(yùn)行結(jié)果。作業(yè)要求67(1)請(qǐng)學(xué)生按照上述操作步驟,制作一個(gè)完全相同的控制臺(tái)程序,對(duì)程序進(jìn)行運(yùn)行及測(cè)試,學(xué)習(xí)C#程序的基本語(yǔ)法和編寫(xiě)過(guò)程。(2)請(qǐng)學(xué)生以上述操作步驟為參照,增加Accounter類(lèi)的查詢賬戶信息的Query方法,并能夠在Program.cs文件的Main函數(shù)進(jìn)行調(diào)用。上機(jī)實(shí)訓(xùn)3-168C#程序編寫(xiě)練習(xí)一、實(shí)驗(yàn)?zāi)康?)熟悉C#的基本語(yǔ)法和基本類(lèi)型。2)掌握C#中程序編寫(xiě)的一般方式。3)掌握C#中類(lèi)的設(shè)計(jì)和對(duì)象的使用。4)能夠通過(guò)控制臺(tái)程序驗(yàn)證程序編寫(xiě)的正確性。二、實(shí)驗(yàn)儀器、設(shè)備及材料PC機(jī)一臺(tái),安裝WindowsXP、VS2010、SQLServer2008軟件。三、實(shí)驗(yàn)內(nèi)容及要求1、實(shí)驗(yàn)內(nèi)容編寫(xiě)一個(gè)控制臺(tái)程序,實(shí)現(xiàn)對(duì)于學(xué)生基本信息的查詢。2、實(shí)驗(yàn)分析1)項(xiàng)目中可以編寫(xiě)一個(gè)Student類(lèi),用于對(duì)學(xué)生的基本信息進(jìn)行封裝,方面信息的訪問(wèn),Student類(lèi)的代碼可以參考如下。上機(jī)實(shí)訓(xùn)3-169classStude

溫馨提示

  • 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)論