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