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