2023年C基礎(chǔ)知識需要特別注意的知識點_第1頁
2023年C基礎(chǔ)知識需要特別注意的知識點_第2頁
2023年C基礎(chǔ)知識需要特別注意的知識點_第3頁
2023年C基礎(chǔ)知識需要特別注意的知識點_第4頁
2023年C基礎(chǔ)知識需要特別注意的知識點_第5頁
已閱讀5頁,還剩27頁未讀 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)

文檔簡介

《C#4.0本質(zhì)論》學習筆記

一、值類型和引用類型的區(qū)別

值類型引用類型

1.直接包括值,變量引用的位置就是值存儲是對一種內(nèi)存位置的引用(內(nèi)存地

在內(nèi)存中實際存儲的位置。址),要去那個位置才能找到真正H勺數(shù)據(jù)

2.

3.數(shù)據(jù)存儲在棧的內(nèi)存區(qū)域中數(shù)據(jù)存儲在堆的內(nèi)存區(qū)域

4.在編譯時確定內(nèi)存量在運行時,從變量中讀取內(nèi)存地址,然后

到指定內(nèi)存地址中讀取數(shù)據(jù)。

5.復制數(shù)據(jù)的一種副本只復制數(shù)據(jù)的地址

6.將new用于值類型,會使用默認值初new,調(diào)用構(gòu)造函數(shù)生成一種對象(實例)

始化內(nèi)存

7.

二、裝箱與拆箱

1)裝箱:將一種值類型轉(zhuǎn)換成一種引用類型

2)首先在堆中分派好內(nèi)存;

1.一次內(nèi)存復制:棧上的值類型數(shù)據(jù)復制到堆上分派好的位置;

2.對象或接口引用得到更新,指向堆上的位置…

3.拆箱:將一種引用類型轉(zhuǎn)換為值類型

4.裝箱頻繁發(fā)生,會大幅影響性能;

5.不容許在lock。語句中使用值類型。

三、String與StringBuilder

1.String對象稱為不可變的(只讀),由于一旦創(chuàng)立了該對象,就不能修改該對象的值

2.StringBuilder此類體現(xiàn)值為可變字符序列的類似字符串的對象

四、String對象串聯(lián)操作總是用既有字符串和新數(shù)據(jù)創(chuàng)立新的對象。StringBuilder對象

維護一種緩沖區(qū),以便容納新數(shù)據(jù)口勺串聯(lián)。假如有足夠的空間,新數(shù)據(jù)將被追加到緩沖

區(qū)H勺末尾;否則,將分派一種新的、更大H勺緩沖區(qū),原始緩沖區(qū)中的數(shù)據(jù)被復制到新的緩

沖區(qū),然后將新數(shù)據(jù)追加到新的緩沖區(qū)。

五、String或StringBuilder對象的串聯(lián)操作的J性能取決于內(nèi)存分派H勺發(fā)生頻率。String

串聯(lián)操作每次都分派內(nèi)存,而StringBuHder串聯(lián)操作僅當StringBuilder對象緩沖區(qū)太

小而無法容納新數(shù)據(jù)忖才分派內(nèi)存。因此,假如串聯(lián)固定數(shù)量的String對象,則String

類更適合串聯(lián)操作。這種狀況下,編譯器甚至會將各個串聯(lián)操作組合到一種操作中。假

如串聯(lián)任意數(shù)量口勺字符串,則StringBuilder對象更適合串聯(lián)操作;例如,某個循環(huán)對顧

客輸入的任意數(shù)量的字符串進行串聯(lián)。

六、?和??時使用

1.可空修飾符?:為了申明可以存null的值類型變量。int?x=null;

使用??運算符分派默認值:expressionl??expression2.檢查第?種體現(xiàn)式與否為null,假如

為null,則返回笫二個體現(xiàn)式。

目前值為空時可認為null的類型被賦值給非空類型時將應用該默認值,如int?x=null;int

y=x??-l;o

三、const和readonly

1)const:

2)既然用于修飾字段,又可以修飾局部變量;

3)是在編譯時確定的值,不可以在運行時變化;

1.自動成為靜態(tài)字段,不能顯式申明為static

1)readonly:

2)只能用于字段(不能用于局部變量),

3)指出字段值只能從構(gòu)造函數(shù)中更改,或者直接在申明時指定。一一可以在運行時

賦值;

4)readony字段既可以是實例字段,也可以是靜態(tài)字段.

四、靜態(tài)組員和實例組員

1.靜態(tài)字段:重要存儲的是對于類的數(shù)據(jù),能由多種實例共享,需要使用static關(guān)鍵字

2.實例字段:存儲的是與對象關(guān)聯(lián)的數(shù)據(jù),只能從類的一種實例(對象)中訪問實例

字段。

3.靜態(tài)措施:不能直接訪問一種類中的實例字段,必須藜取類口勺一種實例,才能調(diào)用

任一實例組員(措施或字段)。

實例措施:將需要訪問實例數(shù)據(jù)的措施申明為實例措施。

靜態(tài)構(gòu)造函數(shù):用來對類(而不是類實例)進行初始化。

運行時會在“訪問類的一種靜態(tài)措施或者字段時“自動調(diào)用靜態(tài)構(gòu)造函數(shù)。

1.靜態(tài)類:不包括任何實例字段(或措施),申明時用static關(guān)鍵字。不能被實例化,

不能被繼承。

繼承:對一種既有的類型進行擴展,以包括附加的組員或?qū)崿F(xiàn)對基類組

員的定制。

protected訪問修飾符:在基類中定義只有派生類才能訪問的組員。

2.規(guī)則:要從一種派生類中訪問一種受保護的組員,必須在編譯時確定受保護的組員

是派生類(或者它口勺某個子類)的一種實例。

3.C#是一種單一繼承的語言,一種類不能直接從兩個類派生。

4.可以使用聚合處理多重繼承的問題

1)使用sealed修飾符,實現(xiàn)密封類(不能被繼承)

2)C#支持重寫實例措施和屬性,但不支持重寫字段或者任何靜態(tài)組員。

3)在基類中使用virtual修飾符標識每一種需要重寫的組員,

4)在派生類中,用override進行修飾。C#規(guī)定重寫措施顯式地使用override關(guān)鍵

字。

5.重寫一種組員時,會導致“運行時”調(diào)用派生得最遠的實現(xiàn)。

6.new修飾符:在基類面前隱藏了派生類的重新申明的組員。

7.抽象類:

8.僅供派生的類,不能被實例化。

1)包括抽象組員:不具有實現(xiàn)的一種措施或?qū)傩?,強制所有派生類提供實現(xiàn)。

2)多態(tài)性:同一種簽名可以有多種實現(xiàn)。

9.抽象組員是實現(xiàn)多態(tài)性的一種手段:基類指定措施的簽名,派生類提供詳細口勺實

現(xiàn);

10.可以運用多態(tài)性:調(diào)用基類的措施,當措施詳細曰派生類實現(xiàn)。

11.is和as運算符

1)is運算符驗證基礎(chǔ)類型

七、使用as運算符進行轉(zhuǎn)換:將對象轉(zhuǎn)換為一種特定的數(shù)據(jù)類型,若源類型不是固有

的目的類型,as運算符會將null值賦給目的。

八、接口

對接口口勺理解:

1)接口定義了一系列組員,不包括任何實現(xiàn),由繼承該接口的類實現(xiàn);

5)2)接口實現(xiàn)關(guān)系是--種“能做”關(guān)系:類“能做”接口規(guī)定的事情;

6)3)接口定義了一種“契約”:實現(xiàn)接口日勺類會使用與被實現(xiàn)的接口相似的簽名

來定義措施。

7)4)接口的宗旨是:定義由多種類共同遵守的一種契約,所有組員都自動定義

為publico

8)C#不容許為接口組員使用訪問修飾符。

1.通過接口可以實現(xiàn)多態(tài)性;

2.不能被實例化,不能使用new關(guān)鍵字來創(chuàng)立一種接口。

1)接口實現(xiàn):

一種類只能從一種基類派生,但可以實現(xiàn)多種接口;

顯式實現(xiàn):為了申明一種顯式接口組員實現(xiàn),需要在組員名之前附加接口名前

綴。

Stringf]IListable.ColumnValues

通過接口自身來調(diào)用它一一將對象轉(zhuǎn)型為接口;

Values=((IListable)contactl).Columnvalues

2)隱式實現(xiàn):類組員的簽名與接口組員的簽名相符。

3)調(diào)用時不需要轉(zhuǎn)型,可以直接調(diào)用。

4)組員若是關(guān)鍵的類功能,則隱式實現(xiàn);

3.假如一種組員的用途在實現(xiàn)類中不是很明確,就考慮使用一種顯式的實現(xiàn):

4.已經(jīng)有一種同名的類組員,則可以使用顯式實現(xiàn)。

1)接口繼承:

2)一種接口可以從另一種接口派生,派生H勺接口將繼承“基接口”的所有組員;

3)在用于顯式接口組員實現(xiàn)的一種完全限定的接口組員名稱中,必須引用最初申

明它的那個接口的名稱:

4)繼承:接口代表?份契約,而?份契約可指定另?份契約也必須遵守的條款。

5)通過接n可以實現(xiàn)多重繼承。

5.接口與類的比較

抽象類接口

僅供派生的類,不能被實例化不能實例化

定義了基類必須實現(xiàn)的抽象組員簽名接口日勺所有組員要在基類中實現(xiàn)

可以包括存儲在字段中H勺數(shù)據(jù)不能存儲任何數(shù)據(jù)。只能在派生類中指

定字段。處理這個問題的措施,是在接口

中定義屬性,但不能包括實現(xiàn)。

擴展性比接口好,不會破壞任何版本兼用更多的組員來擴展接口,會破壞版本

容性。在抽象類中,你可以添加附加口勺非兼容性。(只能再創(chuàng)立一種接口,該接口

抽象組員,它們可以由所有派生類繼承可以從原始接口派生)

九、重寫Equals()

1.“對象同一性”和“相等的對象值”

1)對象同一性:兩個引用,引用口勺是同一種實例;

2.相等的對象值:兩個引用,引用不同樣的實例,但兩個對象實例值是相等的。

3.只有引用類型才也許引用相等,值類型不也許引用相等(ReferenceEquals()對值

類型進行/裝箱,由于每一種實參都被裝到棧上的不同樣位置)。

1)實現(xiàn)Equals。:

2)檢查與否為null;

3)假如是引用類型,就檢查引用與否相等;(RcfcrcnccEquaM措施來判斷引用

與否相等)

4)檢查數(shù)據(jù)類型與否相等;

5)調(diào)用一種指定了詳細類型口勺輔助措施,它能將操作數(shù)視為要比較的類型,而

不是一種對象;

6)也許要檢查散列碼與否相等。(相等的兩個對象,不也許散列碼不同樣)

7)假如基類重寫了Equals(),就檢查base.Equals。;

8)比較每?種標識字段,判斷與否相等;

9)重寫GetHashCode()。

10)重寫==和!=運算符。

十、垃圾回收與資源清理

1.垃圾回收內(nèi)存

1)“運行時”的一種關(guān)鍵功能:回收不再被引用的對象所占用H勺內(nèi)存。

垃圾回收器只負責回收內(nèi)存,不處理其他資源,例如數(shù)據(jù)庫連接、句柄(文獻、

窗口等)、網(wǎng)絡(luò)端口以及硬件設(shè)備(例如串口)等;

垃圾回收器處理的是引用對象,并且只回收堆上的內(nèi)存;

2.終止器釋放資源

1)終止器:容許程序員編寫代碼來清理一種類"勺資源;

2)由垃圾回收器負責為一種對象實例調(diào)用終止器;

3)終止器會在上一次使用對象之后,并在應用程序關(guān)閉之前的某個時間運行。

4)終止器不容許傳遞任何參數(shù),不能被重載,不能被顯式調(diào)用,不容許使用訪

問修飾符;

3.終止器負責釋放像數(shù)據(jù)庫連接和文獻句柄這樣的資源,不負責回收內(nèi)存(回收內(nèi)

存是由垃圾回收器完畢)

4.防止在終止器中出現(xiàn)異常,例如采用空值檢查。

1)使用using語句進行確定性終止:

?)IDispcschS接I」用一種名為Di,peso。的措施釋放目前消耗的資源;

3)using語句在對象離開作用域時自動調(diào)用Dispose。措施釋放資源。

5.垃圾回收和終止

1)f-reachable隊列(終止隊列):是準備好進行垃圾回收,同步實現(xiàn)終止的所

有對象的一種列表;

假如一種對象有終止器,那么“運行時”只有在對象的終止措施被調(diào)用之后,才

能對這個對象執(zhí)行垃圾回收;

f-reachable隊列是一種“引用”列表,一種對象只有在它口勺終止措施得到調(diào)用,并

且對象引用從f-reachable隊列中刪除之后,才會成為“垃圾”。

十一、泛型

1)泛型類型概述:

2)運用泛型,可以在申明變量時創(chuàng)立用來處理特定類型H勺特殊數(shù)據(jù)構(gòu)造;

參數(shù)化類型,使特定泛型類型的每個變量均有相似口勺內(nèi)部算法;

中明泛型類:

publicclassStack<T>

(

privateT(]Jtems;

publicvoidPush(Tdata)

(

)

PublicTPop()

)

1)泛型口勺長處:

2)提供了一種強類型的編程模型:保證在參數(shù)化的類中,只有組員明確但愿的

數(shù)據(jù)類型才可以使用;

3)為泛型類組員使用值類型,不再導致到object的強制轉(zhuǎn)換,它們不再需要裝

箱操作;

1.性能得到了提高:穴再需要從object的強制轉(zhuǎn)換,從而防止了類型檢查:不再需

要為值類型執(zhí)行裝箱操作

1)由于防止了裝箱,因此減少了堆上H勺內(nèi)存的消耗;

2)泛型接口:

申明一種泛型接口:

InterfaceIPair<T>

TFirst{get;set;}

TSecond{get;set}

2.使用泛型接口,就可以防止執(zhí)行轉(zhuǎn)型,由于?參數(shù)化的接口能實現(xiàn)更強的編譯時綁

定;

3.在一種類中多次實現(xiàn)相似H勺接口:可以使用不同樣的類型參數(shù)來多次實現(xiàn)同一種

接口。

1)多種類型參數(shù):

2)泛型類型可以使用任意數(shù)量口勺類型參數(shù);

3)申明:

InterfaceIPair<TFirst,TSecond>

TFirstFirst{get;set;}

TSecondSecond{get;set}

}

PublicstructPair<TFirst,TSecond>:IPair<TFirst,TSecond>

(

PublicPair(TFirstfirst,TSecondsecond)

(

_First=first;

_Second=second;

4.約束

1)泛型容許為類型參數(shù)定義約束。這些約束強迫類型遵守多種規(guī)則;

2)約束申明了泛型規(guī)定的類型參數(shù)的特性。

為了申明一種約束,需要使用where關(guān)鍵字,后跟一對“參數(shù):規(guī)定”;其中,

“參數(shù)”必須是泛型類型中定義的一種參數(shù),而“規(guī)定”用于限制類型從中

派生的類或接口,或者限制必須存在一種默認構(gòu)造器,或者限制使用一種引

用/值類型約束,

接口約束:為了規(guī)定某個數(shù)據(jù)類型是必須實現(xiàn)某個接口,需要申明一種接口

約束。不需要執(zhí)行轉(zhuǎn)型,就可以調(diào)用一種顯式H勺接口組員'丈現(xiàn)。

申明一種接口約束:

publicclassBinaryTree<T>

whereT:System.lComparable<T>

(

PublicPair<BinaryTree<T?SubItems

(

get{return_Subltems;}

set

(

IComparable<T>first;

First=value.First.ltem;

)

)

)

3)基類約束:將構(gòu)建的類型限制為一種特定的類派生。

4)struct約束:將類型參數(shù)限制為一種值類型;

class約束:將類型參數(shù)限制為一種引用類型。

多種約束:對于任何給定的類型參數(shù),都可以指定任意數(shù)量H勺接口作為約束,

但基類約束只能指定?種,由于?種類可以實現(xiàn)任意數(shù)量的接口,但肯定只

能從一種類繼承。

publicclassEntityDictionary<Tkey,Tvalue>

:Dictionary<TKey,TValue>

whereTKey:IComparable<TKey>,IFormattable〃多種約束接口

whereTValue:EntityBase〃一種基類約束

5.構(gòu)造器約束:可以在指定了其他所有約束之后添加new(),指定類型參數(shù)必須有

一種默認構(gòu)造器。

6.繼承約束:約束可以由一種派生類繼承,但必須在派生類中顯式地指定這些約束。

7.泛型措施

1)雖然包容類不是泛型類,或者措施包括H勺類型參數(shù)不在泛型類H勺類型參數(shù)列

表中,也仍然使用泛型的措施;

為了定義泛型措施,需要緊接在措施名之后添加類型參數(shù)語法:

8.協(xié)變性和逆變性

1)協(xié)變性:將一種較詳細的類型賦給較泛化口勺類型。

2)逆變性:將較泛化的類型賦給較詳細的類型;

3)在C#4.0中使用out類型參數(shù)修飾符容許協(xié)變性;

9.在C#4.0中使用int類型參數(shù)修飾符容許逆變性;

1)泛型的內(nèi)部機制:

基于值類型的泛型的實例化:“運行時”會為每個新的參數(shù)值類型創(chuàng)立新的詳細

化泛型類型。

基于引用類型口勺泛型口勺實例化:使用一種引用類型作為類型參數(shù)來初次構(gòu)造一種

泛型類型時,“運行時”會創(chuàng)立種詳細化的泛型類型,并在QL代碼中用object

引用替代類型參數(shù),后來,“運行時”都會重用此前生成好的泛型類型的版本一

一雖然新的引用類型與第一次使用的引用類型不同樣。

十二、委托、Lambda體現(xiàn)式

1.委托:將措施作為對象封裝起來,容許在“運行時”間接地綁定一種措施調(diào)用;

所有委托類型都間接從System.Delegate派生,但System.Delegate不能顯式的成為

一種基類;

中明委托數(shù)據(jù)類型:

PublicdelegateboolComparisonHandler(intfirst,intsecond);

實例化委托:需要和委托類型自身的簽名對應的一種措施(相似H勺參數(shù)及參數(shù)類型、

相似的返回值);

classDelegateSample

publicdelegateboolComparisonllan1dpr(intFirst,intsecond);

publicstaticvoidBubb1eSort(int[]items,/omparisonlkiiilck'r

comparisonMcthoc)

(

inti,j,temp;

for(i=items.Length-1;i>=0;i-)

{

for(j-1;j<-i;j++)

(

if(comparisonMethod(items[j-1],itemsEj]))

(

temp=items[j-1];

iterns[j-1]=items[j];

items[j]=temp;

}

)

)

publicstaticboolGreaterThan(intfirst,intsecond)

returnfirst>second;

)

staticvoidMain(string[]args)

(

inti;

int[]items=newint[5];

for(i=0;i<items.Length;i++)

(

Console.Write("Enteraninteger:");

iterns[i]=int.Parse(Console.ReadLineO);

)

BubbleSort(items,GreaterThan):

for(1=0;i<items.Length;i++)

(

Console.VriteLine(iterns[i]);

}

}

)

1)匿名措施:

2)所謂匿名措施,就是沒有實際措施中明的委托實例,它們的定義是直接內(nèi)嵌

在代碼中;

3)BubbleSort(items,

delegatejntfirst,intsecond)

(

returnfirst>second;

);

1)系統(tǒng)定義的委托:Funco

2)在C#3.0中,存在一系列名為“Action”和“Func”的泛型委托;

3)System.Action代表無返回類型口勺委托;

4)System.Func代表有返回類型H勺委托;

5)Func的最終?種類型參數(shù)總是委托的返回類型,在它之前的類型參數(shù)則依次

對應于委托參數(shù)的類型:

6)可以用一,種Func泛型委托來替代一種顯式定義Rj委托。ComparisonHandler

可以用Func<in:,int,bool>來替代

2.Lambda體現(xiàn)式

1)Lambda體現(xiàn)式分為:語句Lambda和體現(xiàn)式Lambda;

Lambda運算符=>,可以理解成“用于”;

使用語句Lambda來傳遞委托:

BubbleSort(items,

(intfirst,intsecond)|

(

returnfirst>second;

)

);

2)C#規(guī)定用一對閱括號來封閉Lambda體現(xiàn)式的參數(shù)列表,不管與否指定了這

些參數(shù)的數(shù)據(jù)類型;

當編譯器能判斷出數(shù)據(jù)類型,并且只有一種輸入?yún)?shù)的時候,語句Lambda可

以帶圓括號:

IEnumerable<Process>

processes=Process.GetProcesses().Where(process=>{return

process.WorkingSet64>2A30;});

語句Lambda具有一種語句塊,因此可以包括零個或者更多口勺語句,而體現(xiàn)式

Lambda只有一種體現(xiàn)式,沒有語句塊;此時將Lambda運算符理解成“滿

足條件“;

BubbleSort(iterrs,(first,second)=>first<second);

〃理解成first和second滿足first不不小于second/9條件

3)Lambda體現(xiàn)式(和匿名措施)并非CLR內(nèi)部的固有構(gòu)造,它們的實現(xiàn)是由C#

編譯器在編譯時生成口勺。

4)persons.Where(person=>person.Name.ToUpper()==,"INIGOMONTOYA");

5)假定persons是一種Person數(shù)組,編譯器將Lambda體現(xiàn)式編譯成一種

Func<person,bool>委托類型,然后將委托實例傳給Where。措施。

6)體現(xiàn)式樹:假如?種Lambda體現(xiàn)式代表的是與體現(xiàn)式有關(guān)的數(shù)據(jù),而不是編

譯好日勺代碼,這種Lambda體現(xiàn)式就是“體現(xiàn)式樹”;

7)體現(xiàn)式樹轉(zhuǎn)換成的數(shù)據(jù)是一種對象圖,它由體現(xiàn),

十三、Lambda體現(xiàn)式和體現(xiàn)式樹的比較:

十四、體現(xiàn)式的語法都會在編譯時進行完整H勺語義分析驗證:不過,Lambda體現(xiàn)式在

CIL中被編譯成一種委托,而體現(xiàn)式樹被編譯成類型的一種數(shù)據(jù)構(gòu)造。

十五、事件

1.多播委托:一種委托變量可以引用一系列委托,在這一系列委托中,每個委托都

次序指向一種后續(xù)H勺委托,從而形成了一種委托鏈。

1)使用多播委托來編碼Observer模式(又叫publish-subscribe模式):

2)定義訂閱者措施:參數(shù)和返回類型必須和來自公布者類的委托匹配

3)定義公布者:只需一種委托字段,就可以存儲所有的訂閱者

4)連接公布者和訂閱者;

調(diào)用委托:當公布者中的屬性每次發(fā)生變化時,向訂閱者告知變化;

//cal1subscribers

OnTemperatureChange(value);//將溫度口勺變化發(fā)給多種訂

閱值cooler和heater對象

5)檢查空值:調(diào)用一種委托之前,要檢查它的值是不是空值;

6)將運算符應用于委托會返回一種新實例;

7)委托運算符:+=,獲取第一種委托,并將第二個委托添加到委托鏈中,使一種

委托指向下一種委托。第一種委托的措施調(diào)用之后,它會調(diào)用第二個委托。

8)+,運算符,在內(nèi)部都是使用靜態(tài)措施System.Delegate.Combine()?fl

System.Delegate.Remove。來實現(xiàn)[向。

9)次序調(diào)用

10)例子:

〃訂閱者1

vatofloatTemperature;

publicfloatTemperatur

gst{return.Temperature;}

S3t{Temperature=value;)

}

publi3Cooler(floattemperature)

Temperature=temperature;

publiDfloatTemperatu

g3t{returnTemperature;}

set{Temperature=value;

)

publicHeater(floattemperature)

publicvoidOnTemperatureChanged(floatnewTemperature)

if(newTemperature<Temperature)

System.Cor、。.WriteLine(z,Cooler:Offz,);

〃定義公布者

classThermosta

publicdelegatevoidipc-;i.u?':(floatnewTemperature);

//definetheeventpublisher

1

public'iiipc.1:i:AhiI.LPII;:n:IeOnTemperatureChan

get{returnOnTemperatureChange;}

set{OnTemperatureChange=value;}

private「I,OnTemperatureChange;

publicfloatCurrentTempera

{returnCurrentTemperature;}

if(value!=CurrentTemperature)

CurrentTemperature=value;

'/檢查空,

localOnChange=

eratureChange;

OnTemperatureChange(value);//將溫度日勺變化發(fā)給多種訂

privatefloatCurrentTemperature;

staticvoidMain(string[]args)

thermostat=new,?”」「();

heater=newlb(60);

cooler=newCoole:(80);

stringtemperature;

thermostat.OnTemperatureChange+=heater.OnTemperatureChanged;

thermostat.OnTemperatureChange+=cooler.OnTemperatureChanged;

Conso1e.Write("Entertemperature:;

temperature=(,.ReadLineO;

thermostat.CurrcntTcmporaturo=int.Parse(temperature);

C:)ns(I.ReadLineO;

}

2.事件

事件的作用:

封裝訂閱(使用event關(guān)鍵字,防止不小心取消了其他訂閱者),

1)封裝公布(只有包容類才能觸發(fā)一種事件告知);

2)事件的編碼規(guī)范:第?種參數(shù)sender是object類型H勺,它包括對調(diào)用委托的

那個對象的一種引用,第二個參數(shù)是System.EvenrArgs類型日勺(或者是從

System.EventArgs派生,但包括了事件附加數(shù)據(jù)H勺其他類型)。

3)泛型和委托:使用泛型,就可以在多種位置使用相似的委托數(shù)據(jù)類型,并在

支持多種不同樣H勺參數(shù)類型的同步保持強類型;

4)申明泛型委托類型:publicdelegatevoidEventHandler<T>(objectsender,!e)

whereT:EventArgs;

5)使用EventHanlder<T>,任何類假如需要一種特定的sender-EventArgs模式,

都不必申明它自己的委托定義。相反,它們可以共享同一種委托。

6)

十六、集合、Linq查詢

1)匿名類型:

2)完全由C#編譯器來實現(xiàn)H勺,而不會在“運行時”內(nèi)有顯式實現(xiàn);

3)當編譯器碰到匿名類型的語法時,會自動生成一種CIL類,其屬性和在匿

名類型申明中命名的值和數(shù)據(jù)類型是對應|向;

4)使用匿名類型H'、J隱式局部變量:varpatentl=new{Title="Hello",Value=v

World"};

5)是強類型的。

1.匿名類型是不可變的:一經(jīng)實例化,再更改它的某個屬性,就會導致編譯錯誤;

2.類型兼容:在同一程序集中,兩個匿名類型類型兼容日勺必要條件為屬性名、數(shù)

據(jù)類型和屬性次序都完全匹配。

1)隱式類型的局部變量:

3.碰到一種隱式類型的變量時,編譯淵會首先分析右側(cè)的體現(xiàn)式,確定它的類型,

根據(jù)所賦的數(shù)據(jù)類型來確定該變量的數(shù)據(jù)類型;

1)碰到顯式類型H勺局部變量時(并且申明的同步已賦值),例如strings="

Hell?!?;編譯器首先會根據(jù)左側(cè)明確申明口勺類型來確定s的類型,然后分析

右側(cè)H勺體現(xiàn)式,驗證右側(cè)的體現(xiàn)式與否適合賦給那個類型的變量;

4.集合初始化器:

5.使用集合初始化器,程序員可以采用和數(shù)組申明相似的方式,在一種集合的實

例化期間用一套初始的組員來構(gòu)造這個集合。

6.foreach和IEnumerable<T>

1)System.Collections.Generic.lEnumerator<T>和非泛型接口:容許用迭

代器模式來遍歷元素集合;

2)IEnumerator<T>從[Enumerator派生,lEiumerator接口包括3個組員:

boolMoveNextO,從集合中的一種元素移動到下一種元素:只讀屬

性Current,它返Is!目前元素;Reset()措施拋出一種

NotlmplementedException;

7.集合不直接支持IEnumerator<T>和lEnumerator接口;

8.IEnumerable<T>接口,唯一口勺措施就是GetEnumerator():返回支持

IEnumerator<T>[f9一種對象。

9.推遲執(zhí)行

1)Lambda體現(xiàn)式是可以傳遞到別的地方H勺委托一一是一種對措施的引用;申

明時,不執(zhí)行,在調(diào)用時才執(zhí)行。

10.隱式觸發(fā)Lambda體現(xiàn)式的執(zhí)行:foreach循環(huán)內(nèi)會觸發(fā)Lambda體現(xiàn)式的執(zhí)行;

調(diào)用Enumberable的Count。函數(shù),會再次為每一項觸發(fā)Lambda體現(xiàn)式;調(diào)用

ToArray()或者ToList。、ToDictionary^ToLookup(),會為每一項觸發(fā)Lambda體現(xiàn)

式;

11.使用“ToXXX”措施來轉(zhuǎn)換集合,返回的是原則查詢運算符已處理過口勺一種集

合;此時再遍歷新的成果集合,則不會再觸發(fā)Lanbda體現(xiàn)式

12.查詢體現(xiàn)式Linq

1)輸出H勺是一種IEnumerable<T>或IQueryable<T>集合;

2)from背面緊著的,是集合中的每一項

3)在select子句中,可以對from子句的體現(xiàn)式所搜集到的東西進行投射,獲

得完全不同樣口勺一種數(shù)據(jù)類型:

4)也是支持推遲執(zhí)行的。

5)C#編譯器將查詢體現(xiàn)式轉(zhuǎn)換成CLR能理解的措施調(diào)用

13.實現(xiàn)隱式執(zhí)行:編譯器將查詢體現(xiàn)式轉(zhuǎn)換成在目的上調(diào)用日勺措施,它獲取委托

作為參數(shù),直到后來執(zhí)行時才拿出來使用。

14.集合

集合接口:

IList<T>:用于支持通過索引來獲取值;繼承ICcllection<T>

IDictionary<TKey,TValue>:通過鍵來獲取值;繼承ICollection<T>

IComparable<T>:實現(xiàn)排序,有,種Compare-。。措施

1)ICollection<T>:包括兩個組員:Count和CopyTo();繼承IEnumerable<T>

2)列表集合類:List<T>

3)字典集合:Dictionary<TKey,TValue>存儲H勺是一種“名稱/值”對;其中名稱

相稱于一種獨一無二H勺鍵,可以運用它查找對應H勺元素;運用鍵來進行查

找效率非常高(由于鍵存儲在一種散列表中)

4)字典類沒有特定H勺次序,元素使用散列碼存儲在一種散列表中,這樣可以

實現(xiàn)迅速檢索。

已排序集合:

SortedDictionary<Tkey,TValue>:按照鍵排序的

5)SortedList<T>:按照值排序的

棧集合:Stack<T>后入先出

Push。措施將元素送人集合,元素不必是唯一口勺:

Pop()措施按照與添加時相反的次序獲取并刪除元素;

Peek()措施返回Pop()措施將獲取H勺下一種元素

Contains。措施用于判斷一種元素與否存在于棧的某個地方

隊列集合:Q」eue<T>先入先出

Enqueue。措施:入隊(在隊列的一端將對象放入隊列)

6)Dequeue。措施:出隊(從另一端移除它們)

15.鏈表:LinkedList<T>:容許正向和反向遍歷

16.索引運算符

1)一對方括號,一般用于索引一種集合;

2)為了定義一?種索引運算符,必須將組員命名為this,并在它背面添加一對

方括號來標識參數(shù)

3)索引器([])H勺CIL屬性名稱默認為Item

17.迭代器

1)描述了怎樣循環(huán)遍歷(也就是迭代)集合類中的數(shù)據(jù);

2)C#編譯器碰到一種迭代器,會把它口勺內(nèi)容擴展成實現(xiàn)了枚舉數(shù)模式的CIL

代碼;

3)迭代器類似于函數(shù),但它不是返回(return)值,而是生成值;

4)迭代器用內(nèi)置的狀態(tài)機去跟蹤目前和下一種元素。迭代器每次碰到新的

yieldreturn語句時,都會返回值。然后,當下一次迭代開始口勺時候,會緊

接在卜.一種yieldreturn語句之后執(zhí)行。

5)一種迭代

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
  • 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

最新文檔

評論

0/150

提交評論