您好,登錄后才能下訂單哦!
這篇文章為大家?guī)碛嘘P(guān)C#中的概念詳細(xì)介紹。大部分知識點都是大家經(jīng)常用到的,為此分享給大家做個參考。一起跟隨小編過來看看吧。
1.什么是.Net
.Net是由Microsoft推出的應(yīng)用程序開發(fā)平臺,可用來構(gòu)建和運行新一代Microsoft Windows和Web應(yīng)用程序。
2. .Net的核心技術(shù)
.Net Framework:.Net 平臺核心中的核心,為.Net 平臺下的應(yīng)用程序的運行提供基本框架。
.Net企業(yè)服務(wù)器:微軟為企業(yè)提供技術(shù)服務(wù)的一部分,包括各種開發(fā)工具包。
構(gòu)建模塊服務(wù):微軟提供的COM+組件服務(wù)和XML Web服務(wù)技術(shù),利用構(gòu)建模塊服務(wù)開發(fā)應(yīng)用程序模塊,可以迅速地組裝一個功能完備的軟件。
Visual Studio.Net : .Net 平臺的主要開發(fā)工具
3..Net Framework由不同組件組成,用于支持創(chuàng)建和運行基于.NET平臺的應(yīng)用程序。
4..Net Framework框架的底層是Windows操作系統(tǒng)提供的各種應(yīng)用程序服務(wù)組件,這些組件包括:消息隊列服務(wù)、COM+組件服務(wù)、Internet信息服務(wù)(IIS)、Windows管理工具(WMI)等。
5..Net Framework可以與他們整合以開發(fā)應(yīng)用程序,在.Net Framework最頂層是程序設(shè)計語言, .Net Framework支持20多種計算機程序設(shè)計語言。在Visual Studio.Net 開發(fā)環(huán)境中,可以直接使用VB、C#、C++、J#、Jscript這5種語言開發(fā)任何應(yīng)用程序。
6..Net Framework具有兩個主要組件:公共語言運行時(CLR)和.Net Framework類庫,除此之外還有ADO.NET、ASP.NET、XML Web等。
7..Net Framework支持3種類型的用戶界面:
命令控制臺,用來設(shè)計純字符界面的應(yīng)用程序
Windows窗體,用來設(shè)計Windows界面的應(yīng)用程序
Web窗體,用來設(shè)計Web界面的應(yīng)用程序
8.ADO.NET是.Net Framework提供的微軟新一代的面向?qū)ο蟮臄?shù)據(jù)處理技術(shù),利用它可以簡便、快捷地開發(fā)數(shù)據(jù)庫應(yīng)用程序。
ASP.Net是.Net Framework提供的全新的Web應(yīng)用程序開發(fā)技術(shù),利用ASP.NET開發(fā)WEB應(yīng)用程序如同開發(fā)Windows應(yīng)用程序一樣簡單。
Xml Web Service是一種能夠在Internet環(huán)境中直接調(diào)用的組件。.Net Framework提供了創(chuàng)建、測試和部署XML Web服務(wù)的工具和類。
9.Net Framework為應(yīng)用程序開發(fā)者提供了一個與平臺無關(guān)
的開發(fā)環(huán)境,使用.Net Framework開發(fā)程序有以下優(yōu)點:
1. 基于Web的標(biāo)準(zhǔn)
.Net Framework完全支持現(xiàn)有的Internet技術(shù)和其他Web標(biāo)準(zhǔn)。
2. 使用統(tǒng)一的應(yīng)用程序模型
任何與.NET兼容的語言都可以使用.Net Framework類庫。
3. 易于開發(fā)人員使用
當(dāng)開發(fā)人員需要調(diào)用.Net Framework類庫的類時,只要將該類屬性命名空間添加到引用解決方案中即可。
4. 可擴展類
.Net Framework提供了通用類型系統(tǒng),開發(fā)人員可以通過繼承來訪問類庫中的類,也可以擴展類庫中的類,甚至于構(gòu)建自己的類庫。
C#的優(yōu)勢:(1) C# 是一種精確、簡單、類型安全、面向?qū)ο蟮恼Z言。
(2) C#具有生成持久系統(tǒng)級組件的能力。
(3) C# 利用.Net Framework的通用類型系統(tǒng)能夠與其他程序設(shè)計語言交互操作。
(4) C#支持MSMQ(微軟消息隊列)服務(wù)、COM+組件服務(wù)、XML Web服務(wù)和.Net Framework 。
(5) C#允許自定義數(shù)據(jù)類型、以擴展的元數(shù)據(jù)。
(6) C#增強了開發(fā)效率,同時也保持了開發(fā)者所需要的靈活性。
C#程序的特點:4. C#程序中的方法的結(jié)構(gòu)
C#程序中的一個方法由兩部分組成:方法頭部和方法體。
方法頭部:方法的頭部即方法的第1行,包括返回值類型、方法名、形參名及形參類型的說明。
方法體:方法體使用一對大括號“{ }”括起來,通常包含聲明語句和執(zhí)行語句。
5. C#程序的語句
C#程序中的每個語句必須以分號結(jié)尾,在書寫時,可以一行書寫幾條語句,也可以將一條語句分寫在幾行上。
6. C#程序的輸入與輸出操作
C#語言自身沒有輸入、輸出語句,因此C#控制臺應(yīng)用程序必須借助類庫中的Console類的方法(ReadLine、WriteLine等)來完成輸入、輸出等操作,而C# Windows應(yīng)用程序和Web應(yīng)用程序必須借助類庫的控件類(如標(biāo)簽、文本框等)來實現(xiàn)輸入、輸出。
7. C#程序的注釋
可以用“//”或“/*……*/”添加注釋。適當(dāng)?shù)奶砑幼⑨專梢源蟠笤鰪姵绦虻目勺x性。
簡單類型表示一個有唯一取值的數(shù)據(jù)類型,包括以下4種
類型:1. 整數(shù)型2. 浮點型3. 小數(shù)型4. 布爾型
float型:取值范圍在±1.5e?45 到 ±3.4e38精度為7位
double型:取值范圍在±5.0e?324 到 ±1.7e308精度為15到16位
3. 小數(shù)型decimal 為滿足高精度的財務(wù)和金融計算領(lǐng)域的需要,C#提供小數(shù)型數(shù)據(jù)類型
取值范圍在±1.0?×?10e?28 至 ±7.9?×?10e28精度為28到29位
4. 布爾型(bool)用來表示邏輯真或邏輯假只有兩種取值:true(真)或false (假)
5.程序運行過程中,其值始終不變的量稱為常量
1, 整型常量
整形常量分有符號的整型常量、無符號的整型常量和長整型常量
有符號的整型常量直接書寫,如5
無符號整型常量在書寫時添加u或U標(biāo)志,如5U
長整型常量在書寫時添加l或L標(biāo)記,如5L
2. 浮點型常量
浮點型常量分單精度浮點型常量和雙精度浮點型常量
單精度浮點型常量在書寫時添加f或F標(biāo)記,如5F
雙精度型常量添加d或D標(biāo)記,如5D
以小數(shù)形式直接書寫時,自動被解釋成雙精度浮點型常量,如5.0即為雙精度浮點型常量。
3. 小數(shù)型常量
小數(shù)型常量的后面必須添加m或M標(biāo)記,否則就會被解釋成浮點型數(shù)據(jù)。
4. 字符型常量 (Unicode字符):
字符型常量使用兩個單引號來標(biāo)記 ,例如’5’、 ’A’、 ’中’、 ’@’
C#的轉(zhuǎn)義字符常量以反斜杠’\’開頭,用來表示控制及不可見的字符,如’\b’表示倒退一個字符。詳見教材P26表2-3
5. 布爾型常量
只有兩個, true 表示邏輯真,false表示邏輯假。
6. 字符串常量
字符串常量表示若干個Unicode字符組成的字符序列,使用雙引號來標(biāo)記,例如”5”、”abc”、”中國人”。
結(jié)構(gòu)型必須使用struct來標(biāo)記。
結(jié)構(gòu)型的成員允許包含數(shù)據(jù)成員、方法成員等
數(shù)據(jù)成員表示結(jié)構(gòu)的數(shù)據(jù)項
方法成員表示對數(shù)據(jù)項的操作。
1. 變量的概念
在程序運行過程中,其值可以被改變的量稱為變量。
變量名:每個變量都必須有一個名字。變量命名應(yīng)遵循標(biāo)識符的命名規(guī)則,如必須以字母或下劃線打頭,只能包含英文字母、數(shù)字、和下劃線,不能包含空格等。
變量值:變量值存儲在內(nèi)存中;不同類型的變量,占用的內(nèi)存單元(字節(jié))數(shù)不同。在程序中,通過變量名來引用變量的值。
2. 變量的定義
變量定義的一般形式為:
數(shù)據(jù)類型 變量名1,變量名2,……;
例如:
int a,b,c; long x,y; float p1,p2;
3.變量的初始化
例如:
float f1=1.25, f2=3.6;
值類型之間的數(shù)據(jù)可以相互轉(zhuǎn)換,轉(zhuǎn)換的方法有兩種,一種是隱式轉(zhuǎn)換,另一種是顯式轉(zhuǎn)換。
1. 隱式轉(zhuǎn)換
如果參與運算的數(shù)據(jù)類型不相同,則先轉(zhuǎn)換成同一類型,然后進(jìn)行運算;
轉(zhuǎn)換時按數(shù)據(jù)長度增加的方向進(jìn)行,以保證精度不降低,例如int型和long型運算時,先把int數(shù)據(jù)轉(zhuǎn)成long型后再進(jìn)行運算;
所有的浮點運算都是以雙精度進(jìn)行的,即使僅含float單精度量運算的表達(dá)式,也要先轉(zhuǎn)換成double型,再作運算;
byte型和short型數(shù)據(jù)參與運算時,必須先轉(zhuǎn)換成int型;
Char型可以隱式轉(zhuǎn)換為ushort、int、uint、long、ulong、float、double或decimal型,但不存在其他類型到char類型的隱式轉(zhuǎn)換。
2. 顯式轉(zhuǎn)換
強制類型轉(zhuǎn)換的一般形式為:
(類型說明符) (待轉(zhuǎn)換的數(shù)據(jù))
例如:(int)(x+y) //把x+y的值強制轉(zhuǎn)換為int型
注意:上例不可寫為(int)x+y,另外經(jīng)過強制類型轉(zhuǎn)換后x、y本身的變量類型并不會改變
3. C#還允許使用System.Convert類提供的類型轉(zhuǎn)換方法來轉(zhuǎn)換數(shù)據(jù)類型
常用的轉(zhuǎn)換方法有ToBoolean 、ToByte、ToChar、ToInt32、ToSingle、ToString等
例如
byte x=40,y=5; //定義字節(jié)型變量x和y byte z=Convert.ToByte(x+y); //將int型值轉(zhuǎn)換為byte型并賦給byte型變量z char c=Convert.ToChar(z+20); //將int型值轉(zhuǎn)換為char型并賦給char型變量z
C#算術(shù)運算符包括+、-、*、/、%、++、--共七種
自增++/自減--運算符
當(dāng)++或--運算符置于變量的左邊時,稱之為前置運算,表示先進(jìn)行自增或自減運算再使用變量的值,而當(dāng)++或--運算符置于變量的右邊時,稱之為后置運算,表示先使用變量的值再自增或自減運算
例如:設(shè)變量i=1、變量j=2,則表達(dá)式++i + j-- 的值為4
2. 復(fù)合賦值運算符
+=、-=、*=、/=、%=、&=、|=、^=、<<=、>>=
1. 什么是數(shù)組
數(shù)組是一種由若干個變量組成的集合,數(shù)組中包含的變量稱為數(shù)組的元素,它們具有相同的類型。
數(shù)組元素可以是任何類型,包括數(shù)組類型。
數(shù)組元素的個數(shù)稱為數(shù)組的長度,數(shù)組長度為0時稱數(shù)組為空數(shù)組。
數(shù)組元素沒有名稱,只能通過索引來訪問,索引從零開始。
具有 n 個元素的數(shù)組的索引是從 0 到 n-1。
C#支持一維數(shù)組和多維數(shù)組。
2. 數(shù)組的聲明和創(chuàng)建
C#中的數(shù)組是一個對象,所以使用new運算符來創(chuàng)建
聲明和創(chuàng)建一維數(shù)組的一般形式:
數(shù)組類型[ ] 數(shù)組名 = new 數(shù)組類型[數(shù)組長度];
如:
int[ ] numbers=new int[5]; //創(chuàng)建具有5個元素的一維數(shù)組numbers
聲明和創(chuàng)建多維數(shù)組的一般形式:
數(shù)組類型[逗號列表] 數(shù)組名 = new 數(shù)組類型[數(shù)組長度列表]
如:
int[,,] numbers=new int[5,4,3]; //創(chuàng)建一個三維數(shù)組numbers
3. 數(shù)組的初始化
(1)在創(chuàng)建數(shù)組時初始化
創(chuàng)建一維數(shù)組時初始化的一般形式為:
數(shù)組類型[ ] 數(shù)組名 = new 數(shù)組類型[數(shù)組長度]{初始值列表};
如:
int[ ] numbers=new int[ ]{1,2,3,4,5} ;//當(dāng)省略數(shù)組長度時,則給出的數(shù)據(jù)個數(shù)即為數(shù)組長度
上例中numbers[0]=1,……,numbers[4]=5
在創(chuàng)建并初始化數(shù)組時,還可采用簡寫形式:
數(shù)組類型[ ] 數(shù)組名 ={初始值列表}
如
int[ ] numbers={1,2,3,4,5} ;
3. 數(shù)組的初始化
(2)在聲明一維數(shù)組后初始化數(shù)組
在聲明后初始化一維數(shù)組的一般形式為:
數(shù)組類型[ ] 數(shù)組名;
數(shù)組名 = new 數(shù)組類型[數(shù)組長度]{初始值列表};
如:
int[ ] numbers; numbers = new int[ ]{1,2,3,4,5} ;
注意在先聲明后初始化時,不能采用簡寫形式,例如:
int[ ] numbers; numbers = {1,2,3,4,5} ;
是錯誤的
4. 數(shù)組的使用:
每個數(shù)組元素相當(dāng)于一個普通變量,使用數(shù)組元素的一般形式為:
數(shù)組名[索引]
C#的數(shù)組類型是從抽象基類型System.Array派生的引用類型, System.Array類提供的Length屬性可以用來獲得數(shù)組的個數(shù)。
另外System.Array提供了Clear、CopyTo、Find、Resize、Sort等方法,用于清除數(shù)組元素的值、復(fù)制數(shù)組、搜索數(shù)組、更改數(shù)組長度和對數(shù)組元素排序等。
5.System.String與 System.Text.StringBuilder
C#的string 是.NET Framework中System.String 的別名,可創(chuàng)建不可變的字符串。其提供的常用屬性和方法有Length、Copy、IndexOf、LastIndexOf、Insert、Remove、Replace、Split、Substring、Trim等,分別用來獲得字符串長度、復(fù)制字符串、從左查找字符、從右查找字符、插入字符、刪除字符、替換字符、分割字符串、取子字符串、壓縮字符串的空白等。
System.Text.StringBuilder類用來構(gòu)造可變字符串,包含Length、Append、Insert、Remove、Replace、ToString等成員,分別用來獲得字符串長度、追加字符、插入字符、刪除字符、替換字符和將StringBuilder轉(zhuǎn)換為string字符串。
對象(Object),是問題域中某些事物的一個抽象,反映事物在系統(tǒng)中需要保存的必要信息和發(fā)揮的作用,是包含一些特殊屬性(數(shù)據(jù))和服務(wù)(行為方法)的封裝實體。
具體來說,對象應(yīng)有唯一的名稱、有一系列狀態(tài)(表示為數(shù)據(jù))、有表示對象行為的一系列行為(方法),如右圖所示。
對象=數(shù)據(jù)+動作(方法/操作)
1. 事件(Event)
又稱消息(Message)表示向?qū)ο蟀l(fā)出的服務(wù)請求。
2. 方法(Method)
表示對象能完成的服務(wù)或執(zhí)行的操作功能。
類(Class)是具有相同屬性和服務(wù)的一組對象的集合
類為屬于同類的所有對象提供統(tǒng)一的抽象描述。其中,相同的屬性是指定義形式相同,不是指屬性值相同。
對象是類的一個實例。
類與實例的關(guān)系是抽象與具體的關(guān)系,類是多個實例的綜合抽象,實例是類的個體實物。
面向?qū)ο蟮淖罨镜奶卣魇欠庋b性、繼承性和多態(tài)性:
1. 封裝
封裝就是指把對象的全部屬性和全部服務(wù)結(jié)合在一起形成一個不可分割的獨立單位。
封裝是一種信息隱蔽技術(shù),用戶只能見到對象封裝界面上的信息,對象內(nèi)部對用戶是隱蔽的。
封裝的目的在于將對象的使用者與設(shè)計者分開,使用者不必了解對象行為的具體實現(xiàn),只需要用設(shè)計者提供的消息接口來訪問該對象。
例如,各種有標(biāo)準(zhǔn)視頻接口的設(shè)備都可以連接電視機。
2.繼承
特殊類的對象擁有其一般類的全部屬性與服務(wù),稱作特殊類對一般類的繼承,即在特殊類中不必重新定義已在一般類中定義過的屬性和服務(wù),這種特性在面向?qū)ο笾蟹Q作對象的繼承性。
繼承在C#中稱為派生,其中,一般類稱為基類或父類,特殊類稱為派生類或子類。
例如靈長類動物稱為一般類,具有屬性包括手和腳(其它動物沒有),具有的服務(wù)是抓取東西(其它動物沒有),人類作為特殊的靈長類高級動物,除了繼承靈長類動物的所有屬性和服務(wù)外,還具有特殊的服務(wù)(創(chuàng)造工具)。
繼承機制的優(yōu)勢在于降低了軟件開發(fā)的復(fù)雜性和費用,使軟件系統(tǒng)易于擴充
3. 多態(tài)
多態(tài)性是指在基類中定義的屬性或服務(wù)被派生類繼承后,可以具有不同的數(shù)據(jù)類型或表現(xiàn)出不同的行為。
為了實現(xiàn)多態(tài)性,需要在派生類中更改從基類中自動繼承來的數(shù)據(jù)類型或方法。
這種為了替換基類的部分內(nèi)容而在派生類中重新進(jìn)行定義的操作,在面向?qū)ο蟾拍钪蟹Q之為覆蓋。
例如,假設(shè)機動車類是一個基類,它具有一個稱為更換輪胎的方法,但是當(dāng)從機動車派生火車類時,火車更話車輪的方法與一般的機動車不同,于是只能通過覆蓋的方法在火車類中重新定義一個更換車輪的方法,以替換其基類的方法。
多態(tài)性的優(yōu)勢在于使軟件開發(fā)更加方便,增加程序的可讀性。
類的常量成員是一種符號常量,必須指定名稱和值
訪問修飾符包括:public、private、internal、protected、protected internal。
在使用訪問修飾符來定義命名空間、結(jié)構(gòu)和類及其成員
時,需注意:
(1)一個成員或類型只能有一個訪問修飾符,使用protected internal組合時除外。
(2)命名空間上不允許使用訪問修飾符,命名空間沒有訪問限制。
(3)如果未指定訪問修飾符,則使用默認(rèn)的可訪問性,類成員默認(rèn)為private。
(4)頂級類型(不嵌套在其他類型中的類型)的可訪問性只能是internal或public,默認(rèn)可訪問性是internal。
定義方法的詳細(xì)說明
(1) 訪問修飾符控制方法的訪問級別,可用于方法的修飾符包括:public、protected、private、internal等等。
(2) 方法的返回值類型可以是任何合法的數(shù)據(jù)類型,包括值類型和引用類型。當(dāng)無返回值時,返回值類型使用void關(guān)鍵字來表示。
(3) 方法名必須符合C#的命名規(guī)范,與變量名命名規(guī)則相同。
(4) 參數(shù)列表是方法可以接受的輸入數(shù)據(jù)。當(dāng)方法不需要參數(shù)時,可省略參數(shù)列表,但不能省略圓括號。當(dāng)參數(shù)不止一個時,需要使用逗號作間隔,同時每一個參數(shù)都必須聲明數(shù)據(jù)類型,即使這些參數(shù)的數(shù)據(jù)類型相同也不例外。
(5) 花括號{}中的內(nèi)容為方法的主體,由若干條語句組成,每一條語句都必須使用分號結(jié)尾。當(dāng)方法結(jié)束時如果需要返回操作結(jié)果,則使用return語句返回,此時要注意return語句返回的值的類型要與方法返回值類型相匹配。如果方法使用void標(biāo)記為無返回值的方法,可省略return語句。
1. 值類型參數(shù)
調(diào)用方向方法傳遞值類型參數(shù)時,調(diào)用方將把實參變量的值賦給相對應(yīng)的形參變量,即實參變量和形參變量是兩個不相同的變量。
實參變量的值傳遞給形參變量時是一種單向值傳遞。
引用型參數(shù)
與值參數(shù)不同,調(diào)用方向方法傳遞引用類型參數(shù)時,調(diào)用方將把實參變量的引用賦給相對應(yīng)的形參變量。實參變量的引用代表數(shù)據(jù)值的內(nèi)存地址,因此,形參變量和實參變量將指向同一個引用。
如果在方法內(nèi)部更改了形參變量所引用的數(shù)據(jù)值,則同時也修改了實參變量所引用的數(shù)據(jù)值。
由于使用return語句一次只能返回一個數(shù)據(jù),如果需要返回多個數(shù)據(jù),則可以利用引用型參數(shù)的這個特點來實現(xiàn)。
C#通過ref關(guān)鍵字來聲明引用參數(shù),無論是形參還是實參,只要希望傳遞數(shù)據(jù)的引用,就必須添加ref關(guān)鍵字。
輸出參數(shù)
方法中的return語句只能返回一個運算結(jié)果,雖然也可以使用引用型參數(shù)返回計算結(jié)果,但要求先初始化實參。
而輸出參數(shù)不需要對實參進(jìn)行初始化,它專門用于把方法中的數(shù)據(jù)通過形參返回給實參,但不會將實參的值傳遞給形參。一個方法中可允許有多個輸出參數(shù)。
C#通過out關(guān)鍵字來聲明輸出參數(shù),無論是形參還是實參,只要是輸出參數(shù),都必須添加out關(guān)鍵字。
數(shù)組型參數(shù)
把數(shù)組作為參數(shù),有兩種使用形式:
一種是在形參數(shù)組前不添加params修飾符
另一種是在形參數(shù)組前添加params修飾符。
兩種形式的區(qū)別
不添加params修飾符時,所對應(yīng)的實參必須是一個數(shù)組名。
添加params修飾符時,所對應(yīng)的實參可以是數(shù)組名,也可以是數(shù)組元素值的列表。
值得注意的是,無論采用哪一種形式,形參數(shù)組都不能定義數(shù)組長度。
方法的重載
方法的重載是指在同一個類型中,以同樣的名稱聲明兩個或多個方法。當(dāng)需要以不同的參數(shù)列表執(zhí)行同樣的操作時,方法重載將會很有用。
2. 析構(gòu)函數(shù)的特點:
(1) 不能在結(jié)構(gòu)中定義析構(gòu)函數(shù),只能對類使用析構(gòu)函數(shù);
(2) 一個類只能有一個析構(gòu)函數(shù);
(3) 無法繼承或重載析構(gòu)函數(shù);
(4) 析構(gòu)函數(shù)既沒有修飾符,也沒有參數(shù);
(5) 在析構(gòu)函數(shù)被調(diào)用時,.Net Framework的CLR自動添加對基類Object.Finalize方法的調(diào)用以清理現(xiàn)場,因此在析構(gòu)函數(shù)中不能包含對Object.Finalize方法的調(diào)用。
注意,在默認(rèn)情況下,編譯器自動生成空的析構(gòu)函數(shù),因此C#不允許定義空的析構(gòu)函數(shù)
1. 靜態(tài)類的定義:
靜態(tài)類使用static關(guān)鍵字來聲明,表明它僅包含靜態(tài)成員。
不能使用new關(guān)鍵字創(chuàng)建靜態(tài)類的實例 。
在實際應(yīng)用中,當(dāng)類中的成員不與特定對象關(guān)聯(lián)的時候,就可以把它創(chuàng)建為靜態(tài)類。
2. 靜態(tài)類的主要功能:
(1) 靜態(tài)類僅包含靜態(tài)成員;
(2) 靜態(tài)類不能被實例化;
(3) 靜態(tài)類是密封的;
(4) 靜態(tài)類不能包含實例構(gòu)造函數(shù)。
3. 靜態(tài)類的優(yōu)點:
(1) 編譯器能夠自動執(zhí)行檢查,以確保不添加實例成員;
(2) 靜態(tài)類能夠使程序的實現(xiàn)更簡單、迅速,因為不必創(chuàng)建對象就能調(diào)用其方法。
注意:因為靜態(tài)類是密封的,因此不可被繼承。另外,靜態(tài)類不能包含實例構(gòu)造函數(shù),但仍可以聲明靜態(tài)構(gòu)造函數(shù),以分配初始值或設(shè)置某個靜態(tài)狀態(tài)。
(1) 派生類的特點
可以擁有自己的成員。
可以隱式地從基類繼承所有成員,包括方法、字段、屬性和事件,但私有成員、構(gòu)造函數(shù)和析構(gòu)函數(shù)等除外。
派生類只能從一個類中繼承
密封類
使用密封類可以阻止一個類的代碼被其他類繼承
使用密封類的好處:
可以提高應(yīng)用程序的可靠性和性能(在.NET Framework公共語言運行時CLR中,加載密封類時將對密封類的方法調(diào)用進(jìn)行優(yōu)化)。
軟件企業(yè)通過使用密封類還可以把自己的知識產(chǎn)權(quán)保護(hù)起來,避免他人共享代碼。
在C#中,添加關(guān)鍵字sealed可以聲明密封類。
4.為了使用派生類能更改基類的數(shù)據(jù)和行為,C#提供了兩種選擇:1.使用新的派生類成員替換基成員2. 重寫虛擬的基成員
使用virtual和override時要注意以下幾點:
(1)字段不能是虛擬的,只有方法、屬性、事件和索引器才可以是虛擬的;
(2)使用virtual修飾符后,不允許再使用static、abstract或override修飾符;
(3)派生類對象即使被強制轉(zhuǎn)換為基類對象,所引用的仍然是派生類的成員;
(4)派生類可以通過密封來停止虛擬繼承,此時派生類的成員使用sealed override聲明。
抽象類的特點:
抽象類是用來作為基類的,不能直接實例化,而且只能使用abstract關(guān)鍵字來標(biāo)識。抽象類的用途是提供多個派生類可共享的基類的公共定義。
抽象類可以包含抽象的成員,如抽象屬性和抽象方法,也可以包含非抽象的成員,甚至還可以包含虛方法。
抽象屬性的特點
類的屬性成員添加了abstract關(guān)鍵字后,就成了抽象屬性。
抽象屬性聲明不提供屬性訪問器的實現(xiàn),它只聲明該類支持的屬性,而將訪問器的實現(xiàn)留給派生類。
抽象屬性同樣可以是只讀的、只寫的或可讀寫的屬性。
當(dāng)派生類從抽象類中繼承一個抽象屬性時,派生類必須重載該抽象屬性。
抽象屬性使用abstract關(guān)鍵字來標(biāo)識
抽象方法的特點:
類的方法成員添加abstract關(guān)鍵字后,就成為抽象方法。
抽象方法聲明不提供方法的實現(xiàn),它必須是一個空方法,而將方法實現(xiàn)留給派生類。
當(dāng)派生類從抽象類中繼承一個抽象方法時,派生類必須重載該抽象方法。
由于抽象方法沒有實現(xiàn),因此,抽象方法不包含常規(guī)的方法體,以分號結(jié)尾。
1.委托(delegate)是一種引用方法的類型,它與類、接口和數(shù)組相同,屬于引用型。
在C#程序中,可以聲明委托類型、定義委托類型的變量、把方法分配給委托變量,還可以通過委托來間接地調(diào)用一個或多個方法。
一旦為委托分配了方法,委托將與該方法具有完全相同的行為。
C#允許把任何具有相同簽名(相同的返回值和參數(shù))的方法分配給委托變量。
委托的實質(zhì)是代表方法的引用(即內(nèi)存地址),是定義回調(diào)方法的理想選擇,也是C#實現(xiàn)事件驅(qū)動的編程模型的主要途徑。
委托具有以下特點:
(1)委托類似于 C++ 函數(shù)指針,是完全面向?qū)ο蟮?,是安全的?shù)據(jù)類型。
(2)委托允許將方法作為參數(shù)進(jìn)行傳遞。
(3)委托可用于定義回調(diào)方法。
(4)委托可以鏈接在一起。例如,可以對一個事件調(diào)用多個方法。
(5)委托簽名不需要與方法精確匹配。
集合是通過高度結(jié)構(gòu)化的方式存儲任意對象的類,與無法動態(tài)調(diào)整大小的數(shù)組相比,集合不僅能隨意調(diào)整大小,而且對存儲或檢索存儲在其中的對象提供了更高級的方法。
集合可以把一組類似的類型化對象組合在一起。
選擇集合類時,一般要考慮以下問題:
(1)是否需要一個序列列表,需要先進(jìn)先出行為時可使用 Queue 隊列類,在需要后進(jìn)先出行為時可使用 Stack棧類。
(2)是否需要隨機訪問集合中的元素,此時不能選擇Queue 隊列類、Stack棧類、LinkedList 雙向鏈表類。
(3)是否需要通過索引訪問每個元素,只有ArrayList動態(tài)數(shù)組類、StringCollection字符串集合類等是從索引為零的元素開始逐個訪問集合元素。Hashtable哈希表、Dictionary字典類通過元素的鍵(即元素名字)提供對元素的訪問。而NameValueCollection 類和SortedList 泛型類通過其元素的從零開始的索引,或者通過其元素的鍵提供對元素的訪問。
(4)是否包含一個值、一個鍵和一個值的集合,還是一個鍵和多個值的集合。其中,“一個值”的集合是一種基于 IList 列表接口派生的集合,“一個鍵和一個值”的集合是一種基于IDictionary字典接口的集合,“一個鍵和多個值”的集合是 NameValueCollection 類。
(5)是否需要用與輸入元素方式不同的方式對元素排序。Hashtable 哈希表類按其元素的哈希代碼對元素排序,SortedList有序表類以及 SortedDictionary有序字典根據(jù) IComparer 可比較接口來實現(xiàn)按鍵對元素的排序,而ArrayList動態(tài)數(shù)組類提供 Sort 排序方法。
(6)是否需要信息的快速搜索和檢索,對于小集合(10個元素或更少),ListDictionary 比 Hashtable 快,SortedDictionary 泛型類提供比 Dictionary 泛型類更快的查找。
(7)是否需要只接受字符串的集合,如使用StringCollection和 StringDictionary等。
動態(tài)數(shù)組類ArrayList不限制元素的個數(shù)和數(shù)據(jù)類型。
(1) ArrayList與Array的區(qū)別
Array 的大小是固定的,而 ArrayList的大小可根據(jù)需要自動擴充;
在Array中一次只能獲取或設(shè)置一個元素的值,而在ArrayList中允許添加、插入或移除某一范圍的元素;
Array 的下限可以自定義,而ArrayList的下限始終為零;
Array 可以具有多個維度,而 ArrayList始終只是一維的;
Array 位于 System 命名空間中,ArrayList 位于 System.Collections 命名空間中。
(2) 創(chuàng)建動態(tài)數(shù)組:
ArrayList 列表對象名 = new ArrayList(?);
隊列的特點
一種先進(jìn)先出的數(shù)據(jù)結(jié)構(gòu),當(dāng)插入或刪除對象時,對象從隊列的一端插入,從另外一端移除
創(chuàng)建隊列對象
Queue 隊列名 = new Queue([隊列長度][,增長因子]);
說明,隊列長度默認(rèn)為32,增長因子默認(rèn)為2.0(即每當(dāng)隊列容量不足時,隊列長度調(diào)整為原來的2倍)
注意,由于調(diào)整隊列的大小需要付出一定的性能代價,因此建議在構(gòu)造隊列時指定隊列的長度。
常用隊列操作方法包括Enqueue向隊尾添加數(shù)據(jù)、Dequeue移除隊頭數(shù)據(jù)、Peek返回隊頭數(shù)據(jù)、Clear清空隊列和Contains檢查是否包含某個數(shù)據(jù)等。其中,Enqueue和Dequeue每操作一次只能添加或刪除一個數(shù)據(jù)。
棧的特點:
一種先進(jìn)后出的數(shù)據(jù)結(jié)構(gòu),這種數(shù)據(jù)結(jié)構(gòu)在插入或刪除對象時,只能在棧頂插入或刪除。
創(chuàng)建棧對象:
Stack 棧名 = new Stack(?);
棧常用方法包括Push在棧頂添加數(shù)據(jù)、Pop移除棧頂數(shù)據(jù)、Peek返回棧頂數(shù)據(jù)、Clear清空棧和Contain檢查是否包含某個數(shù)據(jù)等。其中,Push和Pop每操作一次只能添加或刪除一個數(shù)據(jù)。
哈希表又稱散列表,表示鍵/值對的集合。
哈希表的特點:在保存集合元素時,首先要根據(jù)鍵自動計算哈希代碼,以確定該元素的保存位置,再把元素的值放入相應(yīng)位置所指向的存儲桶中。查找時,再次通過鍵所對應(yīng)的哈希代碼到特定存儲桶中搜索。這樣可以大大減少為查找一個元素進(jìn)行的比較次數(shù)。
創(chuàng)建哈希表對象
Hashtable 哈希表名 = new Hashtable([哈希表長度][,增長因子]);
說明,默認(rèn)長度為0,默認(rèn)增長因子為1.0
哈希表常用操作方法包括Add添加數(shù)據(jù)、Remove移除數(shù)據(jù)、Clear清空哈希表和Contains檢查是否包含某個數(shù)據(jù)等。其中, Add方法需要兩個參數(shù),一個是鍵,一個是值;Remove方法只需要一個鍵名參數(shù)。
接口索引器與類索引器的區(qū)別有兩個:
一是接口索引器不使用修飾符;
二是接口索引器只包含訪問器get或set,沒有實現(xiàn)語句。
創(chuàng)建自定義的泛型類時,需要特別注意以下事項:
(1)將哪些類型通用化為類型參數(shù)
一般規(guī)則是:能夠參數(shù)化的類型越多,代碼就會變得越靈活,重用性就越好,但太多的通用化會使其他開發(fā)人員難以閱讀或理解代碼。
(2)如果存在約束,應(yīng)對類型參數(shù)應(yīng)用什么約束
一般規(guī)則是:應(yīng)用盡可能最多的約束,但仍能夠處理需要處理的類型。例如,如果知道泛型類僅用于引用類型,則應(yīng)用類約束。這可以防止泛型類被意外地用于值類型。
(3)是否將泛型行為分解為基類和子類
由于泛型類可以作為基類使用,其注意事項與非泛型類相同。
(4)是否實現(xiàn)一個或多個泛型接口。
事件處理系統(tǒng)的構(gòu)成要素
(1) 事件源:指能觸發(fā)事件的對象,有時又稱為事件的發(fā)送者或事件的發(fā)布者;
(2) 偵聽器:指能接收到事件消息的對象,Windows提供了基礎(chǔ)的事件偵聽服務(wù);
(3) 事件處理程序:當(dāng)事件發(fā)生時對事件進(jìn)行處理,又稱事件函數(shù)或事件方法,包含事件處理程序的對象稱為事件的接收者,又稱事件的訂閱者。
C#中的事件具有以下特點:
(1) 事件是類用來通知對象需要執(zhí)行某種操作的方式;
(2) 盡管事件在其他時候(如信號狀態(tài)更改)也很有用,但通常還是用在圖形用戶界面中;
(3) 事件通常使用委托事件處理程序進(jìn)行聲明;
(4) 事件可以調(diào)用匿名方法來替代委托。
1. 事件的基本概念
觸發(fā)事件的對象稱為發(fā)布者,提供事件處理程序的對象稱為訂閱者。在.NET Framework中,基于事件驅(qū)動的程序使用委托來綁定事件和事件函數(shù),在C#中,事件實際上就是一個委托類型的變量。
C#允許使用內(nèi)置的EventHandler委托類型來聲明一個標(biāo)準(zhǔn)的事件,也允許先自定義委托,再聲明自定義事件。
在.NET Framework中,內(nèi)置的EventHandler委托具有兩個參數(shù),它們的數(shù)據(jù)類型分別是Object和EventArgs類型,并且沒有返回值。
Object參數(shù)名通常為sender,表示事件發(fā)布者本身;EventArgs參數(shù)通常為e,它將System.EventArgs類的新實例傳遞給事件函數(shù)。在實際編程中,有時需要從EventArgs類派生自定義事件參數(shù)類,這樣發(fā)布者可以將特定的數(shù)據(jù)發(fā)送給接收者的事件函數(shù)。
事件的聲明
(1) 使用內(nèi)置的EventHandler委托聲明事件的形式(標(biāo)準(zhǔn)事件)
格式:public event EventHandler 事件名;
其中,事件名通常使用on作為前綴符。
例如,public event EventHandler onClick;
(2) 使用自定義的委托類型聲明事件
格式:public delegate 返回值類型 委托類型名([參數(shù)]);
public event 委托類型名 事件名;
其中,委托類型的參數(shù)非常靈活,可以省略,可以是標(biāo)準(zhǔn)的Object參數(shù)和EventArgs參數(shù),也可以是其他參數(shù),但一定要注意保證與事件函數(shù)的參數(shù)匹配。
在訂閱事件時要把握好以下幾點:
(1)首先接收類必須具有與事件自身具有相同簽名(相同返回值類型和參數(shù))的方法,然后該方法(稱為事件處理程序)可以采取適當(dāng)?shù)牟僮鱽眄憫?yīng)該事件。
(2) 每個事件可有多個處理程序,多個處理程序按順序調(diào)用。如果一個處理程序引發(fā)異常,還未調(diào)用的處理程序則沒有機會接收事件?;谶@個原因,建議事件處理程序迅速處理事件并避免引發(fā)異常。
(3) 若要訂閱事件,接收器必須創(chuàng)建一個與事件具有相同類型的委托,并使用事件處理程序作為委托目標(biāo),還要使用加法賦值運算符 (+=) 將該委托添加到源對象的事件中。
(4) 若要取消訂閱事件,接收器可以使用減法賦值運算符(?=)從源對象的事件中移除事件處理程序的委托。
1. Windows窗體
Windows窗體是使用C#來建立基于窗口應(yīng)用程序的出發(fā)點。不過,從窗體本身來看,它只是一個可移動的界面而已。雖然用戶可以直接在窗體上繪制對象和文本,但是窗體的真正作用是充當(dāng)Windows控件的容器。
控件的本質(zhì)就是窗體的成員對象,用于顯示信息并且接收用戶輸入的信息。
2. Windows窗體命名空間
Windows窗體的基類是Form,在System.Windows.Forms命名空間中定義.
.NET中的大多數(shù)控件都派生于System.Windows.Forms.Control類,該類定義了控件的基本功能。
.NET Framework中的窗體控件
數(shù)據(jù)顯示 DataGridView
數(shù)據(jù)綁定和定位 BindingSource、BindingNavigator
文本編輯 TextBox、RichTextBox、MaskedTextBox
信息顯示 Lable、StatusStrip、ProgressBar
網(wǎng)頁顯示 WebBrowser
列表與選擇 CheckBox、CheckedListBox、ComboBox、RadioButton、ListBox、ListView、NumericUpDown、TreeView、DomainUpDown、TrackBar、
圖形顯示 PictureBox、ImageList
日期設(shè)置 DateTimePicker、MonthCalendar
對話框 ColorDialog、FontDialog、OpenFileDialog、PrintDialog、PrintPreviewDialog、FolderBrowerDialog、SaveFileDialog
命令 Button、LinkLabel、NotifyIcon、ToolStrip
菜單 MenuStrip、ContextMenuStrip
用戶幫助 HelpProvider、ToolTrip
將其他控件分組 Panel、GroupBox、TabControl、SplitContainer、TableLayoutPanel、FlowLayoutPane
控件的屬性
屬性名稱 說明
Anchor 獲取或設(shè)置控件綁定到的容器的邊緣并確定控件如何隨其父級一起調(diào)整大小
BackColor 控件的背景色
Bottom 控件下邊緣與其容器的工作區(qū)上邊緣之間的距離(單位:像素)
Dock 獲取或設(shè)置控件邊框??康狡涓缚丶⒋_定控件如何隨其父級一起調(diào)整大小
Enabled 控件是否可以對用戶交互作出響應(yīng)
ForeColor 控件的前景色
Height 控件的高度
Left 控件左邊緣與其容器的工作區(qū)左邊緣之間的距離(單位:像素)
Location 控件的左上角相對于其容器的左上角的坐標(biāo)。
Name 控件的名稱,這個名稱可以在代碼中用于引用該控件。
Parent 控件的父容器
Right 控件右邊緣與其容器的工作區(qū)左邊緣之間的距離(單位:像素)
Size 控件的高度和寬度
TabIndex 控件的 Tab 鍵順序
TabStop 指示用戶能否使用 Tab 鍵將焦點放到該控件上。
Text 與此控件關(guān)聯(lián)的文本
Top 控件上邊緣與其容器的工作區(qū)上邊緣之間的距離(單位:像素)
Visible 指示是否顯示該控件
Width 控件的寬度
按鈕控件
Button(按鈕)控件位于.NET Framework的System.Windows.Forms命名空間,它是從基類ButtonBase派生的?;怋uttonBase用于實現(xiàn)按鈕控件所需的基本操作。
Button控件是一種常用控件,在需要用戶做“確定”或“取消”之類的選擇,通常都使用Button控件。 Button控件支持鼠標(biāo)的單擊和雙擊操作,也可以用<Enter>鍵來進(jìn)行操作。
在設(shè)計時,通常在窗體上添加控件,然后雙擊它,為Click事件編寫代碼即可。在執(zhí)行程序時,單擊該按鈕就會執(zhí)行Click事件中的代碼。
Name屬性:用于設(shè)置對象的名稱,以便在代碼中引用。
系統(tǒng)自動給Button控件命名button1、button2……
最好給Name屬性設(shè)置一個有實際意義的名稱。
各種控件對象的Name屬性只能通過“屬性”窗口更改,該屬性在設(shè)計時有效,運行時為只讀。
Text屬性:以文本形式顯示在按鈕上的標(biāo)題文字。
除單擊按鈕外,還可以給按鈕定義“Alt+快捷鍵”,見P155圖7-2。
定義方法,在快捷鍵字母前面加上一個“&”字符。
例如:button1.Text = “確定(&Y)”; //顯示標(biāo)題為“確定(Y)”
Visible屬性:決定該按鈕是否可見
屬性值為true可見,為false隱藏。
當(dāng)一個控件不可見時,則不能響應(yīng)用戶的鼠標(biāo)和鍵盤操作。
Visible屬性在運行時生效。
Enabled屬性:決定該按鈕是否有效
屬性值為false時按鈕文字以灰色顯示,對用戶的操作不響應(yīng)。
FlatStyle屬性:決定該按鈕的樣式,值為FlatStyle枚舉型
FlatStyle枚舉型有4個枚舉值,分別為Flat(平面顯示)、Popup(平面顯示,但鼠標(biāo)移到時外觀為三維)、Standard(三維顯示)、System(外觀由操組系統(tǒng)決定),效果見P156圖7-3。
Button控件的FlatStyle屬性默認(rèn)為Standard。
Image屬性:指定一個在按鈕上顯示的圖像
ImageAlign屬性:設(shè)置圖像在按鈕上的對齊方式
標(biāo)簽控件
作用:主要用于在窗體上顯示文本
控件名:
Label:標(biāo)準(zhǔn)的Windows標(biāo)簽;
LinkLabel:類似于Label,但以超鏈接方式顯示 ,效果見圖7-4。
一般情況下,不需要為Label控件添加事件處理代碼,但在需要時也可以支持事件
標(biāo)簽控件的常用屬性
屬性名稱 說明
BorderStyle 控件的邊框樣式,默認(rèn)為無邊框
FlatStyle 設(shè)置平面樣式外觀。如果設(shè)置為PopUp,表示平面樣式,當(dāng)鼠標(biāo)指向它時,控件顯示為彈起樣式。
Image 顯示在 Label 上的圖像
ImageAlign 控件中顯示的圖像的對齊方式
LinkArea 文本中顯示為鏈接的范圍(只用于LinkLabel)
LinkColor 顯示普通鏈接時使用的顏色(只用于LinkLabel)
Links 獲取包含在 LinkLabel 內(nèi)的鏈接的集合 (只用于LinkLabel)
LinkVisited 鏈接是否顯示為如同被訪問過的鏈接(只用于LinkLabel)
TextAlign? 標(biāo)簽中文本的對齊方式
VisitedLinkColor 顯示以前訪問過的鏈接時所使用的顏色(只用于LinkLabel)
文本框控件
.NET FrameWork內(nèi)置兩個文本框控件: TextBox控件和RichTextBox控件,它們都派生于TextBoxBase,而TextBoxBase派生于Control類。
TextBoxBase提供了在文本框中處理文本的基本功能,例如選擇文本、剪貼、粘貼和相關(guān)事件。
TextBox用途主要是讓用戶輸入文本,也可以指定用戶輸入字符的類型,如只允許數(shù)值。默認(rèn)情況下一個文本框最多輸入2048個字符。如果將Multiline屬性設(shè)為true,則最多可輸入32k文本。用戶文本保存在Text屬性中,在程序中引用Text屬性即可獲得用戶輸入的文本。
RichTextBox多用于顯示和輸入格式化的文本(TextBox常用于錄入較短的文本字符), RichTextBox可以顯示字體、顏色和鏈接,從文件加載文本和加載嵌入的圖像,及查找指定的字符, RichTextBox也被稱為增強的文本框。
TextBox控件
屬性名稱 說明
CausesValidation? 是否驗證用戶輸入的有效性
CharacterCasing 是否在字符鍵入時修改其大小寫格式
MaxLength? 設(shè)置能輸入的最大字符數(shù),如果=0,則不受限制
Multiline 是否可以顯示多行文本
PasswordChar 設(shè)置密碼顯示字符
ReadOnly? 文本是否為只讀
ScrollBars 獲取或設(shè)置哪些滾動條應(yīng)出現(xiàn)在多行 TextBox 控件中
SelectedText? 表示當(dāng)前選定的文本
SelectionLength? 當(dāng)前選定的字符數(shù)
SelectionStart? 當(dāng)前選定的文本起始點
Text 當(dāng)前文本
WordWrap? 是否自動換行
事件名稱 說明
Enter? 進(jìn)入控件時發(fā)生這4個事件按列出的順序觸發(fā),它們被稱為“焦點事件”,當(dāng)控件的焦點改變時觸發(fā),但Validating和Validated僅在控件接收了焦點且其CausesValidation設(shè)置為true時實被觸發(fā)
Leave? 在輸入焦點離開控件時發(fā)生
Validating? 在控件正在驗證時發(fā)生
Validated? 在控件完成驗證時發(fā)生
KeyDown 這3個事件統(tǒng)稱為“鍵事件”,用于監(jiān)視和改變輸入到控件中內(nèi)容,KeyDown和KeyUp?接收與所按下鍵對應(yīng)的鍵碼,可以來確定是否按下了特殊了鍵,如Shift、Ctrl或F1。KeyPress接收與鍵對應(yīng)的字符
KeyPress
KeyUp?
TextChanged? 只要文本框中的文本發(fā)生了改變,就會觸發(fā)該事件
RichTextBox控件
屬性名稱 說明
CanRedo? 指示在 RichTextBox 內(nèi)發(fā)生的操作中是否有可以重新應(yīng)用的操作
CanUndo? 指示用戶在文本框控件中能否撤消前一操作
DetectUrls 當(dāng)在控件中鍵入某個URL時,RichTextBox 是否自動設(shè)置 URL 的格式
Rtf 與Text屬性相類似,但可包括RTF 格式的文本
SelectedRtf 獲取或設(shè)置控件中當(dāng)前選擇的 RTF 格式的格式化文本
SelectedText 獲取或設(shè)置 RichTextBox 內(nèi)的選定文本
SelectionAlignment 選定內(nèi)容或插入點的對齊方式,可以取值為Cente、Left或Right
SelectionBullet? 指示項目符號樣式是否應(yīng)用到當(dāng)前選定內(nèi)容或插入點
BulletIndent? 指定項目符號的縮進(jìn)像素值
SelectionColor 獲取或設(shè)置當(dāng)前選定文本或插入點的文本顏色
SelectionFont 獲取或設(shè)置當(dāng)前選定文本或插入點的字體
SelectionLength? 獲取或設(shè)置控件中選定的字符數(shù)
ShowSelectionMargin 如果把這個屬性設(shè)置為true,在RichTextBox左邊就會出現(xiàn)一個頁邊距,方便選擇文本
UndoActionName 獲取調(diào)用 Undo方法后在控件中可撤消的操作名稱
SelectionProtected 把這個屬性設(shè)置設(shè)置為true,可以指定不修改文本的某些部份
RadioButton控件
屬性名稱 說明
Appearance 獲取或設(shè)置一個值,該值用于確定 RadioButton 的外觀。
可選值:Normal和Button。每種類型都可顯示文本或圖像,或同時顯示兩者。
選擇Normal后的外觀: 。選擇Button后的外觀:
AutoCheck 如果這個屬性為true,用戶單擊單選按鈕時,會顯示一個選中標(biāo)記。如果該屬性為false,就必須在Click事件處理程序的代碼中手工檢查單選按鈕
CheckAlign 改變單選按鈕的復(fù)選框的對齊形式,值可為枚舉ContentAlignment 有效值之一。默認(rèn)值為 MiddleLeft,意為內(nèi)容在垂直方向上中間對齊,在水平方向上左邊對齊
Checked 獲取或設(shè)置一個值,該值指示是否已選中控件。如果選中控件,它就是true,否則為false
GroupBox控件
GroupBox (分組框)控件用于為其他控件提供可識別的分組。 通常,使用分組框按功能細(xì)分窗體。
當(dāng)移動單個GroupBox控件時,它包含的所有控件也會一起移動。
在窗體上創(chuàng)建GroupBox控件及其內(nèi)部控件時,必須先建立GroupBox控件,然后在其內(nèi)建立各種控件。
Panel控件
Panel (面板)控件類似于GroupBox 控件。二者的區(qū)別在于,只有GroupBox 控件能顯示標(biāo)題,只有Panel 控件可以有滾動條 。
若要顯示滾動條,需將 AutoScroll 屬性設(shè)置為 true 。
可以通過設(shè)置 BackColor、BackgroundImage 和 BorderStyle 屬性自定義面板的外觀 。
TabControl控件
屬性名稱 說明
Alignment 控制選項卡在控件中的顯示位置,默認(rèn)為控件的頂部
Appearance 控制選項卡的顯示方式,選項卡可以顯示為一般的按鈕或帶有平面的樣式
HotTrack 如為true,則當(dāng)鼠標(biāo)指針移過控件上的選項卡時,其外觀就會改變
Multiline 如為true,則可以以多行顯示選項卡
RowCount 返回當(dāng)前顯示的選項卡行數(shù)
SelectedItem 獲取或設(shè)置當(dāng)前選定的選項卡頁的索引
SelectedTab 獲取或設(shè)置當(dāng)前選定的選項卡頁,該屬性在TabPages的實例上使用
TabCount 獲取選項卡條中選項卡的數(shù)目。
TabPages 獲取該選項卡控件中選項卡頁的集合,使用這個集合可以添加和刪除TabPages對象
StatusStrip 控件中窗格的常用屬性
屬性名稱 說明
AutoSize 是否基于項的圖像和文本自動調(diào)整項的大小
Alignment 設(shè)定StatusStrip控件上窗格的對齊方式,可選項包括:Center、Left和Right
BorderStyle 設(shè)定窗格邊框的樣式,可選項如下:
None:不顯示邊框; Raised:窗格以三維凸起方式顯示;Sunken:窗格以三維凹起方式顯示
Image 設(shè)定窗格顯示的圖標(biāo)
MinimumSize 設(shè)定窗格在狀態(tài)欄中的最小寬度
Spring 指定項是否填滿剩余空間
Text 設(shè)定窗格的顯示文本
Width 設(shè)定窗格的寬度,取決于AutoSize屬性的設(shè)置,當(dāng)窗體大小改變時該屬性值可能會隨之變化
Show方法將返回一個DialogResult枚舉值指示對話框的返回值
成員 說明
Abort 對話框的返回值是 Abort(通常從標(biāo)簽為“中止”的按鈕發(fā)送)?
Cancel 對話框的返回值是 Cancel(通常從標(biāo)簽為“取消”的按鈕發(fā)送)?
Ignore 對話框的返回值是 Ignore(通常從標(biāo)簽為“忽略”的按鈕發(fā)送)?
No 對話框的返回值是 No(通常從標(biāo)簽為“否”的按鈕發(fā)送)?
None 從對話框返回了 Nothing。這表明有模式對話框繼續(xù)運行?
OK 對話框的返回值是 OK(通常從標(biāo)簽為“確定”的按鈕發(fā)送)?
Retry 對話框的返回值是 Retry(通常從標(biāo)簽為“重試”的按鈕發(fā)送)?
Yes 對話框的返回值是 Yes(通常從標(biāo)簽為“是”的按鈕發(fā)送)?
驅(qū)動器
.NET Framework提供DriveInfo類和DriverType枚舉型,以方便在程序中直接使用驅(qū)動器。 DriveInfo類和DriverType枚舉型位于System.IO命名空間。
DriveInfo類
作用:確定有關(guān)驅(qū)動器的信息,包括驅(qū)動器盤符、驅(qū)動器類型、驅(qū)動器上的可用空間等
常用成員:
字段:DriveFormat(文件系統(tǒng)格式,如NTFS或FAT32)、DriveType(驅(qū)動器類型)、Name(驅(qū)動器名)、TotalSize(總空間)、TotalFreeSpace(可用空間)
方法:GetDrives(獲得可用驅(qū)動器列表)
perType枚舉型
枚舉值有CDRom(光驅(qū))、Fixed(硬盤)、Network(網(wǎng)絡(luò)驅(qū)動器)、Removable(軟盤或U盤)等
目錄
.NET Framework提供Directory類和DirectoryInfo類 ,以方便在程序中直接操作目錄。 Directory類和DirectoryInfo類位于System.IO命名空間,都可以用來實現(xiàn)創(chuàng)建、復(fù)制、移動或刪除目錄等操作 。
Directory類
特點:靜態(tài)類,可以直接調(diào)用其方法成員,但調(diào)用每個方法成員都要執(zhí)行安全檢查,以確定用戶的操作權(quán)限。
常用方法成員:CreateDirectory(創(chuàng)建新目錄)、Delete(刪除目錄)、Exists(判斷目錄是否存在)、Move(移動目錄)、GetFiles(獲得目錄的文件列表)、GetDirectories(獲得子目錄列表)等
DirectoryInfo類
特點:非靜態(tài)類(必須實例化),需要先創(chuàng)建實例才能調(diào)用其方法成員,在創(chuàng)建實例時執(zhí)行安全檢查。
常用字段成員;Name(提取目錄名)、Exists(是否存在)、Parent(父目錄)、Root(根目錄)
常用方法成員:Create(創(chuàng)建目錄)、CreateSubDirectory(創(chuàng)建子目錄)、Delete(刪除目錄)、MoveTO(移動目錄)、GetFiles、GetDirectories等
代碼示例:P197
文件
NET Framework提供File類和FileInfo類 ,以方便在程序中直接操作文件。 File類和FileInfo類位于System.IO命名空間,都可以用來實現(xiàn)創(chuàng)建、復(fù)制、刪除、移動、打開文件等操作。
File類
特點:靜態(tài)類,可直接調(diào)用其方法成員。
常用方法成員:Open(打開文件)、Create(創(chuàng)建新文件)、Copy(復(fù)制文件)、Delete(刪除文件)、Exists(判斷文件是否存在)、Move(移動文件)、Replace(替換文件)、AppendAllText(新建文件并添加文本)、ReadAllText(打開并讀取文本內(nèi)容)等
FileInfo類
特點:非靜態(tài)類,需要先創(chuàng)建實例。
常用字段成員:Name(提取文件名)、Directory(所屬目錄)、Exists(是否存在)、Extension(文件擴展名)、Length(文件長度)、IsReadOnly(是否為只讀文件)
常用方法成員:Open、Create、CopyTo(復(fù)制到新文件)、Delete、MoveTo(移動文件)、Replace、EnCrypt(加密文件)、Decrypt(解密文件)等 。
代碼示例:P198
路徑
文件所在位置稱為路徑。路徑由驅(qū)動器盤符、目錄名、文件名、文件擴展名和分隔符組成。
路徑的表示方法
絕對路徑:從驅(qū)動器的根目錄開始書寫,例如C:\Windows\System32\notepad.exe
相對路徑:從當(dāng)前目錄位置開始書寫,例如System32\nodepad.exe(假設(shè)當(dāng)前目錄為C:\Windows)
C#將“\”字符視為轉(zhuǎn)義字符,因此當(dāng)路徑表示為字符串時,要使用兩個反斜杠表示,例如:
“C:\\Windows\\System32\\notepad.exe”
C#允許在字符串前添加“@”標(biāo)志,以提示編譯器不要把“\”字符視作轉(zhuǎn)義字符,而視作普通字符,例如:
@“C:\Windows\System32\notepad.exe”
NET Framework提供Path類 ,以幫助在程序中管理文件和目錄路徑。Path類位于System.IO命名空間,是一個靜態(tài)類。
Path類作用:靜態(tài)類,用來操作路徑的每一個字段,如驅(qū)動器盤符、目錄名、文件名、文件擴展名和分隔符等。
Path常用字段成員:PathSeparator(路徑分隔符)、DirectorySeparatorChar(目錄分隔符)、VolumeSeparatorChar(卷分隔符)
Path常用方法成員:GetDirecotryName(取目錄名)、GetFileName(取文件名)、GetExtension(取文件擴展名)、GetFullPath(取完整路徑)、GetTempPath(取操作系統(tǒng)的臨時文件路徑)等
流包括以下基本操作。
讀取(read):表示把數(shù)據(jù)從流傳輸?shù)侥撤N數(shù)據(jù)結(jié)構(gòu)中,例如輸出到字節(jié)數(shù)組中;
寫入(write):表示把數(shù)據(jù)從某種數(shù)據(jù)結(jié)構(gòu)傳輸?shù)搅髦?,例如把字?jié)數(shù)組中的數(shù)據(jù)傳輸?shù)搅髦校?br/>定位(seek):表示在流中查詢或重新定位當(dāng)前位置。
操作流的類
(1) Stream類
Stream類是所有流的抽象基類。
Stream類的主要屬性:CanRead(是否指出讀?。anSeek(是否支持查找)、CanTimeout(是否可以超時)、CanWrite(是否支持寫入) 、Length(流的長度)、Position(獲取或設(shè)置當(dāng)前流中的位置)、ReadTimeout(獲取或設(shè)置讀取操作的超時時間)、WriteTimeout(獲取或設(shè)置寫操作的超時時間)
Stream類的主要方法:BeginRead(開始異步讀操作)、BeginWrite(開始異步寫操作)、Close(關(guān)閉當(dāng)前流)、EndRead(結(jié)束異步讀操作)、EndWrite(結(jié)束異步寫操作)、Flush(清除流的所有緩沖區(qū)并把緩沖數(shù)據(jù)寫入基礎(chǔ)設(shè)備)、Read(讀取字節(jié)序列)、ReadByte(讀取一個字節(jié))、Seek(設(shè)置查找位置)、Write(寫入字節(jié)序列)、WriteByte(寫入一個字節(jié))
(2) StreamReader和StreamWriter類
一般用來操作文本文件
流讀取器StreamReader類用來以一種特定的編碼從字節(jié)流中讀取字符。
流寫入器StreamWriter類用來以一種特定的編碼向流中寫入字符。
(3) FileStream、MemoryStream和BufferStream類
文件流FileStream類:以流的形式來讀、寫、打開、關(guān)閉文件。
內(nèi)存流MemoryStream類:表示在內(nèi)存中創(chuàng)建流,以暫時保存數(shù)據(jù),有了它就無需在硬盤上創(chuàng)建臨時文件。
緩存流BufferStream類 :先把流添加到緩沖區(qū),再進(jìn)行讀/寫操作,使用緩沖區(qū)可以減少訪問數(shù)據(jù)時對操作系統(tǒng)的調(diào)用次數(shù)。
注意, FileStream類也具有緩沖功能,在創(chuàng)建FileStream類的實例時,只需要指定緩沖區(qū)的大小即可。
讀寫文本文件
文本文件是一種純文本數(shù)據(jù)構(gòu)成的文件,只保存了字符的編碼。
NET Framework支持的字符編碼
可以是ASCIIEncoding、UTF7Encoding、UTF8Encoding、UnicodeEncoding或UTF32Encoding
在.NET Framework中讀寫文本文件主要使用:
文件讀取器TextReader類和文本寫入器TextWriter類
它們的派生類流讀取器StreamReader類和流寫入器StreamWriter類
或StringReader和StringWriter類
TextReader類及其派生類常用方法:
Close(關(guān)閉讀取器并釋放系統(tǒng)資源)、Read(讀取下一個字符,如果不存在,則返回-1)、ReadBlock(讀取一塊字符)、ReadLine(讀取一行字符)、ReadToEnd(讀取從當(dāng)前位置直到結(jié)尾的所有字符)
TextWriter類及其派生類常用方法:
Close (關(guān)閉編寫器并釋放系統(tǒng)資源) 、Flush(清除當(dāng)前編寫器的所有緩沖區(qū),使所有緩沖數(shù)據(jù)寫入基礎(chǔ)設(shè)備)、Write(寫入文本流)、WriteLine(寫入一行數(shù)據(jù))
ASP.NET簡介
ASP.NET是一種動態(tài)網(wǎng)頁設(shè)計技術(shù),它比其他任何一種動態(tài)網(wǎng)頁設(shè)計技術(shù)更容易使用。它是一種可升級的Web應(yīng)用程序開發(fā)技術(shù),特別擅長于用戶交互和數(shù)據(jù)處理。
ASP.NET不是程序設(shè)計語言,是建立在.NET Framework基礎(chǔ)之上的程序設(shè)計框架,它用來創(chuàng)建Web應(yīng)用程序。
ASP.NET的語法與ASP 兼容,但ASP 應(yīng)用程序不能直接在ASP.NET環(huán)境下運行,需要適當(dāng)修改。
ASP.NET與ASP的最大區(qū)別在于:前者是編譯型的動態(tài)網(wǎng)頁技術(shù),而后者是解釋型的動態(tài)網(wǎng)頁技術(shù)。
ASP.NET比較流行的版本是1.1版、2.0版和3.0版。與Visual Studio.NET 2003一起發(fā)布的ASP.NET是1.1版,與Visual Studio.NET 2005一起發(fā)布的ASP.NET是2.0版。在2007年與Visual Studio.NET 2008一起發(fā)布的ASP.NET是3.0版。
ASP.NET的優(yōu)勢
可管理性 好
安全性 高
易于部署
性能較ASP和JSP來說大大增強
具有靈活的輸出緩存技術(shù)
使用Unicode編碼,實現(xiàn)了國際化
支持移動設(shè)備
擴展性和可用性 好
提供跟蹤服務(wù)和調(diào)試功能
集成于.NET Framework之中,功能強大
數(shù)據(jù)庫連接使用ADO.NET技術(shù)
設(shè)計Web應(yīng)用程序的一般步驟
利用VS 2005設(shè)計Web應(yīng)用程序的操作步驟
S1:新建網(wǎng)站
S2:設(shè)置網(wǎng)站位置
S3:添加網(wǎng)頁
S4:設(shè)計Web窗體
S5:設(shè)置窗體及窗體控件的屬性
S6:編寫程序
S7:執(zhí)行Web應(yīng)用程序
S8:查看運行結(jié)果
注意,詳細(xì)情況請參見教材
(1) 生成Web應(yīng)用程序
操作方法:在Visual Studio .NET 2005的解決方案資源管理器窗口中,右擊網(wǎng)站名并選擇“生成網(wǎng)站”
(2) 檢查Web服務(wù)器是否正常
如果要發(fā)布到本地計算機,則必須檢查本地計算機是否安裝了IIS
檢查IIS是否正常工作
表、記錄和字段
關(guān)系數(shù)據(jù)庫系統(tǒng)采用關(guān)系模型作為數(shù)據(jù)的組織方式。
表是按某一公共結(jié)構(gòu)存儲的一組相似數(shù)據(jù),類似于日常生活中的表格。
表按行列方式將相關(guān)的信息排列成邏輯組。表中的每一行稱為記錄。
列稱為字段
數(shù)據(jù)庫
數(shù)據(jù)庫將數(shù)據(jù)表表示為多個表的集合,通過建立表之間的關(guān)系來定義數(shù)據(jù)庫的結(jié)構(gòu)
所謂主鍵是指用來惟一標(biāo)識表中記錄的一個或一組字段。主鍵不允許有重復(fù)值。
外鍵是指用來連接另一個表、并在另一表中為主鍵的字段。
索引
在關(guān)系數(shù)據(jù)庫中,通常使用索引來提高數(shù)據(jù)的檢索速度。
記錄在表中是按輸入的物理順序存放的,當(dāng)為主鍵或其它字段建立索引時,數(shù)據(jù)庫管理系統(tǒng)將索引字段的內(nèi)容以特定的順序記錄在一個索引文件上。
檢索數(shù)據(jù)時,數(shù)據(jù)庫管理系統(tǒng)先從索引文件上找到信息的位置,再從表中讀取數(shù)據(jù)。
每個索引都有一個索引表達(dá)式來確定索引的順序,索引表達(dá)式既可是一個字段,也可是多個字段的組合。
可以為一個表生成多個索引,每個索引均代表一種處理數(shù)據(jù)的順序。
關(guān)系
關(guān)系數(shù)據(jù)庫的最大好處就是能夠避免數(shù)據(jù)的不必要的重復(fù),即可以將包含重復(fù)數(shù)據(jù)的表拆分成若干個沒有重復(fù)數(shù)據(jù)的簡單表,并通過建立表與表之間的關(guān)系來檢索相關(guān)表中的記錄。
在表與表的關(guān)系中,習(xí)慣上稱主表為父表,而通過關(guān)系連接的其他表為子表。
表與表之間可能會有4種關(guān)系
一對一關(guān)系:指父表中的記錄最多只與子表中的一條記錄相匹配,反之亦然;
一對多關(guān)系:指父表中的記錄與子表中的多條記錄有關(guān)。例如,對于客戶表和訂單表來講,每個訂單只與一個客戶有關(guān),而每個客戶可以有多個訂單,因此客戶表和訂單表是一對多的關(guān)系;
多對一關(guān)系:與一對多是互補的,即父表中的多條記錄與子表中的一條記錄相關(guān);
多對多關(guān)系:指父表中的多條記錄與子表中的多條記錄有關(guān)。
SQL簡介
SQL(Structured Query Language)語言是一個綜合的、通用的關(guān)系數(shù)據(jù)庫語言,其功能包括查詢、操縱、定義和控制。
目前,SQL標(biāo)準(zhǔn)有3個版本。
SQL-89
SQL-92
SQL3
Microsoft SQL Server使用的Transact-SQL是在SQL-92標(biāo)準(zhǔn)基礎(chǔ)上擴充而來的。
SQL的構(gòu)成
SQL由命令、子句和運算符等元素所構(gòu)成的,這些元素結(jié)合起來組成用于創(chuàng)建、更新和操作數(shù)據(jù)的語句。
SQL命令分兩大類DDL(數(shù)據(jù)定義語言)命令和DML(數(shù)據(jù)操縱語言)命令。DDL命令用于創(chuàng)建和定義新的數(shù)據(jù)庫、字段和索引,主要包含語句:create、drop、alter。DML命令用于創(chuàng)建查詢,以便從數(shù)據(jù)庫中排序、篩選和抽取數(shù)據(jù),主要包含語句:select、insert、update、delete。 P258
SQL子句用于定義要選擇或操作的數(shù)據(jù)。
select語句
select語句的功能是從現(xiàn)有的數(shù)據(jù)庫中檢索數(shù)據(jù)。
from子句指定數(shù)據(jù)的來源,即指出記錄來自哪些表。
where子句指定選擇記錄時要滿足的條件。
group by 子句對記錄分組。
having子句確定在帶group by子句的查詢中具體顯示哪些記錄,可以用having子句來顯示滿足指定條件的分組。
order by子句對記錄排序。
語句示例見P258-260
delete語句
delete語句的功能是刪除from子句列出的、滿足where子句條件的一個或多個表中的記錄。
如:
delete from Orders Where OrderId=16
insert語句
insert語句用于添加記錄到表中。
如:
insert into Orders
(CustID,ProductID,OrderDate,SendDate,Qty)
values(‘2’,’5’,’2008-8-12’,’2008-8-13’,1)
update語句
update語句按某個條件來更新特定表中的字段值。
如:
update Products set Price=8900 where Products.ProductId=3
ADO.Net概述
ADO.NET是一種Microsoft最新、最強大的數(shù)據(jù)庫訪問技術(shù),應(yīng)用程序通過ADO.NET可以非常方便地訪問并處理存儲在各種數(shù)據(jù)庫中的數(shù)據(jù)。
ADO.NET聚集了很多進(jìn)行數(shù)據(jù)處理的類,這些類有強大的對數(shù)據(jù)訪問、處理的功能,如索引、排序、瀏覽和更新。
ADO.NET集成在.NET Framework中,可以用于任何支持.NET的計算機語言,如C#。
ADO.NET主要包括與System.Data命名空間及其嵌套的命名空間,以及system.Xml命名空間等一些與數(shù)據(jù)訪問有關(guān)的專用類。
Data Provider
Data Provider提供了DataSet和數(shù)據(jù)庫之間的聯(lián)系,同時也包含了存取數(shù)據(jù)庫的一系列接口。通過數(shù)據(jù)提供者所提供的應(yīng)用程序編程接口(API),可以輕松地訪問各種數(shù)據(jù)源的數(shù)據(jù)。
.NET數(shù)據(jù)提供程序包括以下幾個:
SQL Server .NET 數(shù)據(jù)提供程序,用于Microsoft SQL Server 數(shù)據(jù)源,來自于System.Data.SqlClient 命名空間;
OLE DB .NET 數(shù)據(jù)提供程序,用于OLE DB 公開的數(shù)據(jù)源數(shù)據(jù)源,來自于System.Data.OleDb 命名空間;
ODBC.NET 數(shù)據(jù)提供程序,用于ODBC 公開的數(shù)據(jù)源來自于System.Data.Odbc 命名空間;
Oracle .NET 數(shù)據(jù)提供程序用于Oracle 數(shù)據(jù)源,來自于System.Data.OracleClient 命名空間。
Data Provider
.NET Data Provider有4個核心對象:
Connection對象用于與數(shù)據(jù)源建立連接;
Commmand對象用于對數(shù)據(jù)源執(zhí)行指定命令;
DataReader對象用于從數(shù)據(jù)源返回一個僅向前的(forward-only)只讀數(shù)據(jù)流;
DataAdapter對象自動將數(shù)據(jù)的各種操作變換到數(shù)據(jù)源相應(yīng)的SQL語句。
DataSet
ADO.NET和核心組件是DataSet。
可以將DataSet想像成內(nèi)存中的數(shù)據(jù)庫,它是不依賴于數(shù)據(jù)庫的獨立數(shù)據(jù)集。獨立是指即使斷開數(shù)據(jù)連接或關(guān)閉數(shù)據(jù)連接,DataSet依然可用。
在ADO.NET中,DataSet是專門用來處理從數(shù)據(jù)源獲得數(shù)據(jù),無論底層的數(shù)據(jù)是什么,都可以使用相同的方式來操作從不同數(shù)據(jù)源取得的數(shù)據(jù)。
DataSet內(nèi)部是用XML來描述數(shù)據(jù)的。XML是一種與平臺無關(guān)、數(shù)據(jù)無關(guān)且能描述復(fù)雜數(shù)據(jù)關(guān)系的數(shù)據(jù)描述語言。
ADO.NET操作數(shù)據(jù)庫的流程
首先使用Connection對象連接數(shù)據(jù)庫;
如果執(zhí)行不需要返回結(jié)果的數(shù)據(jù)庫執(zhí)行命令或存儲過程,可以使用Command對象;
DataReader對象用于從數(shù)據(jù)源中讀取僅向前和只讀的數(shù)據(jù)流。
DataSet是數(shù)據(jù)的內(nèi)存駐留表示形式,它提供了獨立于數(shù)據(jù)源的一致關(guān)系編程模型。DataSet表示整個數(shù)據(jù)集,其中包含表、約束和表之間的關(guān)系。
與現(xiàn)有數(shù)據(jù)源的交互通過 DataAdapter 來控制。DataAdapter對象用于從數(shù)據(jù)源中獲取數(shù)據(jù)、填充DataSet中和表和約束并將對DataSet的更改提交回數(shù)據(jù)源。
使用Connection對象訪問數(shù)據(jù)庫
連接數(shù)據(jù)庫步驟
(1)定義連接字符串
使用SQL Server身份驗證:
Data Source=服務(wù)器名;Initial Catalog=數(shù)據(jù)庫名; User ID=用戶名;Pwd=密碼
使用Windows身份驗證:
Data Source=服務(wù)器名;Initial Catalog=數(shù)據(jù)庫名;
Integrated Security=True
(2)創(chuàng)建 Connection 對象
SqlConnection connection = new SqlConnection(connString);
(3) 打開與數(shù)據(jù)庫的連接
connection.Open( );
使用Command對象訪問數(shù)據(jù)庫
使用 ExecuteNonQuery() 的步驟:
(1)創(chuàng)建 Connection 對象;
(2)定義sql 語句;
(3)創(chuàng)建 Command 對象;
(4)執(zhí)行 ExecuteNonQuery() 方法;
(5)根據(jù)返回的結(jié)果進(jìn)行處理。
關(guān)于C#中的概念介紹就分享到這里了,希望以上內(nèi)容可以對大家有一定的幫助,可以學(xué)到更多知識。如果喜歡這篇文章,不如把它分享出去讓更多的人看到。
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。