好久的資料了,拿出來(lái)分享給大家,主要是記錄一些面試題整理。
Main函數(shù)是什么?在程序中使用Main函數(shù)有什么需要注意的地方?
Q:程序的入口函數(shù)!函數(shù)名字不能改變;一個(gè)程序中有且只有一個(gè)Main函數(shù)。
CLR是什么?程序集是什么?當(dāng)運(yùn)行一個(gè)程序集的時(shí)候,CLR做了什么事情?
Q:Common Language RunTime 公共語(yǔ)言運(yùn)行時(shí)。
編譯后代碼的集合。(包括exe和dll)。 加載項(xiàng)目里所有的類(lèi)到內(nèi)存,并找到其中的主函數(shù),并作為默認(rèn)的啟動(dòng)函數(shù)調(diào)用執(zhí)行。
值類(lèi)型的默認(rèn)值是什么?(情況一:字段或全局靜態(tài)變量;情況二:局部變量)
Q:如果是全局變量,并且沒(méi)賦值,就會(huì)有默認(rèn)值,如:int 是0;bool 是false;枚舉enum;結(jié)構(gòu)體struct;
如果是局部變量,就必須手動(dòng)賦值。
聲明一個(gè)變量時(shí)在內(nèi)存中做了什么事情?初始化一個(gè)變量的時(shí)候又在內(nèi)存中做了什么事情?
Q:在棧中開(kāi)辟空間,并將變量放入空間里,默認(rèn)值都是null。
初始化時(shí):
如果是值類(lèi)型,則直接放入棧中;
如果是引用類(lèi)型,則在堆中開(kāi)辟一塊空間,將堆中對(duì)象的地址指針?lè)湃霔V?/p>
new關(guān)鍵字做的事情?
Q:開(kāi)辟空間,創(chuàng)建對(duì)象,調(diào)用構(gòu)造函數(shù),返回堆地址。
還可以 顯示的隱藏 父類(lèi)的同名方法。
數(shù)組
061.數(shù)組一旦創(chuàng)建后,能不能修改數(shù)組的長(zhǎng)度?
Q:不能。為什么呢?數(shù)組是引用類(lèi)型。它在創(chuàng)建時(shí),已經(jīng)根據(jù)創(chuàng)建的長(zhǎng)度在內(nèi)存中開(kāi)辟一塊連續(xù)的空間。
多維數(shù)組 本質(zhì)就是一個(gè)一位數(shù)組,只不過(guò)訪問(wèn)的 時(shí)候需要使用多個(gè)下標(biāo)訪問(wèn)
071.如何聲明一個(gè)多維數(shù)組?
Q:多維數(shù)組string[,] strArr=new string[3,3];
072.如何獲取多維數(shù)組的總長(zhǎng)度?
Q:各個(gè)緯度元素的個(gè)數(shù)的乘積
交錯(cuò)數(shù)組
081.如何聲明一個(gè)交錯(cuò)數(shù)組?
Q:交錯(cuò)數(shù)組:int[][] arr=new int[3][3];
082.交錯(cuò)數(shù)組的本質(zhì)是什么?
Q:本質(zhì)是一個(gè)數(shù)組的數(shù)組。簡(jiǎn)單的說(shuō)這個(gè)數(shù)組的元素是一個(gè)數(shù)組。
面向?qū)ο螅ㄒ唬?/h2>
01.為什么要有方法?
Q:為了復(fù)用。(封裝)(重復(fù)調(diào)用,封裝具體實(shí)現(xiàn))
02.如何實(shí)現(xiàn)方法的重載?
Q:方法名相同,但參數(shù)列表不同。(和返回值無(wú)關(guān))
03.引用參數(shù)(ref)和輸出參數(shù)(out)的相同點(diǎn)與不同點(diǎn)?
Q:相同點(diǎn):傳遞的都是(棧)引用。
不同點(diǎn):
out側(cè)重于輸出參數(shù);ref側(cè)重于修改;
out必須方法返回之前賦值;ref必須在傳入之前賦值。
04.在什么情況下使用引用參數(shù)(ref)和輸出參數(shù)(out)?
Q:如果方法有多個(gè)返回值,則可以用out或者ref。只不過(guò)ref側(cè)重于修改(即將值傳進(jìn)去修改后再拿出來(lái));而out是為了從方法中獲得一個(gè)值后拿到方法外使用。
05.可變參數(shù)與普通數(shù)組參數(shù)的區(qū)別?
Q:params關(guān)鍵字。
特點(diǎn):
一個(gè)方法中只能有一個(gè)可變參數(shù);
而且必須放在參數(shù)列表最后;
如果沒(méi)有給可變參數(shù)賦值,就初始化長(zhǎng)度為0;
01.面向?qū)ο蟮娜筇卣魇鞘裁矗?
Q:封裝;繼承;多態(tài);
02.類(lèi)和對(duì)象的關(guān)系?
Q:抽象和具體的關(guān)系。類(lèi)是抽象(模板,設(shè)計(jì)圖紙),對(duì)象是具體(按照?qǐng)D紙?jiān)O(shè)計(jì)的房子)。類(lèi)是對(duì)對(duì)象的抽象描述,而對(duì)象是類(lèi)的具體化。
03.創(chuàng)建某一個(gè)類(lèi)的對(duì)象的時(shí)候,在內(nèi)存中做了什么事情?例如 Person p = new Person();
Q:開(kāi)辟空間,創(chuàng)建對(duì)象,調(diào)用構(gòu)造函數(shù)。(在內(nèi)存的堆中開(kāi)辟空間,創(chuàng)建Person對(duì)象,然后在內(nèi)存的棧中開(kāi)辟一個(gè)放一個(gè)p,然后將Person對(duì)象在堆中的引用地址賦值給對(duì)象p)
04.屬性存在的目的是什么?
Q:封裝字段。為了對(duì)字段的操作設(shè)置規(guī)則。(本質(zhì)是兩個(gè)方法,一個(gè)get方法和一個(gè)set方法)
05.訪問(wèn)修飾符有哪些并分別每一個(gè)訪問(wèn)修飾符?
Q:public(公有的),
private(只有本類(lèi)可以訪問(wèn)),
internal(程序集內(nèi)共享,如果不寫(xiě)修飾符,默認(rèn)就是internal),
protected(本類(lèi)和子類(lèi)可以訪問(wèn)),
extern(供外部訪問(wèn),eg:C#提供接口給C++訪問(wèn))
06.為什么要有構(gòu)造函數(shù)呢?
Q:主要方便程序猿在實(shí)例化對(duì)象的時(shí)候就為對(duì)象里的一些屬性和字段初始化賦值。
07.什么是封裝?封裝的目的是什么?
Q:封裝就是將對(duì)象的字段、行為和功能等“弄”到一起。
封裝的目的:隱蔽代碼實(shí)現(xiàn)/復(fù)用/修改方便
08.類(lèi)的命名規(guī)則是什么?
Q:類(lèi)命名:首字母大寫(xiě)(帕斯卡命名)。變量命名:首字母小寫(xiě)(駱駝命名)
面向?qū)ο螅ǘ?/h2>
01.什么是類(lèi)型?
Q:用來(lái)定義某一種數(shù)據(jù)在內(nèi)存里開(kāi)辟空間的大小,還可以預(yù)置操作此種類(lèi)型數(shù)據(jù)的相關(guān)方法
02.this關(guān)鍵字在方法中使用時(shí),它代表什么?
Q:this指當(dāng)前類(lèi)的對(duì)象,或者他的父類(lèi)的類(lèi)對(duì)象。
base只能指向父類(lèi)的對(duì)象。
03.值類(lèi)型變量的初始化(內(nèi)存分配)?(兩種情況:一是類(lèi)的成員變量,二是:方法的局部變量)
Q:1、當(dāng)變量是一個(gè)類(lèi)的成員變量的時(shí)候,那么該變量是跟隨累的對(duì)象存在于堆內(nèi)存。當(dāng)對(duì)象引用斷開(kāi)時(shí),等著垃圾回收器進(jìn)行清理時(shí)便被銷(xiāo)毀
2、當(dāng)變量是一個(gè)方法的局域變量時(shí),那么該變量是在方法被調(diào)用時(shí),存在于棧內(nèi)存,方法執(zhí)行完畢后被銷(xiāo)毀
04.繼承
041.繼承的好處?
Q:1.提高代碼的復(fù)用;
2.實(shí)現(xiàn)多態(tài);
042.繼承的單根性
Q:一個(gè)類(lèi)只能繼承一個(gè)父類(lèi)。
043.繼承的傳遞性
Q:指子類(lèi)只能繼承父類(lèi)的非私有的成員。
044.當(dāng)存在繼承關(guān)系的時(shí)候,在子類(lèi)中如何訪問(wèn)父類(lèi)的非私有成員?
Q:通過(guò)base關(guān)鍵字--(只能獲取父類(lèi)的)(base就是存在于子類(lèi)對(duì)象里,用來(lái)指向父類(lèi)對(duì)象的指針)
或者通過(guò)this關(guān)鍵字--(可以獲取父類(lèi)的非私有的成員和本類(lèi)的成員)
05.什么是里氏替換原則?
Q:子類(lèi)替換父類(lèi)所在的位置
06.子類(lèi)與父類(lèi)對(duì)象之間的轉(zhuǎn)換?
Q:子類(lèi)可以強(qiáng)制轉(zhuǎn)換為父類(lèi),但是父類(lèi)不能轉(zhuǎn)換為子類(lèi)。
07.is 和 as 操作符的用處和區(qū)別?
Q:is是對(duì)類(lèi)型的判斷,返回bool。(判斷A是否是B類(lèi),或者A是不是B的子類(lèi))。(如果一個(gè)對(duì)象是某個(gè)類(lèi)型或是其父類(lèi)型的話就返回true,否則就會(huì)返回為false。另外is操作符永遠(yuǎn)不會(huì)拋出異常。
as是用來(lái)做類(lèi)型轉(zhuǎn)換的。as只能針對(duì)引用類(lèi)型的轉(zhuǎn)換。as 是先判斷再轉(zhuǎn)換(as 操作符首先測(cè)試轉(zhuǎn)換是否合法,如果合法就轉(zhuǎn)換,否則返回NULL。不會(huì)報(bào)錯(cuò))
這兩者都不會(huì)拋出異常。
08.override可以重寫(xiě)哪些 “類(lèi)型” 的方法?
Q:可以重寫(xiě)虛方法(virtual)–必須有方法體
還可以重寫(xiě)抽象方法 (abstract)–沒(méi)有方法體
09.什么是多態(tài)?
Q:就是用某個(gè)子類(lèi)來(lái)實(shí)例化父類(lèi),調(diào)用的是父類(lèi)的抽象方法(虛方法),但實(shí)際執(zhí)行的是子類(lèi)實(shí)例重寫(xiě)的方法
10.抽象方法只能定義在抽象類(lèi)中嗎?
Q:是的。
(virtual or abstract members cannot be private)
面向?qū)ο螅ㄈ?/h2>
01.CLR什么時(shí)候加載類(lèi)?
Q:是在第一次在代碼中遇到這個(gè)類(lèi)的時(shí)候才加載類(lèi)的靜態(tài)成員和信息。(為了節(jié)約資源,只在用的時(shí)候才開(kāi)始加載進(jìn)去)
02.當(dāng)存在繼承關(guān)系的時(shí)候,創(chuàng)建子類(lèi)對(duì)象的時(shí)候會(huì)不會(huì)創(chuàng)建父類(lèi)對(duì)象呢?
Q:這個(gè)很易錯(cuò)?。。。‘?dāng)我們創(chuàng)建一個(gè)子類(lèi)時(shí)不會(huì)創(chuàng)建父類(lèi)對(duì)象,只會(huì)有一個(gè)對(duì)象。Person c=new Student(),(當(dāng)我們new一個(gè)子類(lèi)的時(shí)候,在內(nèi)存中,只有一個(gè)子類(lèi)對(duì)象)
??!–!!—-那下面括號(hào)里面的就是錯(cuò)誤的?。?!
(new子類(lèi)時(shí),先創(chuàng)建子類(lèi)對(duì)象,調(diào)用子類(lèi)的構(gòu)造函數(shù)時(shí),創(chuàng)建父類(lèi)對(duì)象,調(diào)用父類(lèi)構(gòu)造函數(shù)最后返回來(lái)執(zhí)行子類(lèi)構(gòu)造函數(shù)方法體代碼
子類(lèi)默認(rèn)調(diào)用父類(lèi)的無(wú)參構(gòu)造函數(shù)
如果父類(lèi)里沒(méi)有無(wú)參構(gòu)造函數(shù),則必須顯示的調(diào)用)
其實(shí)在內(nèi)存中是沒(méi)有對(duì)象概念的!new的時(shí)候是根據(jù)子類(lèi)和父類(lèi)所有靜態(tài)成員的大小以及類(lèi)型指針開(kāi)辟一個(gè)總的空間(此空間不包含方法),子類(lèi)和父類(lèi)的類(lèi)型指針指向兩個(gè)類(lèi)的方法表,所以,子類(lèi)對(duì)象可以訪問(wèn)到父類(lèi)和子類(lèi)的方法。
03.如果子類(lèi)和父類(lèi)存在同名但沒(méi)有重寫(xiě)關(guān)系的方法的時(shí)候,那么會(huì)調(diào)用哪個(gè)方法?(兩種情況:一是使用子類(lèi)對(duì)象,而是使用父類(lèi)對(duì)象)
Q:如果子類(lèi)和父類(lèi)存在同名但沒(méi)有重寫(xiě)關(guān)系的方法,那么調(diào)用時(shí),如果是父類(lèi)變量調(diào)用,則調(diào)用父類(lèi)方法,如果是子類(lèi)變量調(diào)用,則調(diào)用子類(lèi)方法
04.如果子類(lèi)和父類(lèi)存在同名且有重寫(xiě)關(guān)系的方法,那么會(huì)調(diào)用那個(gè)方法?(兩種情況:一是使用子類(lèi)對(duì)象,而是使用父類(lèi)對(duì)象)
Q:如果子類(lèi)和父類(lèi)存在同名且有重寫(xiě)關(guān)系的方法,那么不管變量是什么類(lèi)型,調(diào)用的都是子類(lèi)的方法。
05.虛方法和抽象方法的相同點(diǎn)與不同點(diǎn)?
Q :相同點(diǎn):都能被子類(lèi)重寫(xiě);都不能為私有的
不同點(diǎn):
1.abstract 和virtual的關(guān)鍵字不同
2.抽象方法一定沒(méi)有方法體,而虛方法必須有方法體。
3.virtual方法的子類(lèi)可以重寫(xiě)父類(lèi)方法也可不重寫(xiě),而抽象方法的所在的類(lèi)的子類(lèi)必須重寫(xiě)該父類(lèi)方法
4.抽象方法必須在抽象類(lèi)中聲明,而虛方法可以存在于任何一個(gè)類(lèi)里面
5.virtual方法必須有現(xiàn)實(shí)(哪怕是空實(shí)現(xiàn)),而abstract方法必須沒(méi)有實(shí)現(xiàn)
06.子類(lèi)中的base關(guān)鍵字指向的是子類(lèi)對(duì)象還是父類(lèi)對(duì)象?它本身的類(lèi)型是子類(lèi)類(lèi)型還是父類(lèi)類(lèi)型呢?
Q:當(dāng)然是指向的父類(lèi)對(duì)象。 但是本身是子類(lèi)的類(lèi)型。
(base就是子類(lèi)對(duì)象本身,只不過(guò)類(lèi)型是父類(lèi))
07.為什么要有抽象類(lèi)?
Q:抽象類(lèi)存在的目的就是指定規(guī)則,而不是具體實(shí)現(xiàn),是為了約束子類(lèi)的行為,具體實(shí)現(xiàn)交給子類(lèi)完成。
08.使用多態(tài)的好處是什么?
Q:1.低耦合,高內(nèi)聚。(低耦合—代碼的內(nèi)部各個(gè)層之間的關(guān)聯(lián)小,相互之間約束少。 高內(nèi)聚—方法的功能和職責(zé)單一,即一個(gè)方法只做一件事情。)
2.實(shí)現(xiàn)代碼的可維護(hù)性 和 可擴(kuò)展性。
3.把不同的子類(lèi)對(duì)象都當(dāng)作父類(lèi)來(lái)看,可以屏蔽不同子類(lèi)對(duì)象之間的差異,寫(xiě)出通用的代碼,做出通用的編程,以適應(yīng)需求的不斷變化。
09.什么情況下的類(lèi)不能被實(shí)例化?
Q:1.抽象類(lèi)
2.靜態(tài)類(lèi)
3.類(lèi)的構(gòu)造函數(shù)被私有化
10.什么情況下抽象類(lèi)的子類(lèi)不需要實(shí)現(xiàn)父類(lèi)的抽象成員?
Q:子類(lèi)也是抽象類(lèi)的時(shí)候。
11.虛方法(虛擬成員)和抽象方法(抽象成員)能不能被私有化?
Q:當(dāng)然不能。(首先編譯就會(huì)報(bào)錯(cuò))?!顚釉颍核麄儍烧叽嬖诘哪康木褪菫榱俗屪宇?lèi)去重寫(xiě),如果私有化了,就沒(méi)意義了。
12.靜態(tài)成員能不能被標(biāo)記為virtual、override 或 abstract?
Q:不能:
13.接口的命名規(guī)則?
Q:以大寫(xiě)I為開(kāi)頭,以…able結(jié)尾。表示有某種能力。
14.什么是接口?
Q:特殊的抽象類(lèi)。他的存在完全是為了約束和統(tǒng)一類(lèi)的行為。
15.接口能包含的成員有哪些?
Q:接口只有方法、屬性、索引器和事件的聲明
16.接口的訪問(wèn)權(quán)限修飾符只能是哪兩種?
Q:public和internal
17.接口能不能繼承接口?
Q:能。而且可以實(shí)現(xiàn)多個(gè)接口。
18.如果一個(gè)抽象類(lèi)繼承了一個(gè)接口,那么將繼承的方法設(shè)置為抽象方法,還是去實(shí)現(xiàn)該方法?
Q:都可以。 既可以在抽象類(lèi)的子類(lèi)中去實(shí)現(xiàn),也可在抽象類(lèi)中直接實(shí)現(xiàn)。
付炯 2月19日
1、使用接口的注意事項(xiàng)
Q:1,接口中的成員不能加訪問(wèn)修飾符;
2,接口中的成員不能有任何實(shí)現(xiàn);
3,實(shí)現(xiàn)接口的子類(lèi)的必須實(shí)現(xiàn)接口的全部 成員;
4,接口中只能有方法,屬性,索引器,事件,不能有字段。
5,一個(gè)類(lèi)可以同時(shí)繼承一個(gè)類(lèi)并實(shí)現(xiàn)多個(gè)接口,如果一個(gè)子類(lèi)同時(shí)繼承了父類(lèi)A,并實(shí)現(xiàn)了接口IA,那么在語(yǔ)法上A必須寫(xiě)在IA的前面,因?yàn)轭?lèi)是單繼承的,而接口可以實(shí)現(xiàn)多個(gè)。
6,顯示實(shí)現(xiàn)接口和隱式實(shí)現(xiàn)接口時(shí)需要注意的問(wèn)題,(通常我們是隱式實(shí)現(xiàn)的),
類(lèi)實(shí)現(xiàn)接口,可以顯式的實(shí)現(xiàn)接口里的方法,但是注意:一旦使用顯式實(shí)現(xiàn)接口里的方法后,那么該方法只能被接口變量調(diào)用
IFlyable fly = new Bird();
fly.Fly(); //正確
Bird fly = new Bird();
fly.Fly(); //錯(cuò)誤
7,向上轉(zhuǎn)型
8,單一職責(zé)原則 (避免定義體積龐大的接口,因?yàn)檫@樣會(huì)造成“接口污染”,只把相關(guān)聯(lián)的一組成員定義到一個(gè)接口中)
2、接口與抽象類(lèi)的區(qū)別
Q:相同點(diǎn):
接口和抽象類(lèi)都不能被實(shí)例化;
不同點(diǎn):
1,接口中不能存在有具體實(shí)現(xiàn)的方法;而抽象類(lèi)中可以有具體的方法實(shí)現(xiàn)。(接口只能定義行為,而抽象類(lèi)既可以定義行為也可以提供實(shí)現(xiàn))
2,接口支持多繼承,而抽象類(lèi)不能實(shí)現(xiàn)多繼承;
3,接口可以定義方法Method,屬性property,索引器Index,事件Event的簽名,但不能定義字段和這些東西的具體實(shí)現(xiàn),而抽象類(lèi)什么都能定義和實(shí)現(xiàn),除了 不能被實(shí)例化
老鄒的2011年答案:
1) 抽象基類(lèi)可以定義字段、屬性、方法實(shí)現(xiàn)。接口只能定義屬性、索引器、事件、和方法
聲明,不能包含字段。
2) 抽象類(lèi)是一個(gè)不完整的類(lèi),需要進(jìn)一步細(xì)化,而接口是一個(gè)行為規(guī)范。微軟的自定義接
口總是后帶able字段,證明其是表述一類(lèi)“我能做。。?!?。
3) 接口可以被多重實(shí)現(xiàn),抽象類(lèi)只能被單一繼承。
4) 抽象類(lèi)更多的是定義在一系列緊密相關(guān)的類(lèi)間, 而接口大多數(shù)是關(guān)系疏松但都實(shí)現(xiàn)某一
功能的類(lèi)中。
5) 抽象類(lèi)是從一系列相關(guān)對(duì)象中抽象出來(lái)的概念, 因此反映的是事物的內(nèi)部共性;接口
是為了滿足外部調(diào)用而定義的一個(gè)功能約定, 因此反映的是事物的外部特性。
6) 接口基本上不具備繼承的任何具體特點(diǎn),它僅僅承諾了能夠調(diào)用的方法。
7) 接口可以用于支持回調(diào),而繼承并不具備這個(gè)特點(diǎn)。
8) 抽象類(lèi)實(shí)現(xiàn)的具體方法默認(rèn)為虛的, 但實(shí)現(xiàn)接口的類(lèi)中的接口方法卻默認(rèn)為非虛的, 當(dāng)
然您也可以聲明為虛的。
9) 如果抽象類(lèi)實(shí)現(xiàn)接口,則可以把接口中方法映射到抽象類(lèi)中作為抽象方法而不必實(shí)現(xiàn),
而在抽象類(lèi)的子類(lèi)中實(shí)現(xiàn)接口中方法
3、類(lèi)型轉(zhuǎn)換
轉(zhuǎn)換分類(lèi)
Q:隱式轉(zhuǎn)換 int num = 1; string str= num.tostring();
強(qiáng)制轉(zhuǎn)換 int a = 5; (double ) b= a;
轉(zhuǎn)換條件
ToString()方法
Q:它是object對(duì)象的一個(gè)虛方法,可以自己去重寫(xiě)該方法。如果不重寫(xiě)就返回類(lèi)型名。
Parse()和TryParse()方法
Q:相同點(diǎn):都是針對(duì)于字符串進(jìn)行的值類(lèi)型轉(zhuǎn)換。
不通點(diǎn):1,返回值不一樣。Parse()是返回要轉(zhuǎn)換的類(lèi)型,而TryParse()返回一個(gè)轉(zhuǎn)換是否成功的bool值。
2,Parse()轉(zhuǎn)換失敗會(huì)拋異常,而TryParse()轉(zhuǎn)換失敗返回false,不會(huì)拋異常。
3,Parse()直接傳入要轉(zhuǎn)換的類(lèi)型的值,而TryParse()需要一個(gè)out輸出參數(shù)輸出轉(zhuǎn)換的結(jié)果。
4、靜態(tài)成員
加載時(shí)機(jī) (什么時(shí)候加載靜態(tài)成員?)
Q:在該靜態(tài)成員第一次被調(diào)用的時(shí)候加載。
適用情形(什么時(shí)候用靜態(tài)成員?)
Q:在整個(gè)程序內(nèi)部共享的數(shù)據(jù)才定義為靜態(tài)的。通常被作為工具類(lèi)使用。比如SQLHelper
在普通類(lèi)和靜態(tài)類(lèi)中的區(qū)別
Q:1,靜態(tài)類(lèi)需要用static。靜態(tài)類(lèi)不能被實(shí)例化。
2,靜態(tài)類(lèi)中只能包含靜態(tài)成員;
3,靜態(tài)成員屬于類(lèi)所有,非靜態(tài)成員屬于類(lèi)的實(shí)例所有。
4,在實(shí)例方法中可以直接調(diào)用靜態(tài)成員,但在靜態(tài)方法中不能直接調(diào)用實(shí)例方法。
5,靜態(tài)類(lèi)和靜態(tài)變量創(chuàng)建后始終使用同一塊內(nèi)存,而使用實(shí)例的方法會(huì)創(chuàng)建多個(gè)內(nèi)存。
6,靜態(tài)構(gòu)造函數(shù)不能有參數(shù),也不能有訪問(wèn)修飾符(默認(rèn)是private)
5、靜態(tài)類(lèi)的繼承
Q:1,(從子類(lèi)的角度)靜態(tài)類(lèi)不能被任何類(lèi)繼承
2,(從父類(lèi)的角度)靜態(tài)類(lèi)只能繼承Object類(lèi),不能繼承其他的類(lèi)。
6、類(lèi)和成員的訪問(wèn)修飾符
Q:1,類(lèi)的默認(rèn)訪問(wèn)修飾符是internal,
2,類(lèi)的成員的默認(rèn)訪問(wèn)修飾符是private
a.類(lèi)的訪問(wèn)修飾符只有兩種:public,internal(默認(rèn))
b.成員的訪問(wèn)修飾符有:public,protected,private(默認(rèn))
7、結(jié)構(gòu)
本質(zhì)是值類(lèi)型
值類(lèi)型和引用類(lèi)型的選擇
Q:1.值類(lèi)型:主要是用來(lái)封裝一組數(shù)據(jù),并為數(shù)據(jù)提供一種簡(jiǎn)單的處理方式
2引用類(lèi)型:
1).主要用來(lái)封裝數(shù)據(jù)和行為
2)使用面向?qū)ο蟮奶卣鳎?
3)當(dāng)類(lèi)型中的成員比較多的時(shí)候用結(jié)構(gòu)(存在堆里)
new關(guān)鍵字的作用
Q:結(jié)構(gòu)
在使用new關(guān)鍵字創(chuàng)建對(duì)象后,所有的成員變量都已經(jīng)存在,并有默認(rèn)值(值類(lèi)型)
如果沒(méi)有用new關(guān)鍵字,則需要程序員手動(dòng)為所有的 用到了 的成員變量賦值,之后才能調(diào)用結(jié)構(gòu)對(duì)象里的方法屬性
結(jié)構(gòu)不new也可以使用,但是必須給使用到的結(jié)構(gòu)成員賦值才能使用
8、類(lèi)和結(jié)構(gòu)的區(qū)別
Q:1,結(jié)構(gòu)是值類(lèi)型,是分配在內(nèi)存的棧上的。而類(lèi)是引用類(lèi)型,是分配在內(nèi)存的堆上的;
2,結(jié)構(gòu)不能被繼承,因?yàn)榻Y(jié)構(gòu)是值類(lèi)型,隱式繼承自System.ValueType
3,結(jié)構(gòu)是值傳遞的(復(fù)制傳遞),而類(lèi)是引用傳遞的。
9、值類(lèi)型和引用類(lèi)型作為參數(shù)傳遞的區(qū)別
Q:值類(lèi)型是值傳遞的(復(fù)制傳遞),而類(lèi)是引用傳遞的(傳的是地址的引用)。
10、訪問(wèn)級(jí)別約束
Q:1,子類(lèi)的訪問(wèn)級(jí)別不能比父類(lèi)高
2,方法參數(shù)的訪問(wèn)級(jí)別 >= 方法的訪問(wèn)級(jí)別 (比如當(dāng)方法的參數(shù)傳遞的是一個(gè)類(lèi)對(duì)象時(shí),那么此時(shí)這個(gè)類(lèi)對(duì)象的訪問(wèn)級(jí)別要高于當(dāng)前方法的訪問(wèn)級(jí)別)
11、析構(gòu)函數(shù)
Q:1,一個(gè)類(lèi)只能有一個(gè)析構(gòu)函數(shù),
2,無(wú)法繼承或重載析構(gòu)函數(shù)
3,我們無(wú)法手動(dòng)去調(diào)用析構(gòu)函數(shù),因?yàn)樗潜籊C(垃圾回收器)自動(dòng)調(diào)用的
4,析構(gòu)函數(shù)不能有訪問(wèn)修飾符,也不能有參數(shù)
5,不能在結(jié)構(gòu)體中定義析構(gòu)函數(shù)(為什么呢?)–因?yàn)榻Y(jié)構(gòu)是值類(lèi)型,而值類(lèi)型是存儲(chǔ)在棧中的,棧中的數(shù)據(jù)在用完之后就立即銷(xiāo)毀了,而析構(gòu)函數(shù)的目的就是用來(lái)釋放資源的,一般存儲(chǔ)在堆中的引用類(lèi)型才需要GC去釋放,因而結(jié)構(gòu)體中是不能定義析構(gòu)函數(shù)的,只能對(duì)類(lèi)使用析構(gòu)函數(shù)。
析構(gòu)函數(shù)語(yǔ)法:
class MyDispose
{
~MyDispose()
{
......//在這里寫(xiě)釋放資源的代碼
}
}
12、字符串
屬性
length
靜態(tài)方法
常用:
1、(Last)IndexOf:用來(lái)查找某個(gè)字符或字符串,在一個(gè)特定字符串對(duì)象里的下標(biāo)
2、SubString 截取
3、Split() 根據(jù)特定字符來(lái)分割字符串,并返回分割后的字符串的數(shù)組,可以用foreach讀取
4、Join靜態(tài)方法
5、Format() 靜態(tài)方法
6、Replace(),替換完要接收,產(chǎn)生一個(gè)新的字符串
7,Replace().Replace()鏈?zhǔn)骄幊?
8、Trim()去首尾空格
實(shí)例方法
13、==運(yùn)算符和Equals()方法的區(qū)別
Q:”==”比較時(shí):
如果比較的是值類(lèi)型,則比較兩個(gè)對(duì)象的值
如果比較的是引用類(lèi)型,則比較兩個(gè)對(duì)象的引用地址是否相同(比較堆地址)
“Equals”比較時(shí):
此方法是Object類(lèi)里的一個(gè)虛方法,默認(rèn)就是用的“==”進(jìn)行比較。(它是對(duì)“==”進(jìn)行的一個(gè)封裝)
但是,大部分微軟的類(lèi),及用戶自定義的類(lèi),都重寫(xiě)了該虛方法,也就是微軟和用戶各自為自己編寫(xiě)的Object的子類(lèi) 定義了相等比較規(guī)則。
注意:這里有一個(gè)特例,因?yàn)閟tring是一個(gè)引用類(lèi)型,所以按理說(shuō)string.Equals(…)方法比較的是地址,而這里比較的字符串的值。
14、字符串的恒定性
Q:當(dāng)字符串在內(nèi)存中已經(jīng)被創(chuàng)建后,程序員在次創(chuàng)建相同值的字符串對(duì)象時(shí),CLR做了優(yōu)化,直接把第一個(gè)字符串的引用賦給了第二個(gè)變量,也就是說(shuō),前后兩個(gè)字符串變量保存了相同的字符串對(duì)象應(yīng)用
15、StringBuilder對(duì)象
Q:高效的的字符串操作。
String 在進(jìn)行運(yùn)算時(shí)(如賦值、拼接等)會(huì)產(chǎn)生一個(gè)新的實(shí)例,而 StringBuilder 則不
會(huì) 。 所以在大量字符串拼接或頻繁對(duì)某一字符串進(jìn)行操作時(shí)最好使用 StringBuilder , 不要使
用 String
如果要操作一個(gè)不斷增長(zhǎng)的字符串,盡量不用 String 類(lèi) , 改用 StringBuilder 類(lèi)。兩個(gè)類(lèi)的工
作原理不同 :String 類(lèi)是一種傳統(tǒng)的修改字符串的方式 , 它確實(shí)可以完成把一個(gè)字符串添加到
另一個(gè)字符串上的工作沒(méi)錯(cuò) , 但是在 .NET 框架下 , 這個(gè)操作實(shí)在是劃不來(lái) 。 因?yàn)橄到y(tǒng)先是把
兩個(gè)字符串寫(xiě)入內(nèi)存 , 接著刪除原來(lái)的 String 對(duì)象 , 然后創(chuàng)建一個(gè) String 對(duì)象 , 并讀取內(nèi)存
中的數(shù)據(jù)賦給該對(duì)象。這一來(lái)二去的,耗了不少時(shí)間。而使用 System.Text 命名空間下面 的
StringBuilder 類(lèi)就不是這樣了,它提供的 Append 方法,能夠在已有對(duì)象的原地進(jìn)行字符串
的修改 , 簡(jiǎn)單而且直接 。 當(dāng)然 , 一般情況下覺(jué)察不到這二者效率的差異 , 但如果你要對(duì)某個(gè)
字符串進(jìn)行大量的添加操作 , 那么 StringBuilder 類(lèi)所耗費(fèi)的時(shí)間和 String 類(lèi)簡(jiǎn)直不是一個(gè)數(shù)
量級(jí)的。
16、枚舉
本質(zhì)是類(lèi)
枚舉項(xiàng)的相關(guān)問(wèn)題
Q:1、如果為第一個(gè)枚舉項(xiàng)賦了一個(gè)int值,那么后面的枚舉項(xiàng)依次遞增。
2、可以將枚舉強(qiáng)轉(zhuǎn)成他所代表的int值
3、因?yàn)槊杜e項(xiàng)都有對(duì)應(yīng)的int值,所以Switch把他當(dāng)成int看
4、C#的枚舉項(xiàng)都是常量(可以去看IL 代碼 literal)
5、不能定義方法,屬性,事件
6、多個(gè)枚舉有相同數(shù)值時(shí)。數(shù)值強(qiáng)轉(zhuǎn)時(shí),會(huì)返回其中最后一個(gè)枚舉項(xiàng)
7、枚舉項(xiàng)的數(shù)值類(lèi)型int ,long….
17、IEnumerable接口
Q:只要實(shí)現(xiàn)了該接口,就可以使用foreach進(jìn)行遍歷。 foreach循環(huán)的本質(zhì)就是調(diào)用這個(gè)接口返回一個(gè)迭代器,調(diào)用迭代器的MoveNext()方法就可以實(shí)現(xiàn)循環(huán)。
如下反編譯的源碼:
public interface IEnumerable
{
IEnumerator GetEnumerator(); //返回一個(gè)迭代器
}
public interface IEnumerator
{
bool MoveNext();
object Current { get; }
void Reset();
}
從以上反編譯源碼可以看出:
IEnumerable接口中主要包含GetEnumerable方法(獲取迭代器對(duì)象),MoveNext方法(檢查是否存在循環(huán)的下一個(gè)元素),GetCurrent方法(獲得當(dāng)前循環(huán)到的元素)
2月20日
1、集合
概念理解
Q: 集合就是能裝一堆東西的容器。主要分為非泛型集合和泛型集合。
Arraylist— 里面真正存儲(chǔ)數(shù)據(jù)的是一個(gè)Object[]數(shù)組,它對(duì)應(yīng)的泛型是List,
HashTable—非泛型的鍵值對(duì)集合,它對(duì)應(yīng)的泛型是Dictionary
11.4 表單JS提交方式
王偉 3.18-3.23 第一部分:jquery
一、 查:當(dāng)你想在頁(yè)面中找到某個(gè)元素的時(shí)候,就要想到他們
↖(^ω^)↗
1.1基本選擇器:
Id選擇器 ,Calss選擇器,tag選擇器,* ,組合選
擇器
1.2層次選擇器:
后代選擇器,子代選擇器,匹配選擇器,~選擇器
1.3節(jié)點(diǎn)遍歷:
next(),nextAll(),prev(),prevAll(),siblings()
1.4過(guò)濾器:
:first,:last,:not,:even,:odd,:eq,:gt,:lt,
1.5屬性過(guò)濾器:
(“div[id]”),(“div[title=text]”),
1.6表單對(duì)象過(guò)濾器:
#form1:enabled,#form1:disabled,input:checked,select
option:select,
1.7表單選擇器
:input,:text,:password……
二、修改:修改頁(yè)面元素就用我吧 (^__^) 嘻嘻……
2.1jqury對(duì)象的方法
html(),val(),text(),css(),attr(),removeAttr()
2.2樣式操作:
attr(),addClass(),removeClass(),toggleClass(),hasClass()
2.3復(fù)制節(jié)點(diǎn):
clone(),clone(true)
2.4替換
replaceWith(),replaceAll(),wrap(),
三、新增:當(dāng)你要新增元素時(shí)就用它們吧!O(∩_∩)O哈哈~
3.1創(chuàng)建Dom節(jié)點(diǎn) 例:$(“傳智播客官網(wǎng)”)
3.2 append(),appendTo()
3.3外部插入節(jié)點(diǎn)
after,before,insertAfter,insertBefore
四、刪除:你不要我們了嗎? ( ^_^ )/~~ 拜拜
remove()
empty()
五、批量處理
5.1隱式迭代
5.2.map,.each
5.3元素的map和each
六、其他內(nèi)容:
jquery動(dòng)畫(huà)
jquery cookie
第二部分:Dom補(bǔ)充
放在這里是不是有點(diǎn)莫名奇妙 (⊙_⊙?)
ChildNodes(NodeList類(lèi)型-有序類(lèi)數(shù)組對(duì)象),
length屬性是實(shí)時(shí)的計(jì)算元素個(gè)數(shù)
insertBefore,appendChild,removeChild,replaceChild
parentNode(父元素),firstChild(第一個(gè)子元素),lastChild(最后一個(gè)子元
素),ownerDocument
nextSibling(下一個(gè)兄弟節(jié)點(diǎn)) , previousSibling(上一個(gè)兄弟節(jié)點(diǎn))
cloneNode(bool)-復(fù)制節(jié)點(diǎn)(true-深拷貝,false-淺拷貝)
style.cssText設(shè)置元素的style屬性值
第三部分:js高級(jí)
1. Js面向?qū)ο缶幊?繼承)
2. 閉包
3. apply和call
4. 函數(shù)的屬性(arguments)
5. Eval()方法
6. 數(shù)據(jù)類(lèi)型(array,object,function(不是)……)
7. Instanceof,typeof
8. 聲明式和表達(dá)式執(zhí)行順序
張連印 3.25-3.30
一:反射
1.同過(guò)反射動(dòng)態(tài)調(diào)用方法 Invoke
2.Type.IsAssignableFrom(Type t);判斷type是否是T的父類(lèi),可判斷接口
3.Type.IsSubclassOf(Type T)//與上面方法的區(qū)別
4.通過(guò)反射獲得Type的方法,如私有方法、共有方法、靜態(tài)方法????
5.開(kāi)發(fā)一個(gè)基于插件的記事本
6.特性,通過(guò)反射獲得特性信息,如何定義特性。
二.多線程:
1.多線程的概念
2.多線程的實(shí)現(xiàn)
3.線程重入
4.前臺(tái)線程和后臺(tái)線程
5.線程的調(diào)度方式
三.
1.什么是socket?
2.Socket的常用兩種通信協(xié)議:Tcp/Udp
3.Tcp、Udp的區(qū)別?
4.編寫(xiě)基于Socket Tcp協(xié)議的一個(gè)簡(jiǎn)單即使通信軟件
5.Http服務(wù)器的運(yùn)行方式。
6.長(zhǎng)連接和短連接的區(qū)別?
7.Web服務(wù)器的工作過(guò)程
7.1.監(jiān)聽(tīng)請(qǐng)求
7.2.處理請(qǐng)求
7.3.生成響應(yīng)報(bào)文
7.4.關(guān)閉通信套接字Socket
四.一般處理程序
1.IIS Web服務(wù)器的處理過(guò)程:映射表、外部擴(kuò)展程序、靜態(tài)文件、動(dòng)態(tài)文件、能處理、不能處理
2.HttpContext上下文對(duì)象的作用,其中包含哪些內(nèi)容?
3.Asp.net系統(tǒng)對(duì)象:
Page、response、request、application、session、server、cookies
4.瀏覽器提交表單的兩種方式
5.Get/Post的區(qū)別是什么?
6.使用一般處理程序制作用戶登錄程序。
7.Request獲取Get、Post請(qǐng)求參數(shù)的方式分別是什么?Params
8.Response.Redirect() 方法作用。
9.Response中的寫(xiě)出器
10.瀏覽器能夠提交表單需滿足什么條件?
11.哪些Html標(biāo)簽的值能夠被表單提交?
12.若Html標(biāo)簽的disabled屬性有設(shè)置
13.讀取Html模板文件,處理Html字符串
14.頁(yè)面的跳轉(zhuǎn):window.location,window.parent.location,window.top.location
15.一般處理程序進(jìn)行增刪查改
李榮壯 4.1-4.6
———-4.1 一般處理程序
1. 上傳圖片
2. 添加水印
3. 生成縮略圖
4. 生成驗(yàn)證碼
5. 設(shè)置瀏覽器打開(kāi)文件打式為下載
———-4.2 - 4.5 WebForm和狀態(tài)保持
1.Ashx與Aspx的關(guān)系
2.Aspx前臺(tái)頁(yè)與后臺(tái)頁(yè)的關(guān)系
CodeBehind(代碼后置)
3.前臺(tái)頁(yè)與后臺(tái)頁(yè)之間傳遞數(shù)據(jù)
4.Aspx、cs、dll文件之間的關(guān)系
5.WebForm的運(yùn)行流程
ASP.NET 運(yùn)行圖
控件樹(shù)
6.Request
6.1 常用成員
UrlReferrer
UserHostAddress
MapPath(Server.MapPath調(diào)用的是Request.MapPath)
7.Response
7.1 常用成員
End()
ContentType
8.Servers
8.1 常用成員
8.2 Transfer與Redirect區(qū)別
Transfer不能內(nèi)部重定向到ashx,否則會(huì)報(bào)錯(cuò)“執(zhí)行子請(qǐng)求出錯(cuò)”
9.無(wú)狀態(tài)Http
9.1 其根本原因 :Http協(xié)議是無(wú)狀態(tài)的
9.2 對(duì)網(wǎng)站的影響
10.ASP.NET中的狀態(tài)保持方案(有哪些,各自的特點(diǎn),應(yīng)用場(chǎng)景)
10.1 客戶端:
10.1.1 ViewState
10.1.1.1 特點(diǎn):WebForm特有,頁(yè)面級(jí)的
10.1.1.2 兩種使用方式
10.1.1.2.1 用戶數(shù)據(jù)保存方式
10.1.1.2.2 非單值服務(wù)器控件的狀態(tài)自動(dòng)保存于ViewState
10.1.1.3 使用ViewState的前提
10.1.1.4 ViewState的禁用(WebForm的IsPostBack依賴于__ViewState)
10.1.2 HiddenField
10.1.3 Cokies
10.1.3.1 保存Cookie的兩種方式
1. 保存于內(nèi)在中
2. 保存于瀏覽器所在的電腦的硬盤(pán)中。
10.1.3.2 使用場(chǎng)景
10.1.3.3 原理
10.1.4 ControlState
10.1.5 QueryString
10.2 服務(wù)器:
10.2.1 Session
每個(gè)客戶端的Session是獨(dú)立的
開(kāi)發(fā)場(chǎng)景
如何使用
一般處理程序如果使用Session需要 實(shí)現(xiàn)RequiresSessionState接口
與Cookies的區(qū)別
10.2.2 Application 服務(wù)器端保存共享數(shù)據(jù)的一種方式
10.2.3 Caching
10.2.4 Database
11. Web應(yīng)用程序與網(wǎng)站的區(qū)別
12. Iframe
13. 控制父頁(yè)跳轉(zhuǎn)
14. 反射方式生成sql查詢條件
15. MD5加密
——–4.5 AJAX
1. 優(yōu)點(diǎn)
2. 使用步驟
3. 瀏覽器兼容方式創(chuàng)建異步對(duì)象
4. post 設(shè)置 ContentType
5. get 設(shè)置 不讀取瀏覽器緩存
6. 地區(qū)級(jí)聯(lián)選擇
7. 服務(wù)器端與客戶端通過(guò)json交換數(shù)據(jù)
8. 將對(duì)象序列化為json字符串。
姚羽 4.8-4.13
1.Ajax的使用
1.1四個(gè)步驟(核心!重要!)
1.1.1 創(chuàng)建異步對(duì)象:Create XMLHttpRequest
1.1.2 設(shè)置訪問(wèn)方式:open (…)—get 和 post (各自的請(qǐng)求頭設(shè)置語(yǔ)法)
1.1.3 設(shè)置回調(diào)函數(shù):onreadystatechange = function(){…}
1.1.4 發(fā)送請(qǐng)求:send (傳參)
1.2處理ajax請(qǐng)求響應(yīng)的結(jié)果responseText。 處理json格式的字符串,
注意引號(hào)問(wèn)題
2.Ajax完成 增刪改查 一套功能,注意一些細(xì)節(jié)
2.1 細(xì)節(jié)一:查詢時(shí)Js創(chuàng)建表格
2.2 細(xì)節(jié)二:新增時(shí)Js創(chuàng)建行和刪除行的操作
3.Ajax簡(jiǎn)單分頁(yè)
3.1 自己利用row_number寫(xiě)一個(gè)簡(jiǎn)單的分頁(yè)存儲(chǔ)過(guò)程(帶參數(shù))
3.2 C#內(nèi)部的事務(wù)操作(自己做成規(guī)范的方法自己將來(lái)在需要的時(shí)候可
以直接拿來(lái)用)
3.3 照片上傳 和 異步上傳(原理:利用Iframe)
3.4 JS自執(zhí)行函數(shù)的使用和JS匿名函數(shù)的使用
4.服務(wù)器控件
4.1 三種控件的區(qū)別(html控件,有runat=server的html控件,服務(wù)器
控件)
4.2 Jsonp 的作用以及怎么實(shí)現(xiàn)跨域
4.3 主要掌握服務(wù)器控件的 Repeater (Eval和Bind的區(qū)別)
4.4 掌握服務(wù)器控件的ListView(各個(gè)模板的使用,以及內(nèi)置分頁(yè)功能
,高效分頁(yè)做法)
4.5 頁(yè)面生命周期 (表述這個(gè)過(guò)程和原理)
- 緩存 (有哪幾種緩存(頁(yè)面級(jí)別緩存,數(shù)據(jù)源緩存,自定義緩存)—各自
用法,回憶)
5.1 緩存的條件 (為什么要有緩存?)
5.2 緩存的缺點(diǎn)(臟數(shù)據(jù))
5.3 如何解決這個(gè)缺點(diǎn) (緩存依賴) (原理)
5.4 Session和Cache的相同點(diǎn) 和 不同點(diǎn)
5.5 自定義緩存的 絕對(duì)失效時(shí)間 和 相對(duì)失效時(shí)間 (那兩句代碼,不
同的寫(xiě)法)
6.母版頁(yè)
6.1 母版頁(yè)的使用(占位符PlaceHolder),以及母版頁(yè)和子頁(yè)面的關(guān)系,
先執(zhí)行母版頁(yè)還是先執(zhí)行子頁(yè)面
6.2 關(guān)于這階段的最重要的那張圖(請(qǐng)求流行執(zhí)行圖),只要在面試過(guò)
程中設(shè)計(jì)到這階段的問(wèn)題,就可以想辦法口述出那張圖的流程,需要流利表達(dá)和自信
個(gè)人補(bǔ)充(核心的加分回答):
1,頁(yè)面靜態(tài)化(偽靜態(tài) 和 真靜態(tài))(可以提到在mvc中靜態(tài)化的方便之處):
1.1,目的:
Q: 1,最大限度的方便搜索引擎的抓取頁(yè)面(百度谷歌等網(wǎng)絡(luò)蜘蛛的爬?。赟EO
2,直接生成靜態(tài)頁(yè)面,,服務(wù)器端不用每次訪問(wèn)都去運(yùn)算,這樣就減輕了服務(wù)器壓力
3,給用戶更加友好的展示,地址欄顯示的直接是一個(gè)純的html,而不是像….aspx?id=1… 這樣一長(zhǎng)串的參數(shù),干凈,好記憶
1.2,如何實(shí)現(xiàn)頁(yè)面靜態(tài)化:
2,頁(yè)面幾大對(duì)象的深層次原理(Session,Viewstate,Application,cookie等)
2.1,關(guān)于Session:
2.1.1,Session出現(xiàn)的背景:
Q: 由于Http協(xié)議的無(wú)狀態(tài)性,瀏覽器和服務(wù)器通信完畢之后,連接就被斷開(kāi)。這樣就造成服務(wù)器就無(wú)法保存瀏覽器端的狀態(tài).
而為了解決這個(gè)問(wèn)題有些聰明的人就發(fā)明了狀態(tài)保持對(duì)象,而Session就是其中的一種存放在服務(wù)器端的狀態(tài)保持對(duì)象。
2.1.2,那么Session是如何進(jìn)行狀態(tài)保持的呢?:
Q: 比如在登錄的時(shí)候,瀏覽器端發(fā)送賬號(hào)密碼到服務(wù)器端,通過(guò)驗(yàn)證之后,服務(wù)器端就將這些數(shù)據(jù)以鍵值對(duì)的方式保持到Session池中,
并且服務(wù)器端生成響應(yīng)報(bào)文,并以內(nèi)存型的Cookie的形式發(fā)送SessionId.
在瀏覽器未關(guān)閉的條件下,當(dāng)瀏覽器再次訪問(wèn)這個(gè)站點(diǎn)下的頁(yè)面時(shí),就會(huì)將這個(gè)站點(diǎn)接收到的SessionId包含在請(qǐng)求報(bào)文中一并發(fā)送到服務(wù)器端。
服務(wù)器端一旦拿到這個(gè)SessionId,就會(huì)去Session中根據(jù)SessionId查找對(duì)應(yīng)的值,如果找到,就不再去進(jìn)行驗(yàn)證。因而就實(shí)現(xiàn)了這種狀態(tài)保存機(jī)制。
就是這樣,服務(wù)器端就能夠保持客戶端的狀態(tài)。
2.1.3,用Session會(huì)出現(xiàn)那些問(wèn)題呢?那有如何解決呢?
Q:會(huì)出現(xiàn)的問(wèn)題 : Session的性能不是很好;當(dāng)網(wǎng)站的訪問(wèn)量大的時(shí)候容易造成內(nèi)存泄漏。
如何解決 :
2.1.3.1,采用進(jìn)程外Session
2.1.3.2,我們可以模擬一個(gè)Session,比如把一個(gè)用戶的登錄信息和一個(gè)Guid放在一起,這樣就可以作為一個(gè)鍵值對(duì)來(lái)模擬Session,然后將其存入到數(shù)據(jù)庫(kù)中,這樣就可以避免Session的丟失。我們甚至可以將其存入緩存(因?yàn)榫彺娴男阅芨撸?,這樣就可以中和數(shù)據(jù)庫(kù)的硬盤(pán)慢速訪問(wèn)和內(nèi)存的高速訪問(wèn)。
具體方案:
對(duì)于進(jìn)程外Session,主要有這幾種。。。。。。。, 通過(guò)配置文件,這是微軟幫我們提供的方式,我們只需要配置一下就OK。<sessionState mode="StateServer" cookieless="UseCookies" stateConnectionString="tcpip=127.0.0.1:42424"/>
3,asp.net的運(yùn)行機(jī)制,頁(yè)面生命周期相關(guān)
Q:當(dāng)客戶端瀏覽器發(fā)送一個(gè)請(qǐng)求的時(shí)候,比如用戶在瀏覽器輸入一個(gè)域名地址,那么此時(shí)先進(jìn)行DNS尋址,就是到DNS服務(wù)器去找該域名對(duì)象的IP,找到之后就會(huì)跟這個(gè)對(duì)應(yīng)的IP建立連接,這個(gè)連接是通過(guò)Socket套接字建立起來(lái)的,然后通過(guò)套接字連接發(fā)送連接請(qǐng)求,此時(shí)就跟我們的IIS服務(wù)器建立了連接了,IIS拿到請(qǐng)求之后會(huì)將請(qǐng)求交給擴(kuò)展程序,擴(kuò)展程序就將請(qǐng)求交給Framework來(lái)處理,aspnet_isapi.dll ,這時(shí)會(huì)創(chuàng)建一個(gè)HttpRuntime對(duì)象,調(diào)用其PR方法創(chuàng)建了HttpWorkerRequest對(duì)象,并將請(qǐng)求報(bào)文信息封裝在里面(當(dāng)然,這個(gè)HttpWorkerRequest我們程序員無(wú)法直接調(diào)用,它是供.Net運(yùn)行時(shí)來(lái)用的),然后創(chuàng)建HttpContext對(duì)象,它的里面就包含了請(qǐng)求報(bào)文對(duì)象HttpRequest和響應(yīng)報(bào)文對(duì)象HttpResponse,此時(shí)通過(guò)HttpApplicationFactory創(chuàng)建了一個(gè)HttpApplication對(duì)象,然后調(diào)用該對(duì)象的PR方法,并傳入我們上面已經(jīng)創(chuàng)建好的上下文對(duì)象HttpContext,然后會(huì)執(zhí)行19個(gè)委托對(duì)象,這也就是我們常說(shuō)的請(qǐng)求管道,在執(zhí)行到管道事件的第8個(gè)事件時(shí)會(huì)創(chuàng)建被請(qǐng)求的頁(yè)面類(lèi)對(duì)象,并將頁(yè)面類(lèi)對(duì)象轉(zhuǎn)成IHttpHandler接口。然后會(huì)在執(zhí)行到第11到12個(gè)事件之間的時(shí)候調(diào)用頁(yè)面類(lèi)對(duì)象的PR方法,執(zhí)行完畢后,這時(shí)就要分兩步走,如果當(dāng)前請(qǐng)求的是一般處理程序ashx,那么就會(huì)直接調(diào)用前面創(chuàng)建的HttpRuntime的一個(gè)FinisheRequest()方法,這個(gè)FinishRequest就會(huì)生成響應(yīng)報(bào)文,然后將響應(yīng)報(bào)文發(fā)回給IIS,再由IIS通過(guò)套接字發(fā)回給瀏覽器,那么瀏覽器就砍刀了我們請(qǐng)求的響應(yīng)報(bào)文。
4,mvc的運(yùn)行原理,路由的相關(guān)的操作(可以談到領(lǐng)域先行的開(kāi)發(fā)模式,先關(guān)的,比如如何管理EF上下文,線程內(nèi)實(shí)例唯一,Callcontext)
5,JS高級(jí)中的幾個(gè)概念,比如js閉包,apply和call,原型模式prototype,js繼承等等
6,緩存,哪幾種?cache,有什么好處,會(huì)有什么問(wèn)題?如何解決? 什么是緩存的滑動(dòng)機(jī)制?談到緩存依賴,幾大依賴方法
6.1,概念:
緩存是指系統(tǒng)或應(yīng)用程序?qū)㈩l繁使用的數(shù)據(jù)保存到內(nèi)存中,當(dāng)系統(tǒng)或應(yīng)用程序再次使用時(shí),能構(gòu)快速的獲取數(shù)據(jù)。
6.2,有哪幾種:
主要有三種: 頁(yè)面級(jí)緩存(網(wǎng)頁(yè)輸出緩存); 數(shù)據(jù)源緩存; 自定義緩存
6.3,各是怎么實(shí)現(xiàn)的?
6.4,利弊是什么?
利:
弊:它的弊端在于顯示的內(nèi)容可能不是最新,最精確的(即通常我們說(shuō)的臟數(shù)據(jù))
ASP.Net 緩存主要分為兩大類(lèi): 網(wǎng)頁(yè)輸出緩存和應(yīng)用程序緩存
網(wǎng)頁(yè)輸出緩存針對(duì)ASP.NET Pages 頁(yè)面中的HTML進(jìn)行緩存,是可視化內(nèi)容對(duì)象,如圖片,GridView表格控件,用戶控件等
應(yīng)用程序緩存是針對(duì)應(yīng)用程序內(nèi)的數(shù)據(jù)緩存,如:將DataSet等數(shù)據(jù)存儲(chǔ)到緩存
緩存的滑動(dòng)機(jī)制:其實(shí)就是指緩存的相對(duì)失效時(shí)間
7,IOC(inverse Object control),依賴注入,依賴倒置,控制反轉(zhuǎn)(DI(Dependency Injection)),
Q:依賴工廠,依賴高層。比如依賴于高層模塊,不要直接new。就是引用本身不依賴
說(shuō)白了,就是new的時(shí)候通過(guò)外部容器來(lái)。
如果從應(yīng)用程序的角度就叫IOC(控制反轉(zhuǎn));如果從容器的角度來(lái)說(shuō)就叫DI(依賴注入)。
8,AOP,面向切面編程 (這里可以對(duì)比webform和mvc談里面的過(guò)濾器,前者HttpModule和后者的Filter),就可以提到比如日志處理,權(quán)限處理等,順便就可以提log4net
通俗:說(shuō)白了,就是在調(diào)用目標(biāo)事件之前先執(zhí)行事件委托。
9,進(jìn)程外Session
Q:出來(lái)的目的:在訪問(wèn)量很大的時(shí)候,Session會(huì)造成數(shù)據(jù)丟失,那么我們就用另外一個(gè)
10,會(huì)口述一些模式和設(shè)計(jì)的內(nèi)涵:反射抽象工廠,面向接口編程,門(mén)面模式Facade,歸約模式,
11,常用的提高程序性能的辦法
從兩個(gè)角度來(lái)思考:(實(shí)際上我們的程序性能的瓶頸一般都在數(shù)據(jù)庫(kù)上面,因?yàn)閿?shù)據(jù)庫(kù)比較耗費(fèi)CPU,內(nèi)存和IO,而不在程序端,因此我們首先要從數(shù)據(jù)庫(kù)角度來(lái)做性能優(yōu)化,而數(shù)據(jù)庫(kù)優(yōu)化也是個(gè)很研究很深的問(wèn)題,我這里可以從我所知道的層面上來(lái)說(shuō)一些解決方案)(我們要從CPU,內(nèi)存,IO,寬帶)
1,從數(shù)據(jù)庫(kù)角度:
1.1,給數(shù)據(jù)庫(kù)建索引,加快檢索查詢速度。(但是盡量不要在主庫(kù)上添加索引,因?yàn)橹鲙?kù)主要是用來(lái)增刪改的,從庫(kù)中的查詢可以通過(guò)索引來(lái)提高檢索速度)
1.2,分庫(kù),分表。
1.2.1,分庫(kù):數(shù)據(jù)庫(kù)主從分離
1.2.2,分表:減少表中的數(shù)據(jù)量,就可以在某種程度上加快查詢數(shù)據(jù)。(當(dāng)然了,數(shù)據(jù)庫(kù)服務(wù)器和web站點(diǎn)分離,這是最基本的,讓他們不相互爭(zhēng)搶資源)
1.3,假如是SQL腳本查詢,SQL語(yǔ)句優(yōu)化,可以優(yōu)化join的方式,
比如通過(guò)冗余字段,盡可能減少表之間的Join的次數(shù)。因?yàn)橐话闱闆r下,
當(dāng)表的join個(gè)數(shù)超過(guò)3個(gè),在大訪問(wèn)量的時(shí)候,基本上就可以廢掉了。
1.4,減少使用主外鍵關(guān)系,因?yàn)樵诟聰?shù)據(jù)時(shí),外鍵在會(huì)自動(dòng)更新對(duì)應(yīng)的表的數(shù)據(jù)。我們應(yīng)該盡可能的采用邏輯外鍵,減少校驗(yàn)的過(guò)程。
1.5,使用更高性能的數(shù)據(jù)庫(kù),NoSql引入,解放SQLServer。當(dāng)然啦,因?yàn)橐话闱闆r下,是不會(huì)輕易是更換數(shù)據(jù)庫(kù)的,但是某些情況下這可以作為一種解決問(wèn)題的思路
1.5.1,比如:可以嘗試采用現(xiàn)在比較流行的非關(guān)系型數(shù)據(jù)庫(kù),NoSQL----MongoDB,它是內(nèi)存型的鍵值對(duì)型的數(shù)據(jù)庫(kù)(key,value),因而性能很高
1.5.2,還比如 Redis,它主要是將數(shù)據(jù)全部放到內(nèi)存中,因此,它非常高效,現(xiàn)在的新浪微博就是用的這玩意
1.6,盡量減少和數(shù)據(jù)庫(kù)的交互,盡量實(shí)現(xiàn)批量提交數(shù)據(jù)。比如將一系列的sql語(yǔ)句放到一個(gè)隊(duì)列里,然后從隊(duì)列里批量提,取后再批量和數(shù)據(jù)庫(kù)交互。
1.7,做集群 (站點(diǎn)集群?數(shù)據(jù)庫(kù)集群?)
1.7.1,合理分配服務(wù),避免資源競(jìng)爭(zhēng)。比如應(yīng)用集群方案NLB(NetWork Loading Balance,網(wǎng)絡(luò)負(fù)載均衡)
1.7.2,數(shù)據(jù)庫(kù)集群讀寫(xiě)分離(主庫(kù)Main DB和 從庫(kù)Slav DB)。比如增刪改的操作放在主DB上,查詢的操作放在從DB上,這樣就減小了他們各自訪問(wèn)的壓力
關(guān)于集群不是特別了解,只是看過(guò)一些相關(guān)的文章,因?yàn)槲抑暗拈_(kāi)發(fā)還沒(méi)設(shè)計(jì)到如此超大并發(fā)的情況。
1.7.3,垂直分庫(kù),水平分庫(kù)。 前者需要程序在設(shè)計(jì)階段就將模塊設(shè)計(jì)的低耦合狀態(tài)。后者比如按時(shí)間,這個(gè)月的數(shù)據(jù)消息在這臺(tái)庫(kù)上,下個(gè)月的數(shù)據(jù)放在另一臺(tái)庫(kù)上。
2,從程序端的角度:
2.1,使用緩存,減少每次訪問(wèn)服務(wù)器都去都去讀取數(shù)據(jù)量的性能消耗。
2.2,頁(yè)面靜態(tài)化,減少服務(wù)器端運(yùn)算所帶來(lái)的消耗,這樣就可以盡可能的減少連接數(shù)據(jù)庫(kù)。
2.3,使用離線型的類(lèi)型,實(shí)現(xiàn)懶加載(lazy Load),延遲加載。假如是EF領(lǐng)域開(kāi)發(fā)模式,則可以使用延遲加載機(jī)制。
使用返回IQueryable---這是一個(gè)離線類(lèi)型的。另外我們還可以優(yōu)化linq。
2.4,SOA實(shí)踐(Service Oriented Architecture,即面向服務(wù)架構(gòu)),比如將不同的應(yīng)用服務(wù)部署在不同的機(jī)器,這樣當(dāng)并發(fā)訪問(wèn)的時(shí)候,就可以減少壓力。
2.5,將IIS配置成允許10W的訪問(wèn),這樣可以提高一點(diǎn)訪問(wèn)性能。
2.6,使用異步方式,用異步單獨(dú)用線程去進(jìn)行異步操作。只要設(shè)計(jì)到高并發(fā),我們就咬盡可能使用異步編程。
12,關(guān)于委托,事件,反射,多線程等相關(guān)的東西?
如何解決死鎖:
1,操作資源的時(shí)候,盡量遵循操作順序,不要打亂順序
2,Select查詢的時(shí)候(默認(rèn)是加上了一個(gè)S鎖),而且還有可能為X鎖(拍他鎖)—這種鎖會(huì)排除其他請(qǐng)求,其他所有的請(qǐng)求會(huì)一直等待
解決的辦法:所有的查詢都不加鎖 ,例如:Select * from Table with (nolock)
另外可以將鎖的級(jí)別降到行級(jí)別,具體命令我也記不住
發(fā)布訂閱機(jī)制:可以來(lái)解決數(shù)據(jù)庫(kù)的主從兩個(gè)庫(kù)之間的同步
但它也有缺陷:有一個(gè)10秒的延遲
壓力測(cè)試工具:
1,LR — Loader Rander,是惠普出的一款工具
2,AQTime — 這個(gè)很牛X,甚至能直接看到代碼中的哪一行代碼性能最差,直接確定到某一行代碼級(jí)別
3,TD — 管理Bug
簡(jiǎn)歷自我介紹:
熟悉分布式應(yīng)用開(kāi)發(fā)方式,熟悉面向服務(wù)的開(kāi)發(fā)方式,親自配置Windows NLB負(fù)載均衡、SqlServer 發(fā)布訂閱機(jī)制實(shí)現(xiàn)數(shù)據(jù)集群數(shù)據(jù)同步。項(xiàng)目中應(yīng)用高可用性分布式緩存、高可用性NoSql存儲(chǔ)方案、高可用行Redis隊(duì)列實(shí)現(xiàn)高并發(fā)訪問(wèn)事務(wù)處理。有相當(dāng)?shù)牟渴餝OA的經(jīng)驗(yàn),以及一些分布式項(xiàng)目開(kāi)發(fā)的經(jīng)驗(yàn)和優(yōu)化的經(jīng)驗(yàn)。
熟悉微軟的Asp.Net MVC+EF +IOC+AOP+多層+WCF?開(kāi)發(fā)中大型web網(wǎng)站技術(shù),熟悉SOA分布式應(yīng)用開(kāi)發(fā),熟悉WCF,在金和軟件從事大型SOA平臺(tái)開(kāi)發(fā)經(jīng)驗(yàn)
熟練掌握編寫(xiě)sql語(yǔ)句,編寫(xiě)簡(jiǎn)單存儲(chǔ)過(guò)程。熟悉?Sqlserver2005/2008、Oracle10g。熟悉ORM技術(shù),對(duì)于微軟的Entity Framework技術(shù)做過(guò)深入了解,對(duì)于基礎(chǔ)知識(shí)Ado.Net熟練掌握!Linq更是非常熟練運(yùn)用。
熟悉Spring.Net、Nhibernate等開(kāi)源框架,對(duì)設(shè)計(jì)模式有自己獨(dú)到見(jiàn)解
能夠熟練運(yùn)用JavaScript操作Dom進(jìn)行web前端的動(dòng)態(tài)開(kāi)發(fā)。熟悉JQuary。熟練使用Css+Div對(duì)整個(gè)網(wǎng)頁(yè)進(jìn)行布局,熟練使用float和clear對(duì)div進(jìn)行布局。對(duì)position也有深入的理解。
理解Asp.Net?生命周期,熟悉Http協(xié)議。深刻理解web開(kāi)發(fā)的請(qǐng)求、處理、響應(yīng)模型,熟悉asp.net基礎(chǔ)性原理知識(shí)。
熟悉AspNet MVC開(kāi)發(fā)技術(shù),深入理解視圖引擎處理機(jī)制,粗略閱讀AspNet MVC源碼,非常喜歡Razor引擎對(duì)于前臺(tái)編碼的優(yōu)化
熟悉 靜態(tài)化設(shè)計(jì)、有SEO方面的經(jīng)驗(yàn)
有相關(guān)互聯(lián)網(wǎng)開(kāi)發(fā)經(jīng)驗(yàn),對(duì)于研究過(guò)大型Web網(wǎng)站部署以及架構(gòu)方面知識(shí),對(duì)于負(fù)載均衡、分布式緩存、集群也有相關(guān)自己的認(rèn)識(shí)。
SQL 面試題,去網(wǎng)上找一些題目
什么是多態(tài)?
什么是面向?qū)ο螅? 什么是持久化?
請(qǐng)講一下IsPostBack的原理?
請(qǐng)描述一下Nhibernate的對(duì)象狀態(tài)管理和生命周期? (Nhibernate中的POCO對(duì)象狀態(tài))
請(qǐng)描述一下Nhibernate中有哪幾種集合?他們各自的區(qū)別是什么?(Bag,Set,List,Map)
----=================================================
很多了,數(shù)據(jù)庫(kù)方面問(wèn)的很多。
千萬(wàn)級(jí)數(shù)據(jù),刪除100萬(wàn)行如何最高效。
寫(xiě)一個(gè)linq語(yǔ)句,要求三層嵌套。
使用遞歸寫(xiě)一個(gè)打印輸出(這個(gè)我想了很久,差點(diǎn)都放棄了,最后勉強(qiáng)想出了一個(gè)思路,主要處在那種環(huán)境中感覺(jué)頭腦暈暈的。)
還有自己使用的設(shè)計(jì)模式,并進(jìn)行講解。
自己的特長(zhǎng)等。?
答案:下面的經(jīng)驗(yàn)是針對(duì)SQL Server的,但SYBASE也是同理。希望對(duì)你有幫助。
我們?cè)赟QL Server上面刪除1.6億條記錄,不能用truncate(因?yàn)橹皇莿h除其中部分?jǐn)?shù)據(jù))。經(jīng)過(guò)實(shí)驗(yàn),每次刪除400萬(wàn)條要花1.5 - 3小時(shí),而且是越到后面越慢,正常的話,需要大約102個(gè)小 時(shí),大約4天半時(shí)間。這在生產(chǎn)環(huán)境下是不能接受的。
經(jīng)過(guò)一個(gè)處理之后,我每次刪除400萬(wàn)條記錄花5 - 6分鐘,刪除全部1.6億條記錄花了4 - 5個(gè)小時(shí)!
為什么??
第一:每次刪除記錄,數(shù)據(jù)庫(kù)都要相應(yīng)地更新索引,這是很慢的IO操作。而且后面索引碎片越來(lái)越多,就更慢。這就是為什么一開(kāi)始只花1.5小時(shí),后面要3小時(shí)才能刪除400萬(wàn)條記錄的原因。
我在刪除前先保存當(dāng)前索引的DDL,然后刪除其索引,
然后根據(jù)使用的刪除條件建立一個(gè)臨時(shí)的索引(這是提高速度的另外一個(gè)重要原因?。?
開(kāi)始刪除操作,完成之后再重建之前的索引。
第二:刪除的時(shí)候,不要再記錄日志的模式下,否則日志要爆.并且索引越少,刪除速度越快!
打電話過(guò)來(lái)讓你去面試,公司環(huán)境不錯(cuò),中環(huán)大廈20幾樓,記不清了。先是做題,一共3到,一個(gè)SQL查詢,按時(shí)間橫向顯示,time字段24小時(shí)的記錄
數(shù)據(jù)格式
DATE value
查詢結(jié)果每小時(shí)有多少次評(píng)論
2題,字符串排序
sdfrtger字符串,能有多少種不同順序的顯示
3題,將一組數(shù)字,跟加減乘除小括號(hào)迅運(yùn)算符組合,能得到的結(jié)果等于24的,公式有多少種
問(wèn)了不少,數(shù)據(jù)庫(kù)的查詢,類(lèi)繼承,泛型,靜態(tài)屬性與常量有什么區(qū)別,varchar與nvarchar有什么區(qū)別,流行的JS框架,重要的是WCF,他們的開(kāi)發(fā)商用JS+WCP開(kāi)發(fā)的?
早上9點(diǎn),來(lái)到雙井的京城幾點(diǎn)大廈。首先見(jiàn)到了HR,凡客的部門(mén)間沒(méi)有明確的隔斷區(qū)分,HR就坐在門(mén)口。領(lǐng)到了個(gè)人信息表,開(kāi)始填寫(xiě)。寫(xiě)完交給HR,說(shuō)安排面試。很快一個(gè)技術(shù)人員就來(lái)接 待我。我被安排到了一個(gè)員工餐廳,問(wèn)了一些技術(shù)方面的問(wèn)題。主要是關(guān)于大數(shù)據(jù)量數(shù)據(jù)處理的。我回答說(shuō)沒(méi)有太多這方面的經(jīng)驗(yàn)??脊僖矄?wèn)了我是否有什么想問(wèn)的,我簡(jiǎn)單問(wèn)了一下凡客的軟 件架構(gòu)。于是離開(kāi)。
一共四輪,HR,技術(shù)Lead,部門(mén)經(jīng)理和副總裁。沒(méi)有筆試題,技術(shù)部分就是聊工作經(jīng)驗(yàn),項(xiàng)目心得,然后寫(xiě)了幾個(gè)簡(jiǎn)單的SQL,問(wèn)了問(wèn)設(shè)計(jì)模式,總體來(lái)講比較簡(jiǎn)單。部門(mén)經(jīng)理和副總裁比較關(guān) 注職業(yè)規(guī)劃,未來(lái)想往什么方向發(fā)展,還有對(duì)于合作和領(lǐng)導(dǎo)方式的看法。最后HR常規(guī)性的談?wù)?,就結(jié)束了。
說(shuō)說(shuō)值對(duì)象與引用對(duì)象的區(qū)別??
簡(jiǎn)單的算法,sql查一張表重復(fù)的數(shù)量,委托,反射,多線程。ViewState?
Nhibernate 中POCO狀態(tài)對(duì)象?
瞬時(shí)狀態(tài)
持久狀態(tài)
托管狀態(tài)
數(shù)據(jù)庫(kù)在大數(shù)據(jù)量或者是大并發(fā)的情況下,一般表與表之間不建立真正的主外鍵關(guān)系,而只建立邏輯外鍵。在Nhibernate中采用*.hbm.xml配置文件來(lái)關(guān)聯(lián)表與表的關(guān)系!那么用EF做持久層的 時(shí)候,如何在程序中將表與表的模型關(guān)聯(lián)到一起?
說(shuō)一說(shuō)面向?qū)ο螅?說(shuō)一說(shuō)你對(duì)多態(tài)的理解?
能不能手寫(xiě)SQL腳本?手寫(xiě)function?手寫(xiě)事務(wù)?
Http協(xié)議?
構(gòu)造函數(shù)重載和運(yùn)算符重載? 他們分別是干什么的?
前綁定和后綁定?
談?wù)勀銓?duì)架構(gòu)的理解?
前綁定—編譯的時(shí)候就確定調(diào)用那個(gè)辦法(重載是前綁定)
后綁定—運(yùn)行的時(shí)候才知道調(diào)用哪個(gè)(多態(tài)就是后綁定)
如有錯(cuò)誤歡迎補(bǔ)充,糾正,批評(píng)。
|