.NET面试经典问答
用.net做B/S結(jié)構(gòu)的系統(tǒng),您是用幾層結(jié)構(gòu)來(lái)開(kāi)發(fā),每一層之間的關(guān)系以及為什么要這樣分層?
答:
從下至上分別為:數(shù)據(jù)訪問(wèn)層、業(yè)務(wù)邏輯層(又或成為領(lǐng)域?qū)?#xff09;、表示層
數(shù)據(jù)訪問(wèn)層:有時(shí)候也稱為是持久層,其功能主要是負(fù)責(zé)數(shù)據(jù)庫(kù)的訪問(wèn)
業(yè)務(wù)邏輯層:是整個(gè)系統(tǒng)的核心,它與這個(gè)系統(tǒng)的業(yè)務(wù)(領(lǐng)域)有關(guān)
表示層:是系統(tǒng)的UI部分,負(fù)責(zé)使用者與整個(gè)系統(tǒng)的交互。?
優(yōu)點(diǎn):? 分工明確,條理清晰,易于調(diào)試,而且具有可擴(kuò)展性。
缺點(diǎn):? 增加成本。
分層式結(jié)構(gòu)究竟其優(yōu)勢(shì)何在?
1、開(kāi)發(fā)人員可以只關(guān)注整個(gè)結(jié)構(gòu)中的其中某一層;
2、可以很容易的用新的實(shí)現(xiàn)來(lái)替換原有層次的實(shí)現(xiàn);
3、可以降低層與層之間的依賴;
4、有利于標(biāo)準(zhǔn)化;
5、利于各層邏輯的復(fù)用。
概括來(lái)說(shuō),分層式設(shè)計(jì)可以達(dá)至如下目的:分散關(guān)注、松散耦合、邏輯復(fù)用、標(biāo)準(zhǔn)定義。
分層式結(jié)構(gòu)也不可避免具有一些缺陷:
1、降低了系統(tǒng)的性能。這是不言而喻的。如果不采用分層式結(jié)構(gòu),很多業(yè)務(wù)可以直接造訪數(shù)據(jù)庫(kù),以此獲取相應(yīng)的數(shù)據(jù),如今卻必須通過(guò)中間層來(lái)完成。
2、有時(shí)會(huì)導(dǎo)致級(jí)聯(lián)的修改。這種修改尤其體現(xiàn)在自上而下的方向。如果在表示層中需要增加一個(gè)功能,為保證其設(shè)計(jì)符合分層式結(jié)構(gòu),可能需要在相應(yīng)的業(yè)務(wù)邏輯層和數(shù)據(jù)訪問(wèn)層中都增加相應(yīng)的代碼。
MVC模式
MVC(Model-View-Controller)把交互系統(tǒng)的組成分解成模型、視圖、控制器三種部件
mvc的優(yōu)點(diǎn):
1.通過(guò)把項(xiàng)目分成model view和controller,使得復(fù)雜項(xiàng)目更加容易維護(hù)。
2.沒(méi)有使用view state和服務(wù)器表單控件,可以更方便的控制應(yīng)用程序的行為
3.應(yīng)用程序通過(guò)controller來(lái)控制程序請(qǐng)求,可以提供豐富的url重寫。
4.對(duì)單元測(cè)試的支持更加出色
5.在團(tuán)隊(duì)開(kāi)發(fā)模式下表現(xiàn)更出眾
MVC的不足:
(1)增加了系統(tǒng)結(jié)構(gòu)和實(shí)現(xiàn)的復(fù)雜性。對(duì)于簡(jiǎn)單的界面,嚴(yán)格遵循MVC,使模型、視圖與控制器分離,會(huì)增加結(jié)構(gòu)的復(fù)雜性,并可能產(chǎn)生過(guò)多的更新操作,降低運(yùn)行效率。???
(2)視圖與控制器間的過(guò)于緊密的連接。視圖與控制器是相互分離,但確實(shí)聯(lián)系緊密的部件,視圖沒(méi)有控制器的存在,其應(yīng)用是很有限的,反之亦然,這樣就妨礙了他們的獨(dú)立重用。???
(3)視圖對(duì)模型數(shù)據(jù)的低效率訪問(wèn)。依據(jù)模型操作接口的不同,視圖可能需要多次調(diào)用才能獲得足夠的顯示數(shù)據(jù)。對(duì)未變化數(shù)據(jù)的不必要的頻繁訪問(wèn),也將損害操作性能。
asp.net如何實(shí)現(xiàn)MVC模式,舉例說(shuō)明!
web/business/dataaccess
列舉ASP.NET 頁(yè)面之間傳遞值的幾種方式。
1.使用QueryString, 如....?id=1; response. Redirect()....
2.使用Session變量
3.使用Server.Transfer
請(qǐng)說(shuō)明在.net中常用的幾種頁(yè)面間傳遞參數(shù)的方法,并說(shuō)出他們的優(yōu)缺點(diǎn)。
QueryString? 傳遞一個(gè)或多個(gè)安全性要求不高或是結(jié)構(gòu)簡(jiǎn)單的數(shù)值。但是對(duì)于傳遞數(shù)組或?qū)ο蟮脑?#xff0c;就不能用這個(gè)方法了
session(viewstate) 簡(jiǎn)單,但易丟失 作用于用戶個(gè)人,過(guò)量的存儲(chǔ)會(huì)導(dǎo)致服務(wù)器內(nèi)存資源的耗盡。?
application 對(duì)象的作用范圍是整個(gè)全局,也就是說(shuō)對(duì)所有用戶都有效。其常用的方法用Lock和UnLock
cookie 簡(jiǎn)單,但可能不支持,可能被偽造 Cookie是存放在客戶端的,而session是存放在服務(wù)器端的。而且Cookie的使用要配合ASP.NET內(nèi)置對(duì)象Request來(lái)使用
input ttype="hidden" 簡(jiǎn)單,可能被偽造
url參數(shù)簡(jiǎn)單,顯示于地址欄,長(zhǎng)度有限
Server.Transfer? 把流程從當(dāng)前頁(yè)面引導(dǎo)到另一個(gè)頁(yè)面中,新的頁(yè)面使用前一個(gè)頁(yè)面的應(yīng)答流
數(shù)據(jù)庫(kù)穩(wěn)定,安全,但性能相對(duì)弱
?
什么是Viewstate?它有什么作用?
ViewState用來(lái)保存頁(yè)面狀態(tài),就是說(shuō)提交之后我們還可以看到文本框里面的內(nèi)容就是ViewState保存的功勞。
ViewState只維護(hù)當(dāng)前頁(yè)面的狀態(tài),不同頁(yè)面之間不能共享,Session可以。
ViewState你可以理解為一個(gè)隱藏控件。
ASP.Net頁(yè)面生命周期
每個(gè)頁(yè)面的生命周期為用戶的每一次訪問(wèn),也就是說(shuō)每一次客戶端與服務(wù)器之間的一個(gè)往返過(guò)程.全局變量的生命周期在此之間.
1. Page_Init();
2. Load ViewState and Postback data;
3. Page_Load();
4. Handle control events;
5. Page_PreRender();
6. Page_Render();
7. Unload event;
8. Dispose method called;
ADO.net中常用的對(duì)象有哪些?分別描述一下。
答:
Connection??????? 打開(kāi)數(shù)據(jù)庫(kù)連接
Command??????????? 執(zhí)行數(shù)據(jù)庫(kù)命令
DataAdapter??????? 連接數(shù)據(jù),執(zhí)行數(shù)據(jù)庫(kù)命令,填充DataSet
DataSet??????????? 數(shù)據(jù)在內(nèi)存中的緩存,數(shù)據(jù)結(jié)構(gòu)
DataReader??????? 只讀向前的讀取數(shù)據(jù)庫(kù)
DataReader和DataSet的異同
DataReader使用時(shí)始終占用SqlConnection,在線操作數(shù)據(jù)庫(kù)..任何對(duì)SqlConnection的操作都會(huì)引發(fā)DataReader的異常..因?yàn)镈ataReader每次只在內(nèi)存中加載一條數(shù)據(jù),所以占用的內(nèi)存是很小的..因?yàn)镈ataReader的特殊性和高性能.所以DataReader是只進(jìn)的..你讀了第一條后就不能再去讀取第一條了..
DataSet則是將數(shù)據(jù)一次性加載在內(nèi)存中.拋棄數(shù)據(jù)庫(kù)連接..讀取完畢即放棄數(shù)據(jù)庫(kù)連接..因?yàn)镈ataSet將數(shù)據(jù)全部加載在內(nèi)存中.所以比較消耗內(nèi)存...但是確比DataReader要靈活..可以動(dòng)態(tài)的添加行,列,數(shù)據(jù).對(duì)數(shù)據(jù)庫(kù)進(jìn)行回傳更新操作...
存儲(chǔ)過(guò)程和sql語(yǔ)句的優(yōu)缺點(diǎn)
優(yōu)點(diǎn):
1.提高性能,減少網(wǎng)絡(luò)傳輸,節(jié)約時(shí)間 。
2.減少網(wǎng)絡(luò)流量??? 存儲(chǔ)過(guò)程位于服務(wù)器上,調(diào)用的時(shí)候只須傳遞存儲(chǔ)過(guò)程的名稱以及參數(shù),不用每次訪問(wèn)都傳遞很長(zhǎng)的sql 語(yǔ)句。
4.安全性???? 減少sql 注入式攻擊。
5.可維護(hù)性高??? 更新存儲(chǔ)過(guò)程通常比更改、測(cè)試以及重新部署程序集需要較少的時(shí)間和精力。
缺點(diǎn):
1.交互性差 。
2.可移植性差
說(shuō)出你所了解的數(shù)據(jù)庫(kù)訪問(wèn)組件(例如ADO,至少4種)
答:ADO,ADO.Net,MDAC(Microsoft Data Access Components),Microsoft SQL Server OLE DB Provider,
Microsoft Jet OLE DB Provider,Desktop Database Drivers ODBC Driver,Visual FoxPro ODBC Driver
什么是面向?qū)ο?
萬(wàn)物都是對(duì)象,其主要特征:封裝、繼承、多態(tài)
怎樣實(shí)現(xiàn)多態(tài)?
1.通過(guò)對(duì)象直接調(diào)用成員函數(shù)時(shí),始終默認(rèn)使用該對(duì)象的類的成員函數(shù)(除非用::顯示指定類名)。
2.通過(guò)指向?qū)ο蟮闹羔樆蛞谜{(diào)用成員函數(shù)時(shí):如果該函數(shù)是實(shí)函數(shù),則調(diào)用該指針或引用的類的成員函數(shù);如果該函
數(shù)是虛函數(shù),則調(diào)用該指針或引用指向的對(duì)象的類的成員函數(shù)。
面向?qū)ο?/span>的思想主要包括什么?
答:任何事物都可以理解為對(duì)象,其主要特征: 繼承。封裝。多態(tài)。特點(diǎn):代碼好維護(hù),安全,隱藏信息
什么是裝箱和拆箱?
答:從值類型接口轉(zhuǎn)換到引用類型裝箱。從引用類型轉(zhuǎn)換到值類型拆箱。裝箱(boxing)是將值類型的數(shù)據(jù)轉(zhuǎn)化成引用類型,int i=3; object o = i ;便是裝箱過(guò)程,而拆箱(unboxing)是將飲用類型數(shù)據(jù)轉(zhuǎn)換值類型,比如int j = (int)o;屬于拆箱
?
什么是Interface?它與Abstract Class有什么區(qū)別?
接口(Interface)是用來(lái)定義行為規(guī)范的,不會(huì)有具體實(shí)現(xiàn),而抽象類除定義行為規(guī)范外,可以有部分實(shí)現(xiàn),但一
個(gè)類能實(shí)現(xiàn)多個(gè)接口,但只能繼承一個(gè)父類??
什么時(shí)候使用抽象類,什么時(shí)候用接口
接口用于規(guī)范,抽象類用于共性。接口中只能聲明方法,屬性,事件,索引器。而抽象類中可以有方法的實(shí)
現(xiàn),也可以定義非靜態(tài)的類變量。抽象類是類,所以只能被單繼承,但是接口卻可以一次實(shí)現(xiàn)多個(gè)。抽象類可以
提供某些方法的部分實(shí)現(xiàn),接口不可以.抽象類的實(shí)例是它的子類給出的。接口的實(shí)例是實(shí)現(xiàn)接口的類給出的。
再抽象類中加入一個(gè)方法,那么它的子類就同時(shí)有了這個(gè)方法。而在接口中加入新的方法,那么實(shí)現(xiàn)它的類就要
重新編寫(這就是為什么說(shuō)接口是一個(gè)類的規(guī)范了)。接口成員被定義為公共的,但抽象類的成員也可以是私有
的、受保護(hù)的、內(nèi)部的或受保護(hù)的內(nèi)部成員(其中受保護(hù)的內(nèi)部成員只能在應(yīng)用程序的代碼或派生類中訪問(wèn))。
此外接口不能包含字段、構(gòu)造函數(shù)、析構(gòu)函數(shù)、靜態(tài)成員或常量。
什么是抽象類(abstract class)?
一種不可以被實(shí)例化的類。抽象類中一般含有抽象方法,當(dāng)然也可有具體實(shí)現(xiàn)。繼承類只有實(shí)現(xiàn)過(guò)所有抽
象類的抽象方法后才能被實(shí)例化。
何時(shí)必須聲明一個(gè)類為抽象類?
當(dāng)這個(gè)類中包含抽象方法時(shí),或是該類并沒(méi)有完全實(shí)現(xiàn)父類的抽象方法時(shí)。
接口(interface)是什么?
只含有共有抽象方法(public abstract method)的類。這些方法必須在子類中被實(shí)現(xiàn)。
為什么不能指定接口中方法的修飾符?
接口中的方法用來(lái)定義對(duì)象之間通信的契約,指定接口中的方法為私有或保護(hù)沒(méi)有意義。他們默認(rèn)為公有方法。
可以繼承多個(gè)接口么?
當(dāng)然。
那么如果這些接口中有重復(fù)的方法名稱呢?
這種情況中你可以決定如何實(shí)現(xiàn)。當(dāng)然需要特別得小心。但是在編譯環(huán)節(jié)是沒(méi)有問(wèn)題的。
接口和抽象類的區(qū)別是什么?
接口中所有方法必須是抽象的,并且不能指定方法的訪問(wèn)修飾符。抽象類中可以有方法的實(shí)現(xiàn),也可以指
定方法的訪問(wèn)修飾符。
詳述.NET里class和struct的異同!
類是引用類型,可以繼承類、接口和被繼承,有默認(rèn)的構(gòu)造函數(shù),有析構(gòu)函數(shù),可以使用abstract和sealed,有protected修飾符,必須使用new初始化。
結(jié)構(gòu)是值類型,只能繼承接口,不能被繼承,沒(méi)有默認(rèn)的構(gòu)造函數(shù),可以創(chuàng)建,沒(méi)有析構(gòu)函數(shù),不可以用abstract和sealed,沒(méi)有protected修飾符,可以不用new初始化。
如何選擇結(jié)構(gòu)還是類
1. 堆棧的空間有限,對(duì)于大量的邏輯的對(duì)象,創(chuàng)建類要比創(chuàng)建結(jié)構(gòu)好一些
2. 結(jié)構(gòu)表示如點(diǎn)、矩形和顏色這樣的輕量對(duì)象
例如,如果聲明一個(gè)含有 1000 個(gè)點(diǎn)對(duì)象的數(shù)組,則將為引用每個(gè)對(duì)象分配附加的內(nèi)存。
在此情況下,結(jié)構(gòu)的成本較低。
3. 在表現(xiàn)抽象和多級(jí)別的對(duì)象層次時(shí),類是最好的選擇
4. 大多數(shù)情況下該類型只是一些數(shù)據(jù)時(shí),結(jié)構(gòu)時(shí)最佳的選擇
C#中的接口和類有什么異同。?
異:
不能直接實(shí)例化接口。
接口不包含方法的實(shí)現(xiàn)。
接口、類和結(jié)構(gòu)可從多個(gè)接口繼承。但是C# 只支持單繼承:類只能從一個(gè)基類繼承實(shí)現(xiàn)。
類定義可在不同的源文件之間進(jìn)行拆分。
同:
接口、類和結(jié)構(gòu)可從多個(gè)接口繼承。
接口類似于抽象基類:繼承接口的任何非抽象類型都必須實(shí)現(xiàn)接口的所有成員。
接口可以包含事件、索引器、方法和屬性。
一個(gè)類可以實(shí)現(xiàn)多個(gè)接口。
const和readonly有什么區(qū)別?
const關(guān)鍵字用來(lái)聲明編譯時(shí)常量,readonly用來(lái)聲明運(yùn)行時(shí)常量。
用sealed修飾的類有什么特點(diǎn)
sealed 修飾符用于防止從所修飾的類派生出其它類。如果一個(gè)密封類被指定為其他類的基類,則會(huì)發(fā)生編譯時(shí)錯(cuò)誤。
密封類不能同時(shí)為抽象類。
sealed 修飾符主要用于防止非有意的派生,但是它還能促使某些運(yùn)行時(shí)優(yōu)化。具體說(shuō)來(lái),由于密封類永
遠(yuǎn)不會(huì)有任何派生類,所以對(duì)密封類的實(shí)例的虛擬函數(shù)成員的調(diào)用可以轉(zhuǎn)換為非虛擬調(diào)用來(lái)處理。
虛函數(shù)的用法
答:
1)virtual指明一成員函數(shù)為虛函數(shù),而virtual僅用于類的定義里,在類外可不加此關(guān)鍵字.
2)一個(gè)類的成員函數(shù)被定義為虛函數(shù)時(shí),子類該函數(shù)仍保持虛函數(shù)特征.
3)子類覆蓋此函數(shù)時(shí),定義里可不加virtual關(guān)鍵字,但函數(shù)聲明要和基類的完全一致!且此聲明是必須的.
4)不是純虛函數(shù)時(shí),父類的虛函數(shù)必須要實(shí)現(xiàn); 而若將父類的虛函數(shù)設(shè)定為純虛函數(shù)時(shí),子類必需要覆蓋之而且必須要實(shí)現(xiàn)之!
解釋virtual、sealed、override和abstract的區(qū)別
virtual申明虛方法的關(guān)鍵字,說(shuō)明該方法可以被重寫
sealed說(shuō)明該類不可被繼承
override重寫基類的方法
abstract申明抽象類和抽象方法的關(guān)鍵字,抽象方法不提供實(shí)現(xiàn),由子類實(shí)現(xiàn),抽象類不可實(shí)例化。
重載和覆寫有什么區(qū)別?
答:重載是方法的名稱相同,不同的參數(shù)類型,不同的參數(shù)個(gè)數(shù),不同的參數(shù)順序。覆寫提供了子類中改變父類方法行為的實(shí)現(xiàn)(是進(jìn)行基類中函數(shù)的重寫)。
在方法定義中,virtual有什么含義?
答:被virtual修飾的方法可以被子類覆寫
能夠?qū)⒎庆o態(tài)的方法覆寫成靜態(tài)方法嗎?
答:不能,覆寫方法的簽名必須與被覆寫方法的簽名保持一致,除了將virtual改為override。
可以覆寫私有的虛方法嗎?
答:不可以,甚至子類中無(wú)法訪問(wèn)父類中的私有方法
能夠阻止某一個(gè)類被其他類繼承嗎?
答:可以,使用關(guān)鍵字sealed
能夠?qū)崿F(xiàn)允許某個(gè)類別繼承,但不允許其中的某個(gè)方法被覆寫嗎?
答:可以,標(biāo)記這個(gè)類為public,并標(biāo)記這個(gè)方法為sealed。
如何區(qū)別重載方法?
不同的參數(shù)類型,不同的參數(shù)個(gè)數(shù),不同的參數(shù)順序
c#繼承:
base 表示當(dāng)前對(duì)象基類的實(shí)例(使用base關(guān)鍵字可以調(diào)用基類的成員)this表示當(dāng)前類的實(shí)例在靜態(tài)方法中不可以使用base和this關(guān)鍵字派生類會(huì)繼承基類所有的成員但是構(gòu)造函數(shù)和析構(gòu)函數(shù)不會(huì)被繼承注意如果派生類的方法和基類的方法同名則基類中的方法將會(huì)被隱藏如果需要隱藏則可以使用關(guān)鍵字new來(lái)隱藏如果不寫new關(guān)鍵字默認(rèn)處理為隱藏雖然基類中同名的方法被隱藏了但是還是可以通過(guò)base關(guān)鍵字來(lái)調(diào)用//如果子類方法的方法名和基類的方法名相同時(shí),系統(tǒng)將隱藏基類同名方法,自動(dòng)調(diào)用子類的同名方法//派生類會(huì)繼承基類所有的成員,但是不能顯示調(diào)用基類的是有成員//在派生類中不可以調(diào)用基類的是有成員,如num1,num2,但是可以實(shí)現(xiàn)調(diào)用基類方法virtual 用在基類中指定一個(gè)虛方法屬性表示這個(gè)方法屬性可以重寫override 用在派生類中表示對(duì)基類虛方法屬性的重寫不能重寫非虛方法或靜態(tài)方法重寫的基方法必須是 virtualabstract 或 override 的為什么 override 也可以重寫呢因?yàn)榛愔械?override 實(shí)際上是對(duì)基類的基類進(jìn)行的重寫由于繼承可傳遞所以也可以對(duì)基類中 override 的方法進(jìn)行重寫override 聲明不能更改 virtual 方法的可訪問(wèn)性override 方法和 virtual 方法必須具有相同的訪問(wèn)級(jí)別修飾符不能使用修飾符 newstaticvirtual 或 abstract 來(lái)修改 override 方法重寫屬性聲明必須指定與繼承屬性完全相同的訪問(wèn)修飾符類型和名稱并且被重寫的屬性必須是 virtualabstract 或 override 的標(biāo)記允許被重寫修飾靜態(tài)方法中不允許使用virtual關(guān)鍵字成員變量允許使用virtual關(guān)鍵字屬性可以被聲明為虛屬性(使用virtual關(guān)鍵字)重寫基類的方法(重寫同名的方法中有virtual關(guān)鍵字的方法)重寫和隱藏的區(qū)別隱藏(new關(guān)鍵字)是給子類的同名方法分配新的內(nèi)存空間重寫(override關(guān)鍵字)是子類的同名方法放在基類同名方法的原來(lái)所在位置基類的同名方法位置向后移屬性也可以重寫virtual關(guān)鍵字和override關(guān)鍵字是成對(duì)出現(xiàn)的否則是語(yǔ)法錯(cuò)誤派生類可以通過(guò)將重寫聲明為 sealed 來(lái)停止虛擬繼承這需要在類成員聲明中的 override 關(guān)鍵字前面放置 sealed 關(guān)鍵字在子類中重寫基類中的虛方法時(shí)可以使用base關(guān)鍵字調(diào)用基類中的虛方法//使用base關(guān)鍵可以在子類中訪問(wèn)基類同名的方法//父類的引用指向子類的實(shí)例Test ts = new Test2();父類的引用指向子類的實(shí)例(調(diào)用的是子類的方法)父類的引用只認(rèn)識(shí)父類的方法不認(rèn)識(shí)子類的新方法可以用來(lái)調(diào)用被子類覆蓋的父類的方法父類的引用依然到父類方法位置去調(diào)用如果基類方法被聲明為virtual并且在子類中被override結(jié)果訪問(wèn)到的是被子類override的方法
C#中的委托是什么?事件是不是一種委托??????
委托可以把一個(gè)方法作為參數(shù)代入另一個(gè)方法。委托可以理解為指向一個(gè)函數(shù)的引用。是,是一種特殊的委托??
C#中的堆和棧
棧(Stack)由系統(tǒng)管理生存期,存儲(chǔ)代碼執(zhí)行和調(diào)用路徑,執(zhí)行或調(diào)用完畢即從棧中清除;
堆(Heap)中保存值和對(duì)象,調(diào)用完畢之后依然存在,由垃圾回收器查找棧中有無(wú)指向該值或?qū)ο蟮囊?#xff0c;無(wú)則從堆中刪除
C# ref與out區(qū)別:
1、使用ref型參數(shù)時(shí),傳入的參數(shù)必須先被初始化。對(duì)out而言,必須在方法中對(duì)其完成初始化。
2、使用ref和out時(shí),在方法的參數(shù)和執(zhí)行方法時(shí),都要加Ref或Out關(guān)鍵字。以滿足匹配。
3、out適合用在需要retrun多個(gè)返回值的地方,而ref則用在需要被調(diào)用的方法修改調(diào)用者的引用的時(shí)候。
你對(duì)泛型了解嗎?簡(jiǎn)單說(shuō)明一下泛型的有什么好處?
泛型:通過(guò)參數(shù)化類型來(lái)實(shí)現(xiàn)在同一份代碼上操作多種數(shù)據(jù)類型。利用“參數(shù)化類型”將類型抽象化,從而實(shí)現(xiàn)靈活的復(fù)用
好處是——類型安全和減少裝箱、拆箱。提高性能、類型安全和質(zhì)量,減少重復(fù)性的編程任務(wù)
C#中所有對(duì)象共同的基類是什么?
System.Object.
如何在C#中實(shí)現(xiàn)繼承?
在類名后加上一個(gè)冒號(hào),再加上基類的名稱。
C#支持多重繼承嗎?
不支持。可以用接口來(lái)實(shí)現(xiàn)。
被protected修飾的屬性/方法在何處可以訪問(wèn)?
在繼承或間接繼承與這個(gè)類的子類中可以訪問(wèn)。
私有成員會(huì)被繼承么?
會(huì),但是不能被訪問(wèn)。所以看上去他們似乎是不能被繼承的,但實(shí)際上確實(shí)被繼承了。
C#提供一個(gè)默認(rèn)的無(wú)參構(gòu)造函數(shù),當(dāng)我實(shí)現(xiàn)了另外一個(gè)有一個(gè)參數(shù)的構(gòu)造函數(shù)時(shí),還想保留這個(gè)無(wú)參數(shù)的構(gòu)
造函數(shù)。這樣我應(yīng)該寫幾個(gè)構(gòu)造函數(shù)?
答:兩個(gè),一旦你實(shí)現(xiàn)了一個(gè)構(gòu)造函數(shù),C#就不會(huì)再提供默認(rèn)的構(gòu)造函數(shù)了,所以需要手動(dòng)實(shí)現(xiàn)那個(gè)無(wú)參構(gòu)造
函數(shù)。
?
?
簡(jiǎn)述 private、 protected、 public、 internal 修飾符的訪問(wèn)權(quán)限。
private : 私有成員, 在類的內(nèi)部才可以訪問(wèn)。
protected : 保護(hù)成員,該類內(nèi)部和繼承類中可以訪問(wèn)。
public : 公共成員,完全公開(kāi),沒(méi)有訪問(wèn)限制。
internal: 在同一命名空間內(nèi)可以訪問(wèn)。
new的兩種用法
答:實(shí)例話對(duì)象,隱藏基類方法。
.new有幾種用法
第一種:new Class();
第二種:覆蓋方法
public new XXXX(){}
第三種:new 約束指定泛型類聲明中的任何類型參數(shù)都必須有公共的無(wú)參數(shù)構(gòu)造函數(shù)。
3.datagrid.datasouse可以連接什么數(shù)據(jù)源 [dataset,datatable,dataview]
dataset,datatable,dataview , IList
類成員有( )種可訪問(wèn)形式
可訪問(wèn)性:public ,protected ,private,internal
委托與事件的用法
答:public delegate void handels();//返回值是void,沒(méi)有參數(shù)
public event handels eventHandels;
his.eventHandels = new handels(fun);
public void fun()
??? { }
傳入某個(gè)屬性的SET方法的隱含參數(shù)的名稱是什么?
答:value,它的類型和屬性所聲明的類型相同。
string是值類型還是引用類型?
引用類型
String類與StringBuilder類有什么區(qū)別?為什么在.Net類庫(kù)中要同時(shí)存在這2個(gè)類?(簡(jiǎn)答)
stringBuilder比string更節(jié)約內(nèi)存,所以stringBuilder更快
String 對(duì)象是不可改變的。每次使用 System.String 類中的方法之一或進(jìn)行運(yùn)算時(shí)(如賦值、拼接等)時(shí),都要
在內(nèi)存中創(chuàng)建一個(gè)新的字符串對(duì)象,這就需要為該新對(duì)象分配新的空間。而 StringBuilder 則不會(huì)。在需要對(duì)字
符串執(zhí)行重復(fù)修改的情況下,與創(chuàng)建新的 String 對(duì)象相關(guān)的系統(tǒng)開(kāi)銷可能會(huì)非常昂貴。如果要修改字符串而不
創(chuàng)建新的對(duì)象,則可以使用 System.Text.StringBuilder 類。例如,當(dāng)在一個(gè)循環(huán)中將許多字符串連接在一起時(shí)
,使用 StringBuilder 類可以提升性能。
在C#中,string str = null 與 string str = “” 請(qǐng)盡量使用文字或圖象說(shuō)明其中的區(qū)別。
答:string str = null 是不給他分配內(nèi)存空間,而string str = "" 給它分配長(zhǎng)度為空字符串的內(nèi)存空間。
ASP.net的身份驗(yàn)證方式有哪些?分別是什么原理?
答:Windwos(默認(rèn))????? 用IIS...From(窗體)????? 用帳戶....Passport(密鑰)
Session有什么重大BUG,微軟提出了什么方法加以解決?
答:是iis中由于有進(jìn)程回收機(jī)制,系統(tǒng)繁忙的話Session會(huì)丟失,可以用Sate server或SQL Server數(shù)據(jù)庫(kù)的方式存儲(chǔ)Session不過(guò)這種方式比較慢,而且無(wú)法捕獲Session的END事件
c#中的三元運(yùn)算符是 ?:
.能用foreach遍歷訪問(wèn)的對(duì)象需要實(shí)現(xiàn)() 接口或聲明 ( GetEnumerator)方法的類型。
.<%# %> 和 <% %> 有什么區(qū)別?
<%# %>表示綁定的數(shù)據(jù)源 <% %>是服務(wù)器端代碼塊 常量
在.net(C# or vb.net)中如何獲得當(dāng)前窗體或控件的句柄,特別是控件本身的句柄(請(qǐng)列舉)
this(C#) Me(vb.net).
.C#可否對(duì)內(nèi)存進(jìn)行直接的操作?
在.net下,.net引用了垃圾回收(GC)功能,它替代了程序員 不過(guò)在C#中,不能直接實(shí)現(xiàn)Finalize方法,而是在析構(gòu)函數(shù)中調(diào)用基類的Finalize()方法
DateTime是否可以為null? 不能,因?yàn)槠錇镾truct類型,而結(jié)構(gòu)屬于值類型,值類型不能為null,只有引用類型才能被賦值null
DateTime.Parse(myString); 這行代碼有什么問(wèn)題?
有問(wèn)題,當(dāng)myString不能滿足時(shí)間格式要求的時(shí)候,會(huì)引發(fā)異常,建議使用DateTime.TryParse()
net的錯(cuò)誤處理機(jī)制是:
采用try->catch->finally結(jié)構(gòu),
為什么不提倡catch(Exception)
try..catch在出現(xiàn)異常的時(shí)候影響性能; 應(yīng)該捕獲更具體得異常,比如IOExeception,OutOfMemoryException等
catch(Exception e){throw e;}和catch(Exception e){throw;}的區(qū)別
將發(fā)生的異常對(duì)象拋出,另一個(gè)只是拋出異常,并沒(méi)有拋出原異常對(duì)象)
error和exception區(qū)別:
error 表示恢復(fù)不是不可能但很困難的情況下的一種嚴(yán)重問(wèn)題。比如說(shuō)內(nèi)存溢出。不可能指望程序能處理這樣的情況。
exception 表示一種設(shè)計(jì)或?qū)崿F(xiàn)問(wèn)題。也就是說(shuō),它表示如果程序運(yùn)行正常,從不會(huì)發(fā)生的情況。
GET與POST的區(qū)別
在FORM提交的時(shí)候,如果不指定Method,則默認(rèn)為GET請(qǐng)求,Form中提交的數(shù)據(jù)將會(huì)附加在url之后,以?分開(kāi)與url分開(kāi)。字母數(shù)字字符原樣發(fā)送,但空格轉(zhuǎn)換為“+“號(hào),其它符號(hào)轉(zhuǎn)換為%XX,其中XX為該符號(hào)以16進(jìn)制表示的ASCII(或ISO Latin-1)值。GET請(qǐng)求請(qǐng)?zhí)峤坏臄?shù)據(jù)放置在HTTP請(qǐng)求協(xié)議頭中,而POST提交的數(shù)據(jù)則放在實(shí)體數(shù)據(jù)中;
在使用 POST 方法的情況下,傳輸數(shù)據(jù)時(shí)不會(huì)將數(shù)據(jù)作為 URL 的一部分;它們會(huì)作為一個(gè)獨(dú)立的實(shí)體來(lái)傳輸。因此,POST 方法更安全,你也可以用這個(gè)方法傳輸更多的數(shù)據(jù)。而且用 POST 傳輸?shù)臄?shù)據(jù)不一定要是文本,用 GET 方法傳輸?shù)膮s一定要是文本。
(1)get是從服務(wù)器上獲取數(shù)據(jù),post是向服務(wù)器傳送數(shù)據(jù)。
(1)在客戶端,Get方式在通過(guò)URL提交數(shù)據(jù),數(shù)據(jù)在URL中可以看到;POST方式,數(shù)據(jù)放置在HTML HEADER內(nèi)提交。
(2)對(duì)于get方式,服務(wù)器端用Request.QueryString獲取變量的值,對(duì)于post方式,服務(wù)器端用Request.Form獲取提交的數(shù)據(jù)。
(2)GET方式提交的數(shù)據(jù)最多只能有1024字節(jié),而POST則沒(méi)有此限制。
(3)安全性問(wèn)題。正如在(1)中提到,使用 Get 的時(shí)候,參數(shù)會(huì)顯示在地址欄上,而 Post 不會(huì)。所以,如果這些數(shù)據(jù)是中文數(shù)據(jù)而且是非敏感數(shù)據(jù),那么使用 get;如果用戶輸入的數(shù)據(jù)不是中文字符而且包含敏感數(shù)據(jù),那么還是使用 post為好。
Bind和Eval函數(shù)的區(qū)別
????? 綁定表達(dá)式
??????? <%# Eval("字段名") %>
?????? <%# Bind("字段名") %>
1? Eval 單向綁定:數(shù)據(jù)是只讀的
??? Bind 雙向綁定:數(shù)據(jù)可以更改,并返回服務(wù)器端,服務(wù)器可以處理更改后的數(shù)據(jù),如存入數(shù)據(jù)庫(kù).
2.當(dāng)對(duì)次表達(dá)式操作時(shí)候,必須用Eval 如<%# Eval("字段名").ToString().Trim() %>
3 綁定控件的屬性時(shí)要用Bind,而Eval則是其它一些。
??? 例如:<asp:TextBox ID="First" RunAt="Server" Text='<%# Bind("FirstName") %>' />
??? 例如:<td><%# Eval("ProductID") %></td>
Response.Redirect和Server.Transfer
請(qǐng)求的過(guò)程:
1)瀏覽器aspx文件請(qǐng)求--->服務(wù)器執(zhí)行--->遇到Response.Redirect語(yǔ)句->服務(wù)器發(fā)送Response.Redirect后面的地址給客戶機(jī)端的瀏覽器--->瀏覽器請(qǐng)求執(zhí)行新的地址
2)瀏覽器aspx文件請(qǐng)求->服務(wù)器執(zhí)行->遇到Server.Transfer語(yǔ)句->服務(wù)器轉(zhuǎn)向新的文件
可以見(jiàn)Server.Transfer比Response.Redirect少了一次服務(wù)器發(fā)送回來(lái)和客戶端再請(qǐng)求的過(guò)程.
跳轉(zhuǎn)對(duì)象:
1)Response.Redirect可以切換到任何存在的網(wǎng)頁(yè)。
2)Server.Transfer只能切換到同目錄或者子目錄的網(wǎng)頁(yè).
數(shù)據(jù)保密:
1、Response.Redirect后地址會(huì)變成跳轉(zhuǎn)后的頁(yè)面地址。
2、Server.Transfer后地址不變,隱藏了新網(wǎng)頁(yè)的地址及附帶在地址后邊的參數(shù)值。具有數(shù)據(jù)保密功能。
傳遞的數(shù)據(jù)量(網(wǎng)址后附帶的參數(shù)):
1、Response.Redirect能夠傳遞的數(shù)據(jù)以2KB(也就是地址欄中地址的最大的長(zhǎng)度)為限。
2、傳遞的數(shù)據(jù)超過(guò)2KB時(shí),務(wù)必使用Server.Transfer。
Server.UrlEncode、HttpUtility.UrlDecode的區(qū)別
Server.UrlEncode的編碼方式是按照本地程序設(shè)置的編碼方式進(jìn)行編碼的,而HttpUtility.UrlEncode是默認(rèn)的按照.net的utf-8格式進(jìn)行編碼的。
Static 和 非Static的區(qū)別:
一、用Static聲明的方法和變量,不需要實(shí)例化該類就調(diào)用;
二、Static的,就一定要用實(shí)例化的對(duì)象來(lái)調(diào)用,即用new來(lái)實(shí)例化。
舉例說(shuō):
如果有一個(gè)類People,有一個(gè)Static的方法MiaoShu(), 調(diào)用方法就是 People.MisoShu()
有一個(gè)非Static的方法getName(), 調(diào)用方法就是 People p= new People(); p.getName();
如何實(shí)現(xiàn)連接池
確保你每一次的連接使用相同的連接字符串(和連接池相同);只有連接字符串相同時(shí)連接池才會(huì)工作。如果連接字符串不相同,應(yīng)用程序就不會(huì)使用連接池而是創(chuàng)建一個(gè)新的連接。
優(yōu)點(diǎn)
使用連接池的最主要的優(yōu)點(diǎn)是性能。創(chuàng)建一個(gè)新的數(shù)據(jù)庫(kù)連接所耗費(fèi)的時(shí)間主要取決于網(wǎng)絡(luò)的速度以及應(yīng)用程序和數(shù)據(jù)庫(kù)服務(wù)器的(網(wǎng)絡(luò))距離,而且這個(gè)過(guò)程通常是一個(gè)很耗時(shí)的過(guò)程。而采用數(shù)據(jù)庫(kù)連接池后,數(shù)據(jù)庫(kù)連接請(qǐng)求可以直接通過(guò)連接池滿足而不需要為該請(qǐng)求重新連接、認(rèn)證到數(shù)據(jù)庫(kù)服務(wù)器,這樣就節(jié)省了時(shí)間。
缺點(diǎn)
數(shù)據(jù)庫(kù)連接池中可能存在著多個(gè)沒(méi)有被使用的連接一直連接著數(shù)據(jù)庫(kù)(這意味著資源的浪費(fèi))。
技巧和提示
1. 當(dāng)你需要數(shù)據(jù)庫(kù)連接時(shí)才去創(chuàng)建連接池,而不是提前建立。一旦你使用完連接立即關(guān)閉它,不要等到垃圾收集器來(lái)處理它。
2. 在關(guān)閉數(shù)據(jù)庫(kù)連接前確保關(guān)閉了所有用戶定義的事務(wù)。
3. 不要關(guān)閉數(shù)據(jù)庫(kù)中所有的連接,至少保證連接池中有一個(gè)連接可用。如果內(nèi)存和其他資源是你必須首先考慮的問(wèn)題,可以關(guān)閉所有的連接,然后在下一個(gè)請(qǐng)求到來(lái)時(shí)創(chuàng)建連接池。
連接池FAQ
1. 何時(shí)創(chuàng)建連接池?
當(dāng)?shù)谝粋€(gè)連接請(qǐng)求到來(lái)時(shí)創(chuàng)建連接池;連接池的建立由數(shù)據(jù)庫(kù)連接的連接字符創(chuàng)來(lái)決定。每一個(gè)連接池都與一個(gè)不同的連接字符串相關(guān)。當(dāng)一個(gè)新的連接請(qǐng)求到來(lái)時(shí)如果連接字符串和連接池使用的字符串相同,就從連接池取出一個(gè)連接;如果不相同,就新建一個(gè)連接池。
2. 何時(shí)關(guān)閉連接池?
當(dāng)連接池中的所有連接都已經(jīng)關(guān)閉時(shí)關(guān)閉連接池。
3. 當(dāng)連接池中的連接都已經(jīng)用完,而有新的連接請(qǐng)求到來(lái)時(shí)會(huì)發(fā)生什么?
當(dāng)連接池已經(jīng)達(dá)到它的最大連接數(shù)目時(shí),有新的連接請(qǐng)求到來(lái)時(shí),新的連接請(qǐng)求將放置到連接隊(duì)列中。當(dāng)有連接釋放給連接池時(shí),連接池將新釋放的連接分配給在隊(duì)列中排隊(duì)的連接請(qǐng)求。你可以調(diào)用close和dispose將連接歸還給連接池。
4. 我應(yīng)該如何允許連接池?
對(duì)于.NET應(yīng)用程序而言,默認(rèn)為允許連接池。(這意味著你可以不必為這件事情做任何的事情)當(dāng)然,如果你可以在SQLConnection對(duì)象的連接字符串中加進(jìn)Pooling=true;確保你的應(yīng)用程序允許連接池的使用。
5. 我應(yīng)該如何禁止連接池?
ADO.NET默認(rèn)為允許數(shù)據(jù)庫(kù)連接池,如果你希望禁止連接池,可以使用如下的方式:
1) 使用SQLConnection對(duì)象時(shí),往連接字符串加入如下內(nèi)容:Pooling=False;
2) 使用OLEDBConnection對(duì)象時(shí),往連接字符串加入如下內(nèi)容:OLE DB Services=-4;
提高.NET的性能
1 使用異步方式調(diào)用Web服務(wù)和遠(yuǎn)程對(duì)象
只要有可能就要避免在請(qǐng)求的處理過(guò)程中對(duì)Web服務(wù)和遠(yuǎn)程對(duì)象的同步調(diào)用,因?yàn)樗加玫氖堑腁SP.NET 線程池中的工作線程,這將直接影響Web服務(wù)器響應(yīng)其它請(qǐng)求的能力。
2 使用適當(dāng)?shù)腃aching策略來(lái)提高性能
3 判斷字符串,不要用""比較。
//避免
if(strABC!=null && strABC!="")
{}
//推薦
if(!strABC.IsNullOrEmpty)
{}
4 頁(yè)面優(yōu)化
5 用完馬上關(guān)閉數(shù)據(jù)庫(kù)連接
6 盡量使用存儲(chǔ)過(guò)程,并優(yōu)化查詢語(yǔ)句
7 只讀數(shù)據(jù)訪問(wèn)用SqlDataReader,不要使用DataSet
……….
.UDP連接和TCP連接的異同
答:前者只管傳,不管數(shù)據(jù)到不到,無(wú)須建立連接.后者保證傳輸?shù)臄?shù)據(jù)準(zhǔn)確,須要連結(jié).
請(qǐng)解釋轉(zhuǎn)發(fā)與跳轉(zhuǎn)的區(qū)別
轉(zhuǎn)發(fā)就是服務(wù)端的跳轉(zhuǎn)A頁(yè)面提交數(shù)據(jù)到B頁(yè)面,B頁(yè)面進(jìn)行處理然后從服務(wù)端跳轉(zhuǎn)到其它頁(yè)面
跳轉(zhuǎn)就是指客戶端的跳轉(zhuǎn)
簡(jiǎn)述你對(duì)XML Web Service的原理的認(rèn)識(shí)?
答:利用SOAP(簡(jiǎn)單對(duì)象訪問(wèn)協(xié)議)在http上執(zhí)行遠(yuǎn)程方法的調(diào)用,也可以使用WSDL(Web服務(wù)描述語(yǔ)言)來(lái)
完成完整的描述Web服務(wù),然后用UDDI注冊(cè)各個(gè)服務(wù)提供商提供的服務(wù),以便共享他們。
什么叫應(yīng)用程序域?
答:應(yīng)用程序域可以理解為一種輕量級(jí)進(jìn)程。起到安全的作用。占用資源小。
CTS、CLS、CLR分別作何解釋?
答:CTS:通用語(yǔ)言系統(tǒng)。CLS:通用語(yǔ)言規(guī)范。CLR:公共語(yǔ)言運(yùn)行庫(kù)。
什么是受管制的代碼?
答:unsafe:非托管代碼。不經(jīng)過(guò)CLR運(yùn)行。
什么是強(qiáng)類型系統(tǒng)?
答:RTTI:類型識(shí)別系統(tǒng)。
什么是code-behind技術(shù)
codebehind是指代碼和用戶界面分開(kāi)
aspx and cs
在.net中,配件的意思是?
答:程序集。(中間語(yǔ)言,源數(shù)據(jù),資源,裝配清單)
常用的調(diào)用WebService的方法有哪些?
答:1.使用WSDL.exe命令行工具。
??? 2.使用VS.NET中的Add Web Reference菜單選項(xiàng)
net Remoting 的工作原理是什么?
答:服務(wù)器端向客戶端發(fā)送一個(gè)進(jìn)程編號(hào),一個(gè)程序域編號(hào),以確定對(duì)象的位置。
O/R Mapping 的原理
答:利用反射,配置將對(duì)象和數(shù)據(jù)庫(kù)表映射
remoting和webservice兩項(xiàng)技術(shù)的理解以及實(shí)際中的應(yīng)用。
答:WS主要是可利用HTTP,穿透防火墻。而Remoting可以利用TCP/IP,二進(jìn)制傳送提高效率。
out保留字怎么使用,什么時(shí)候使用
答:有時(shí)為了從一個(gè)函數(shù)中返回多個(gè)值,我們需要使用out關(guān)鍵字,把輸出值賦給通過(guò)引用傳遞給方法的變量(也就是參數(shù))。但C#要求變量再被引用的前必須初始化。在調(diào)用該方法時(shí),還需要添加out關(guān)鍵字
PDB是什么東西? 在調(diào)試中它應(yīng)該放在哪里?
PDB是用于保存調(diào)試和項(xiàng)目狀態(tài)信息的文件,在debug的時(shí)候?qū)a(chǎn)生pdb文件,調(diào)試的時(shí)候應(yīng)該放在和對(duì)應(yīng)應(yīng)用
程序集相同目錄。
使用ASMX的XML Web服務(wù)與使用SOAP的.NET Remoting的區(qū)別?
Web服務(wù)使用的消息機(jī)制,而Remoting采用的RPC. Web Service能用于不同平臺(tái),不同語(yǔ)言,Remoting只適用
于.Net。效率上Remoting高于Xml Web Service
類型系統(tǒng)是由XMLSchema表示的嗎?CLS是XMLSchema表示的嗎?
不清楚
從概念上闡述前期綁定(early-binding)和后期綁定(late-binding)的區(qū)別?
這個(gè)就像是強(qiáng)弱類型的比較相似,前期綁定是在編譯的時(shí)候就確定了要綁定的數(shù)據(jù),而后期綁定是在運(yùn)行的時(shí)候
才填充數(shù)據(jù)。所以前期綁定如果失敗,會(huì)在編譯時(shí)報(bào)編譯錯(cuò)誤,而后期綁定失敗只有在運(yùn)行時(shí)的時(shí)候才發(fā)生
調(diào)用Assembly.Load算靜態(tài)引用還是動(dòng)態(tài)引用?
動(dòng)態(tài)
列舉一下你所了解的XML技術(shù)及其應(yīng)用
答:保存配置,站與站之間的交流,WEB SERVICE。以及與數(shù)據(jù)庫(kù)的數(shù)據(jù)交互等地方都要用它.
7.如何理解委托?
答:
相當(dāng)于函數(shù)指針,定義了委托就可以在不調(diào)用原方法名稱的情況下調(diào)用那個(gè)方法.
委托具有以下特點(diǎn):
委托類似于 C++ 函數(shù)指針,但它是類型安全的。
委托允許將方法作為參數(shù)進(jìn)行傳遞。
委托可用于定義回調(diào)方法。
委托可以鏈接在一起;例如,可以對(duì)一個(gè)事件調(diào)用多個(gè)方法。
方法不需要與委托簽名精確匹配。有關(guān)更多信息,請(qǐng)參見(jiàn)協(xié)變和逆變。
C# 2.0 版引入了匿名方法的概念,此類方法允許將代碼塊作為參數(shù)傳遞,以代替單獨(dú)定義的方法。
概述反射和序列化
反射:程序集包含模塊,而模塊包含類型,類型又包含成員。反射則提供了封裝程序集、模塊和類型的對(duì)
象。您可以使用反射動(dòng)態(tài)地創(chuàng)建類型的實(shí)例,將類型綁定到現(xiàn)有對(duì)象,或從現(xiàn)有對(duì)象中獲取類型。然后,
可以調(diào)用類型的方法或訪問(wèn)其字段和屬性
序列化:序列化是將對(duì)象轉(zhuǎn)換為容易傳輸?shù)母袷降倪^(guò)程。例如,可以序列化一個(gè)對(duì)象,然后使用 HTTP 通
過(guò) Internet 在客戶端和服務(wù)器之間傳輸該對(duì)象。在另一端,反序列化將從該流重新構(gòu)造對(duì)象。
11)? XmlSerializer是如何工作的?使用這個(gè)類的進(jìn)程需要什么ACL權(quán)限?
我只知道XmlSerializer是將對(duì)象的屬性和字段進(jìn)行序列化和反序列化的,序列化成為xml數(shù)據(jù),反序列化再將xml
轉(zhuǎn)換成對(duì)象。應(yīng)該至少需要ACL權(quán)限中的讀權(quán)限.
23)XmlSerializer使用的針對(duì)屬性的模式有什么好處?解決了什么問(wèn)題?
只序列化有用的數(shù)據(jù),而不是序列化整個(gè)對(duì)象。實(shí)現(xiàn)沒(méi)必要的數(shù)據(jù)冗余,和提升序列化時(shí)的性能。
26.根據(jù)委托(delegate)的知識(shí),請(qǐng)完成以下用戶控件中代碼片段的填寫:
namespace test
{
public delegate void OnDBOperate();
public class UserControlBase : System.Windows.Forms.UserControl
{
public event OnDBOperate OnNew;
privatevoidtoolBar_ButtonClick(objectsender,System.Windows.Forms.ToolBarButtonClickEventArgs e)
{
if(e.Button.Equals(BtnNew))
{
//請(qǐng)?jiān)谝韵卵a(bǔ)齊代碼用來(lái)調(diào)用OnDBOperate委托簽名的OnNew事件。
}
}
}
答:if( OnNew != null )?
??? OnNew( this, e );
27.分析以下代碼,完成填空
string strTmp = "abcdefg某某某";
int i= System.Text.Encoding.Default.GetBytes(strTmp).Length;
int j= strTmp.Length;
以上代碼執(zhí)行完后,i= j=
答:i=13,j=10
28.SQLSERVER服務(wù)器中,給定表 table1 中有兩個(gè)字段 ID、LastUpdateDate,ID表示更新的事務(wù)號(hào),
LastUpdateDate表示更新時(shí)的服務(wù)器時(shí)間,請(qǐng)使用一句SQL語(yǔ)句獲得最后更新的事務(wù)號(hào)
答:Select ID FROM table1 Where LastUpdateDate = (Select MAX(LastUpdateDate) FROM table1)
29.根據(jù)線程安全的相關(guān)知識(shí),分析以下代碼,當(dāng)調(diào)用test方法時(shí)i>10時(shí)是否會(huì)引起死鎖?并簡(jiǎn)要說(shuō)明理由。
public void test(int i)
{
?? lock(this)
{
?? if (i>10)
?? {
???? i--;
???? test(i);
?? }
}
}
答:不會(huì)發(fā)生死鎖,(但有一點(diǎn)int是按值傳遞的,所以每次改變的都只是一個(gè)副本,因此不會(huì)出現(xiàn)死鎖。但如果
把int換做一個(gè)object,那么死鎖會(huì)發(fā)生)
3) 什么叫圈復(fù)雜度(cyclomatic complexity)?為什么它很重要?
不知道,望指教 ?
4) 寫一個(gè)標(biāo)準(zhǔn)的lock(),在訪問(wèn)變量的前后創(chuàng)建臨界區(qū),要有"雙重檢查",
lock的使用
? public void LockTest()
??????? {
??????????? Object lockObj = new Object();
??????????? lock (lockObj)
??????????? {
??????????????? //
??????????? }
??????? }
5) 什么叫FullTrust?放入GAC的assembly是否是FullTrust的?
FullTrust完全信任。放入GAC中的Assembly是否FullTrust我的理解不是。我理解FullTrust是可以通過(guò)代碼設(shè)定的
6) 代碼加上需要安全權(quán)限的特性有什么好處?
可以更加靈活的設(shè)置對(duì)代碼的訪問(wèn)權(quán)限,實(shí)現(xiàn)代碼級(jí)保護(hù)。?這點(diǎn)不是特清楚,有明白的給講解下
7) gacutil /l | find /i "Corillian" 這句命令的作用是什么?
全局程序集緩存中如果有Corillian就更新該程序集,沒(méi)有就安裝
8) sn -t foo.dll 這句命令是干嘛的?
顯示程序集foo.dll的公鑰標(biāo)記
9) DCOM需要防火墻打開(kāi)哪些端口?端口135是干嘛用的?
135端口,因?yàn)镈COM的端口號(hào)是隨機(jī)分配的,默認(rèn)情況下,會(huì)分配1024以上的端口號(hào),所以默認(rèn)情況下,DCOM
不能穿越防火墻。因?yàn)楦静粫缘瞄_(kāi)哪個(gè)端口。但有解決辦法可以使DCOM分配的端口號(hào)固定,135是遠(yuǎn)程過(guò)程
調(diào)用(RPC)的默認(rèn)端口
10)對(duì)比OOP和SOA,它們的目的分別是什么?
我想OOP和SOA應(yīng)該沒(méi)有對(duì)比性吧。OOP是一種編程模型,強(qiáng)調(diào)將復(fù)雜的邏輯分解出小的模塊,特性是繼承,封
裝和多態(tài) 。而SOA是一個(gè)技術(shù)框架,技術(shù)框架和編程模型應(yīng)該說(shuō)不是一碼事吧?SOA的思想是將業(yè)務(wù)邏輯封裝
成服務(wù)或者中間件提供給應(yīng)用程序來(lái)調(diào)用,當(dāng)然其組件化思想是繼承和發(fā)揚(yáng)了OOP的優(yōu)點(diǎn)。
13)Debug.Write和Trace.Write有什么不同?何時(shí)應(yīng)該使用哪一個(gè)?
Debug.Write是調(diào)試的時(shí)候向跟蹤窗口輸出信息。當(dāng)編譯模式為debug的時(shí)候才有效,為release的時(shí)
候Debug.Write在編譯的時(shí)候會(huì)忽略,而Trace則是在debug和release兩種模式下均可以向跟蹤窗口輸出信息。
14)Debug Build和Release Build的區(qū)別,是否會(huì)有明顯的速度變化?請(qǐng)說(shuō)明理由。
Debug會(huì)產(chǎn)生pdb文件,release不會(huì)。Debug用于開(kāi)發(fā)時(shí)的調(diào)試,不能要于部署,而release用于部署.debug編
譯一些特殊代碼,比如#IFDEBUG Debug.Write等,而Release則會(huì)將那些特殊標(biāo)記省略
15)JIT是以assembly為單位發(fā)生還是以方法為單位發(fā)生?這對(duì)于工作區(qū)有何影響?
方法,道理很簡(jiǎn)單,因?yàn)閷?duì)于一次運(yùn)行,很可能只用到一個(gè)程序集中極少數(shù)類型和對(duì)象,而大部分可能并不會(huì)被
使用,此時(shí)CLR傻乎乎的給整個(gè)程序集都給Compile了,CLR不是傻瘋了么?
17)a.Equals(b)和a == b一樣嗎?
不一樣。a.Equals(b)表示a與b一致, a==b表示a與b的值相等
18)在對(duì)象比較中,對(duì)象一致和對(duì)象相等分別是指什么?
對(duì)象一致是指兩個(gè)對(duì)象是同一個(gè)對(duì)象,引用相同。而對(duì)象相等是指兩個(gè)對(duì)象的值相同,但引用不一定相同
19)在.NET中如何實(shí)現(xiàn)深拷貝(deep copy)?
實(shí)現(xiàn)IClonable接口
20)請(qǐng)解釋一下IClonable
IClonable方法是實(shí)現(xiàn)深度復(fù)制的接口,實(shí)現(xiàn)它應(yīng)該能深度復(fù)制一個(gè)對(duì)象出來(lái)。深度復(fù)制的特征的調(diào)用對(duì)象的構(gòu)造
方法,創(chuàng)建新的對(duì)象,包括創(chuàng)建對(duì)象中嵌套的引用對(duì)象的新實(shí)例。而Shadow復(fù)制則不同,是淺表復(fù)制,不重新
創(chuàng)建新實(shí)例。淺表復(fù)制的實(shí)現(xiàn)是Object.MemberWiseClone().
深度復(fù)制(Deep Copy)與淺表復(fù)制(Shadow Copy)的比較
? public class Name
??? {
??????? public string FirstName;
??????? public string LastName;
??? }
??? public class Person:ICloneable
??? {
??????? public Name PersonName;
??????? public string Email;
??????? /** <summary>
??????? /// Deep Copy的例子
??????? /// </summary>
??????? /// <returns></returns>
??????? public Object Clone()
??????? {
??????????? Person p = new Person();
??????????? p.Email = this.Email;
??????????? p.PersonName = new Name();
??????????? p.PersonName.FirstName = this.PersonName.FirstName;
??????????? p.PersonName.LastName = this.PersonName.LastName;
??????????? return p;
??????? }
??????? public void ChangLastName(string lastName)
??????? {
??????????? this.PersonName.LastName = lastName;
??????? }
??????? public static void Main()
??????? {
??????????? Person p = new Person();
??????????? p.PersonName = new Name();
??????????? p.PersonName.LastName = "jill";
??????????? p.PersonName.FirstName = "zhang";
??????????? p.Email = "jillzhang@126.com";
??????????? Person sameNamePerson = p.Clone() as Person;
??????????? sameNamePerson.ChangLastName("clr_");
??????????? Console.WriteLine(p.PersonName.LastName);
??????????? Console.WriteLine(sameNamePerson.PersonName.LastName);???????????
??????????? Person samePerson = p.MemberwiseClone() as Person;
??????????? samePerson.ChangLastName("Shadow");
??????????? Console.WriteLine(p.PersonName.LastName);
??????????? Console.WriteLine(sameNamePerson.PersonName.LastName);
??????????? Console.Read();
??????? }
??? }
24)為什么不應(yīng)該在.NET中使用out參數(shù)?它究竟好不好?
我挺喜歡用out參數(shù)的,特別是當(dāng)函數(shù)需要有多于1個(gè)返回的時(shí)候,我比較愿意用out,至于它好不好沒(méi)研究過(guò) ?
25)特性能夠放到某個(gè)方法的參數(shù)上?如果可以,這有什么用?
可以,作用可以對(duì)參數(shù)有進(jìn)一步限定,比如輸入?yún)?shù)為int類型,可以通過(guò)允許AttributeTargets=ParameterInfo
的Attribute自定義實(shí)現(xiàn)來(lái)限定輸入?yún)?shù)的大小,比如當(dāng)輸入?yún)?shù)小于100的時(shí)候便抱錯(cuò)。
對(duì)方法的參數(shù)設(shè)置Attribute的例子
? [AttributeUsage(AttributeTargets.Parameter)]
??? public class ParameterAtt : Attribute
??? {
??????? public int Min = 100;
??? }
??? public class AttributeTest
??? {??????
??????? public void TestMethod([ParameterAtt(Min = 100)] int par1)
??????? {
??????????? ParameterInfo para = MethodInfo.GetCurrentMethod().GetParameters()[0];
??????????? ParameterAtt att = ParameterAtt.GetCustomAttribute(para, typeof(ParameterAtt)) as
ParameterAtt;
??????????? if (att.Min > par1)
??????????? {
??????????????? throw new Exception("要求para1最小為" + att.Min);
??????????? }
??????? }
??? }
9.執(zhí)行下面代碼后:
String strTemp ="abcdefg 某某某";
Int i System.Text.Encoding.Default.GetBytes(strTemp).Length;
Int j = strTemp.Length;
問(wèn):i=(14 ) ;j=(11 )
i=(14 ) ;j=(11 ) 中文兩個(gè)字節(jié)
12.概述.NET里對(duì) remoting 和 webservice 兩項(xiàng)技術(shù)的理解和實(shí)際中的應(yīng)用。
遠(yuǎn)程邏輯調(diào)用,remoing接口只能用在.net中
9.? 如何給服務(wù)器端控件增加客戶端腳本。
答:控件的Attributes
6. 私有程序集與共享程序集有什么區(qū)別?
一個(gè)私有程序集通常為單個(gè)應(yīng)用程序所使用,并且存儲(chǔ)于這個(gè)應(yīng)用程序所在的目錄之中,或此目錄下面的一個(gè)子
目錄中。共享程序集通常存儲(chǔ)在全局程序集緩存(Global Assembly Cache)之中,這是一個(gè)由.NET運(yùn)行時(shí)所維
護(hù)的程序集倉(cāng)庫(kù)。共享程序集通常是對(duì)許多應(yīng)用程序都有用的代碼庫(kù),比如.NET Framework類。
10 .請(qǐng)解釋ASP.NET中以什么方式進(jìn)行數(shù)據(jù)驗(yàn)證
Aps.net 中有非空驗(yàn)證,比較驗(yàn)證,取值范圍驗(yàn)證,正則表達(dá)式驗(yàn)證及客戶自定義驗(yàn)證五大控件,另還有一個(gè)集
中驗(yàn)證信息處理控件
11.WEB控件可以激發(fā)服務(wù)端事件,請(qǐng)談?wù)劮?wù)端事件是怎么發(fā)生并解釋其原理?自動(dòng)傳回是什么?為什么要
使用自動(dòng)傳回。
在web控件發(fā)生事件時(shí),客戶端采用提交的形式將數(shù)據(jù)交回服務(wù)端,服務(wù)端先調(diào)用Page_Load事件,然后根據(jù)傳
回的狀態(tài)信息自動(dòng)調(diào)用服務(wù)端事件自動(dòng)傳回是當(dāng)我們?cè)邳c(diǎn)擊客戶端控件時(shí),采用提交表單的形式將數(shù)據(jù)直接傳回
到務(wù)端
只有通過(guò)自動(dòng)傳回才能實(shí)現(xiàn)服務(wù)端事件的機(jī)制,如果沒(méi)有自動(dòng)回傳機(jī)制就只能調(diào)用客戶端事件,而不能調(diào)用服務(wù)
端事件
13.? 請(qǐng)解釋web.config文件中的重要節(jié)點(diǎn)
appSettings包含自定義應(yīng)用程序設(shè)置。
system.web 系統(tǒng)配置
compilation動(dòng)態(tài)調(diào)試編譯設(shè)置
customErrors自定義錯(cuò)誤信息設(shè)置
authentication身份驗(yàn)證,此節(jié)設(shè)置應(yīng)用程序的身份驗(yàn)證策略。
authorization授權(quán), 此節(jié)設(shè)置應(yīng)用程序的授權(quán)策略.
14.? 請(qǐng)解釋ASP。NET中的web頁(yè)面與其隱藏類之間的關(guān)系?
一個(gè)ASP.NET頁(yè)面一般都對(duì)應(yīng)一個(gè)隱藏類,一般都在ASP.NET頁(yè)面的聲明中指定了隱藏類例如一個(gè)頁(yè)面Tst1.aspx
的頁(yè)面聲明如下
<%@ Page language="c#" Codebehind="Tst1.aspx.cs" AutoEventWireup="false" Inherits="T1.Tst1" %>
Codebehind="Tst1.aspx.cs" 表明經(jīng)編譯此頁(yè)面時(shí)使用哪一個(gè)代碼文件
Inherits="T1.Tst1" 表用運(yùn)行時(shí)使用哪一個(gè)隱藏類
15.? 什么是viewstate,能否禁用?是否所用控件都可以禁用?
Viewstate是保存狀態(tài)的一種機(jī)制,EnableViewState屬性設(shè)置為false即可禁用
16.? 當(dāng)發(fā)現(xiàn)不能讀取頁(yè)面上的輸入的數(shù)據(jù)時(shí)很有可能是什么原因造成的?怎么解決?
很有可能是在Page_Load中數(shù)據(jù)處理時(shí)沒(méi)有進(jìn)行Page的IsPostBack屬性判斷
17.? 請(qǐng)解釋什么是上下文對(duì)象,在什么情況下要使用上下文對(duì)象
上下文對(duì)象是指HttpContext類的Current 屬性,當(dāng)我們?cè)谝粋€(gè)普通類中要訪問(wèn)內(nèi)置對(duì)
象(Response,Request,Session,Server,Appliction等)時(shí)就要以使用此對(duì)象
16、解釋一下ajax及實(shí)現(xiàn)原理
答:Ajax的核心是JavaScript對(duì)象XmlHttpRequest,它使您可以使用JavaScript向服務(wù)器提出請(qǐng)求并處理響應(yīng), 而不阻塞用戶,異步請(qǐng)求。
1、delegate是引用類型還是值類型?enum、int[]和string呢(難度系數(shù)40%)?
答案:delegate引用類型,enum值類型,int[]引用類型,string引用類型。
3、base這個(gè)關(guān)鍵字有哪幾種語(yǔ)法?override呢?
答案:base兩個(gè)語(yǔ)法,分別是調(diào)用基類構(gòu)造函數(shù)和調(diào)用基類方法,override用于重寫基類方法。
4、請(qǐng)指出C#中是否有下列關(guān)鍵字?virtual、sealed、abstract、import、as、in、goto、final、Const、signed、
String(提示,僅指出C#中沒(méi)有的即可)(難度系數(shù)50%)。
答案:沒(méi)有的關(guān)鍵字:import、final、Const、signed、String
5、在循環(huán):for( int i = 0; i < 100; i++ ) Console.WriteLine( i );中,請(qǐng)指出i++的執(zhí)行時(shí)機(jī)。
答案:在Console.WriterLine( i );執(zhí)行之后
6、試說(shuō)明continue關(guān)鍵字的用處。
答案:馬上開(kāi)始下一次循環(huán),忽略循環(huán)體余下的語(yǔ)句
7、object是C#的關(guān)鍵字嗎?請(qǐng)指出C#中有哪些類型關(guān)鍵字,如int、float。(提示,寫得越多越好)。
答案:是,object、int、uint、long、ulong、short、ushort、byte、sbyte、char、float、double、decimal、boo
l,如回答:enum、struct、class、delegate也算對(duì)。
8、C#的XML文檔注釋中(以///開(kāi)頭的注釋),<summary>標(biāo)簽用于描述什么?<param>標(biāo)簽?zāi)?#xff1f;
答案:<summary>用于某個(gè)元素的概要說(shuō)明,<param>用于某個(gè)方法的參數(shù)概要說(shuō)明。
9、我們知道[]是數(shù)組和索引器的訪問(wèn)操作符,但它還有一個(gè)語(yǔ)法,是什么?
答案:特性(Attribute)
18.請(qǐng)敘述屬性與索引器的區(qū)別。
屬性 索引器????
? 通過(guò)名稱標(biāo)識(shí)。 通過(guò)簽名標(biāo)識(shí)。????
? 通過(guò)簡(jiǎn)單名稱或成員訪問(wèn)來(lái)訪問(wèn)。 通過(guò)元素訪問(wèn)來(lái)訪問(wèn)。????
? 可以為靜態(tài)成員或?qū)嵗蓡T。 必須為實(shí)例成員。????
? 屬性的?? get?? 訪問(wèn)器沒(méi)有參數(shù)。 索引器的?? get?? 訪問(wèn)器具有與索引器相同的形參表。????
? 屬性的?? set?? 訪問(wèn)器包含隱式?? value?? 參數(shù)。 除了?? value?? 參數(shù)外,索引器的?? set?? 訪問(wèn)器還具有與索引
器相同的形參表。
1) 描述線程與進(jìn)程的區(qū)別?
線程(Thread)與進(jìn)程(Process)二者都定義了某種邊界,不同的是進(jìn)程定義的是應(yīng)用程序與應(yīng)用程序之間的邊
界,不同的進(jìn)程之間不能共享代碼和數(shù)據(jù)空間,而線程定義的是代碼執(zhí)行堆棧和執(zhí)行上下文的邊界。一個(gè)進(jìn)程可
以包括若干個(gè)線程,同時(shí)創(chuàng)建多個(gè)線程來(lái)完成某項(xiàng)任務(wù),便是多線程。而同一進(jìn)程中的不同線程共享代碼和數(shù)據(jù)
空間。用一個(gè)比喻來(lái)說(shuō),如果一個(gè)家庭代表一個(gè)進(jìn)程,在家庭內(nèi)部,各個(gè)成員就是線程,家庭中的每個(gè)成員都有
義務(wù)對(duì)家庭的財(cái)富進(jìn)行積累,同時(shí)也有權(quán)利對(duì)家庭財(cái)富進(jìn)行消費(fèi),當(dāng)面對(duì)一個(gè)任務(wù)的時(shí)候,家庭也可以派出幾個(gè)
成員來(lái)協(xié)同完成,而家庭之外的人則沒(méi)有辦法直接消費(fèi)不屬于自己家庭的財(cái)產(chǎn)。
2) 什么是Windows服務(wù),它的生命周期與標(biāo)準(zhǔn)的EXE程序有什么不同
Windows服務(wù)是運(yùn)行在windows后臺(tái)指定用戶下(默認(rèn)System)的應(yīng)用程序,它沒(méi)有標(biāo)準(zhǔn)的UI界面,想比標(biāo)準(zhǔn)
的EXE程序,Windows服務(wù)是在服務(wù)開(kāi)始的時(shí)候創(chuàng)建,而在服務(wù)結(jié)束的時(shí)候銷毀,而且可以設(shè)置服務(wù)是否與操作
系統(tǒng)一起啟動(dòng),一起關(guān)閉。它支持三種方式:1)自動(dòng)方式 2)手動(dòng)方式 3)禁用 。自動(dòng)方式的時(shí)
候,windows服務(wù)將在OS啟動(dòng)后自動(dòng)啟動(dòng)運(yùn)行,而手動(dòng)方式則必須手工啟動(dòng)服務(wù),禁用的情況下服務(wù)將不能被
啟動(dòng)。另外標(biāo)準(zhǔn)的EXE默認(rèn)使用的當(dāng)前登錄的用戶,而windows服務(wù)則默認(rèn)使用System用戶,這在對(duì)系統(tǒng)資源訪
問(wèn)的時(shí)候特別需要注意。
3)? Windows單個(gè)進(jìn)程所能訪問(wèn)的最大內(nèi)存量是多少?它與系統(tǒng)的最大虛擬內(nèi)存一樣嗎?這對(duì)于系統(tǒng)設(shè)計(jì)有什么
影響?
這個(gè)需要針對(duì)硬件平臺(tái),公式為單個(gè)進(jìn)程能訪問(wèn)的最大內(nèi)存量=2的處理器位數(shù)次方/2,比如通常情況下,32位
處理器下,單個(gè)進(jìn)程所能訪問(wèn)的最大內(nèi)存量為:232 /2 = 2G 。單個(gè)進(jìn)程能訪問(wèn)的最大內(nèi)存量是最大虛擬內(nèi)存
的1/2,因?yàn)橐峙浣o操作系統(tǒng)一半虛擬內(nèi)存。
4)? 什么是強(qiáng)類型,什么是弱類型?哪種更好些?為什么?
強(qiáng)類型是在編譯的時(shí)候就確定類型的數(shù)據(jù),在執(zhí)行時(shí)類型不能更改,而弱類型在執(zhí)行的時(shí)候才會(huì)確定類型。沒(méi)有
好不好,二者各有好處,強(qiáng)類型安全,因?yàn)樗孪纫呀?jīng)確定好了,而且效率高。一般用于編譯型編程語(yǔ)
言,如c++,java,c#,pascal等,弱類型相比而言不安全,在運(yùn)行的時(shí)候容易出現(xiàn)錯(cuò)誤,但它靈活,多用于解釋型編
程語(yǔ)言,如javascript,vb等
5)? PID是什么?在做系統(tǒng)的故障排除時(shí)如何使用它?
PID是進(jìn)程編號(hào),在系統(tǒng)發(fā)現(xiàn)故障的時(shí)候,可以根據(jù)它尋找故障所發(fā)生的具體進(jìn)程,并且可通過(guò)visual studio.net
等ide將故障進(jìn)程附加到進(jìn)程中進(jìn)行調(diào)試(debug)
6)? 單個(gè)TCP/IP端口上能夠被多少個(gè)進(jìn)程偵聽(tīng)?
1個(gè)
7)? 什么是GAC?它解決了什么問(wèn)題?
Gloal Assembly Cache,全局應(yīng)用程序集緩存。它解決了幾個(gè)程序共享某一個(gè)程序集的問(wèn)題。不必再將那個(gè)被共
享的程序集拷貝到應(yīng)用程序目錄了,其實(shí)這道理很簡(jiǎn)單,.net應(yīng)用程序在加載的時(shí)候,會(huì)首先查看全局應(yīng)用程序
集緩存,如果有就可以直接使用,沒(méi)有再到應(yīng)用程序目錄進(jìn)行查找。
1.白盒測(cè)試和黑盒測(cè)試
答:黑盒測(cè)試:已知產(chǎn)品的功能設(shè)計(jì)規(guī)格,可以進(jìn)行測(cè)試證明每個(gè)實(shí)現(xiàn)了的功能是否符合要求。
白盒測(cè)試:已知產(chǎn)品的內(nèi)部工作過(guò)程,可以通過(guò)測(cè)試證明每種內(nèi)部操作是否符合設(shè)計(jì)規(guī)格要求,所有內(nèi)部成
分是否以經(jīng)過(guò)檢查。
軟件的黑盒測(cè)試意味著測(cè)試要在軟件的接口處進(jìn)行。這種方法是把測(cè)試對(duì)象看做一個(gè)黑盒子,測(cè)試人員完全
不考慮程序內(nèi)部的邏輯結(jié)構(gòu)和內(nèi)部特性,只依據(jù)程序的需求規(guī)格說(shuō)明書(shū),檢查程序的功能是否符合它的功能說(shuō)明
。因此黑盒測(cè)試又叫功能測(cè)試或數(shù)據(jù)驅(qū)動(dòng)測(cè)試。黑盒測(cè)試主要是為了發(fā)現(xiàn)以下幾類錯(cuò)誤:
1、是否有不正確或遺漏的功能?
2、在接口上,輸入是否能正確的接受?能否輸出正確的結(jié)果?
3、是否有數(shù)據(jù)結(jié)構(gòu)錯(cuò)誤或外部信息(例如數(shù)據(jù)文件)訪問(wèn)錯(cuò)誤?
4、性能上是否能夠滿足要求?
5、是否有初始化或終止性錯(cuò)誤?
軟件的白盒測(cè)試是對(duì)軟件的過(guò)程性細(xì)節(jié)做細(xì)致的檢查。這種方法是把測(cè)試對(duì)象看做一個(gè)打開(kāi)的盒子,它允許
測(cè)試人員利用程序內(nèi)部的邏輯結(jié)構(gòu)及有關(guān)信息,設(shè)計(jì)或選擇測(cè)試用例,對(duì)程序所有邏輯路徑進(jìn)行測(cè)試。通過(guò)在不
同點(diǎn)檢查程序狀態(tài),確定實(shí)際狀態(tài)是否與預(yù)期的狀態(tài)一致。因此白盒測(cè)試又稱為結(jié)構(gòu)測(cè)試或邏輯驅(qū)動(dòng)測(cè)試。白盒
測(cè)試主要是想對(duì)程序模塊進(jìn)行如下檢查:
1、對(duì)程序模塊的所有獨(dú)立的執(zhí)行路徑至少測(cè)試一遍。
2、對(duì)所有的邏輯判定,取“真”與取“假”的兩種情況都能至少測(cè)一遍。
3、在循環(huán)的邊界和運(yùn)行的界限內(nèi)執(zhí)行循環(huán)體。
4、測(cè)試內(nèi)部數(shù)據(jù)結(jié)構(gòu)的有效性,等等。
請(qǐng)簡(jiǎn)述一下用Socket進(jìn)行同步通訊編程的詳細(xì)步驟
1、在應(yīng)用程序和遠(yuǎn)程設(shè)備中使用協(xié)議和網(wǎng)絡(luò)地址初始化套接字
2、在應(yīng)用程序中通過(guò)指定端口和地址建立監(jiān)聽(tīng)
3、遠(yuǎn)程設(shè)備發(fā)出連接請(qǐng)求
4、應(yīng)用程序接受連接產(chǎn)生通信scoket
5、應(yīng)用程序和遠(yuǎn)程設(shè)備開(kāi)始通訊(在通訊中應(yīng)用程序?qū)炱鹬钡酵ㄓ嵔Y(jié)束)
6、通訊結(jié)束,關(guān)閉應(yīng)用程序和遠(yuǎn)程設(shè)備的Socket回收資源
OSI網(wǎng)絡(luò)結(jié)構(gòu)的七層模型及其核心思想是什么
第七層:應(yīng)用層?
???? 定義了用于在網(wǎng)絡(luò)中進(jìn)行通信和數(shù)據(jù)傳輸?shù)慕涌?- 用戶程式;?
???? 提供標(biāo)準(zhǔn)服務(wù),比如虛擬終端、文件以及任務(wù)的傳輸和處理;
第六層:表示層
??? 掩蓋不同系統(tǒng)間的數(shù)據(jù)格式的不同性;
??? 指定獨(dú)立結(jié)構(gòu)的數(shù)據(jù)傳輸格式;
??? 數(shù)據(jù)的編碼和解碼;加密和解密;壓縮和解壓縮
第五層:會(huì)話層
??? 管理用戶會(huì)話和對(duì)話;
??? 控制用戶間邏輯連接的建立和掛斷;
??? 報(bào)告上一層發(fā)生的錯(cuò)誤
第四層:傳輸層
??? 管理網(wǎng)絡(luò)中端到端的信息傳送;
??? 通過(guò)錯(cuò)誤糾正和流控制機(jī)制提供可靠且有序的數(shù)據(jù)包傳送;
??? 提供面向無(wú)連接的數(shù)據(jù)包的傳送;
第三層:網(wǎng)絡(luò)層
??? 定義網(wǎng)絡(luò)設(shè)備間如何傳輸數(shù)據(jù);
??? 根據(jù)唯一的網(wǎng)絡(luò)設(shè)備地址路由數(shù)據(jù)包;
??? 提供流和擁塞控制以防止網(wǎng)絡(luò)資源的損耗
第二層:數(shù)據(jù)鏈路層?
??? 定義操作通信連接的程序;?
??? 封裝數(shù)據(jù)包為數(shù)據(jù)幀;?
??? 監(jiān)測(cè)和糾正數(shù)據(jù)包傳輸錯(cuò)誤
第一層:物理層?
??? 定義通過(guò)網(wǎng)絡(luò)設(shè)備發(fā)送數(shù)據(jù)的物理方式;?
??? 作為網(wǎng)絡(luò)媒介和設(shè)備間的接口;
??? 定義光學(xué)、電氣以及機(jī)械特性。
2 幾十上百萬(wàn)行,如何快速查詢出表數(shù)據(jù)
答:用分頁(yè)存儲(chǔ)過(guò)程
/*
? 函數(shù)名稱: GetRecordFromPage
? 函數(shù)功能: 獲取指定頁(yè)的數(shù)據(jù)
? 參數(shù)說(shuō)明: @tblName????? 包含數(shù)據(jù)的表名
?????????? @fldName????? 關(guān)鍵字段名
?????????? @PageSize???? 每頁(yè)記錄數(shù)
?????????? @PageIndex??? 要獲取的頁(yè)碼
?????????? @OrderType??? 排序類型, 0 - 升序, 1 - 降序
?????????? @strWhere???? 查詢條件 (注意: 不要加 where)
*/
CREATE PROCEDURE GetRecordFromPage
??? @tblName????? varchar(255),?????? -- 表名
??? @fldName????? varchar(255),?????? -- 字段名
??? @PageSize???? int = 10,?????????? -- 頁(yè)尺寸
??? @PageIndex??? int = 1,??????????? -- 頁(yè)碼
??? @OrderType??? bit = 0,??????????? -- 設(shè)置排序類型, 非 0 值則降序
??? @strWhere???? varchar(2000) = ''? -- 查詢條件 (注意: 不要加 where)
AS
declare @strSQL?? varchar(6000)?????? -- 主語(yǔ)句
declare @strTmp?? varchar(1000)?????? -- 臨時(shí)變量
declare @strOrder varchar(500)??????? -- 排序類型
if @OrderType != 0
begin
??? set @strTmp = '<(select min'
??? set @strOrder = ' order by [' + @fldName + '] desc'
end
else
begin
??? set @strTmp = '>(select max'
??? set @strOrder = ' order by [' + @fldName +'] asc'
end
set @strSQL = 'select top ' + str(@PageSize) + ' * from ['
??? + @tblName + '] where [' + @fldName + ']' + @strTmp + '(['
??? + @fldName + ']) from (select top ' + str((@PageIndex-1)*@PageSize) + ' ['
??? + @fldName + '] from [' + @tblName + ']' + @strOrder + ') as tblTmp)'
??? + @strOrder
if @strWhere != ''
??? set @strSQL = 'select top ' + str(@PageSize) + ' * from ['
??????? + @tblName + '] where [' + @fldName + ']' + @strTmp + '(['
??????? + @fldName + ']) from (select top ' + str((@PageIndex-1)*@PageSize) + ' ['
??????? + @fldName + '] from [' + @tblName + '] where ' + @strWhere + ' '
??????? + @strOrder + ') as tblTmp) and ' + @strWhere + ' ' + @strOrder
if @PageIndex = 1
begin
??? set @strTmp = ''
??? if @strWhere != ''
??????? set @strTmp = ' where (' + @strWhere + ')'
??? set @strSQL = 'select top ' + str(@PageSize) + ' * from ['
??????? + @tblName + ']' + @strTmp + ' ' + @strOrder
end
exec (@strSQL)
GO
三、數(shù)據(jù)庫(kù)查詢優(yōu)化:
1、多態(tài)性,多種數(shù)據(jù)庫(kù)兼容;
2、支持翻頁(yè),支持查詢總數(shù),頁(yè)碼顯示;
3、能處理100萬(wàn)以上數(shù)據(jù)量;
答:
CREATE?? PROCEDURE?? dbo.LSP_SP_SelectElementByPage??????
? @SelectFields?? varchar(200),/*要查詢的字段列表*/??
? @Condition?? varchar(300),/*查詢條件*/??
? @PageSize?? int?? =20,/*頁(yè)面大小,默認(rèn)為20*/??
? @PageNumber?? int?? =1/*頁(yè)號(hào),默認(rèn)為第一頁(yè)*/??
? /*@PageCount?? int?? out返回滿足條件的總頁(yè)數(shù)*/??
? AS??
? begin??
? declare?? @count?? int??
? select?? @count?? =count(*)?? from?? lsp_t_elementInfo??
? if(@count?? %@PageSize=0)??
? set?? @count?? =?? @count/@PageSize??
? else??
? set?? @count?? =?? @count/@PageSize?? +1??
? select?? @count?? PageCount??
? select?? IDENTITY(int,1,1)?? as?? iid,ElementName,Type?? into?? #temptable?? from?? LSP_T_ElementInfo??
? select???? *?? from?? #temptable?? where?? iid?? between???? @PageSize?? *?? (@PageNumber?? -1)?? and?? @PageSize?? *?? @PageNumber??
? end??
? GO
1.兩個(gè)表,寫查詢語(yǔ)句,根據(jù)兩個(gè)字段一個(gè)是升序,一個(gè)將序。
答:select * from a,b where a.字段1 = b.字段1 order by a.字段2 asc,b.字段2 desc
2.根據(jù)第一題,每頁(yè)面顯示10條記錄,在第25頁(yè)時(shí)怎樣顯示
答:
/*
? 函數(shù)名稱: GetRecordFromPage
? 函數(shù)功能: 獲取指定頁(yè)的數(shù)據(jù)
? 參數(shù)說(shuō)明: @tblName????? 包含數(shù)據(jù)的表名
?????????? @fldName????? 關(guān)鍵字段名
?????????? @PageSize???? 每頁(yè)記錄數(shù)
?????????? @PageIndex??? 要獲取的頁(yè)碼
?????????? @OrderType??? 排序類型, 0 - 升序, 1 - 降序
?????????? @strWhere???? 查詢條件 (注意: 不要加 where)
*/
CREATE PROCEDURE GetRecordFromPage
??? @tblName????? varchar(255),?????? -- 表名
??? @fldName????? varchar(255),?????? -- 字段名
??? @PageSize???? int = 10,?????????? -- 頁(yè)尺寸
??? @PageIndex??? int = 1,??????????? -- 頁(yè)碼
??? @OrderType??? bit = 0,??????????? -- 設(shè)置排序類型, 非 0 值則降序
??? @strWhere???? varchar(2000) = ''? -- 查詢條件 (注意: 不要加 where)
AS
declare @strSQL?? varchar(6000)?????? -- 主語(yǔ)句
declare @strTmp?? varchar(1000)?????? -- 臨時(shí)變量
declare @strOrder varchar(500)??????? -- 排序類型
if @OrderType != 0
begin
??? set @strTmp = '<(select min'
??? set @strOrder = ' order by [' + @fldName + '] desc'
end
else
begin
??? set @strTmp = '>(select max'
??? set @strOrder = ' order by [' + @fldName +'] asc'
end
set @strSQL = 'select top ' + str(@PageSize) + ' * from ['
??? + @tblName + '] where [' + @fldName + ']' + @strTmp + '(['
??? + @fldName + ']) from (select top ' + str((@PageIndex-1)*@PageSize) + ' ['
??? + @fldName + '] from [' + @tblName + ']' + @strOrder + ') as tblTmp)'
??? + @strOrder
if @strWhere != ''
??? set @strSQL = 'select top ' + str(@PageSize) + ' * from ['
??????? + @tblName + '] where [' + @fldName + ']' + @strTmp + '(['
??????? + @fldName + ']) from (select top ' + str((@PageIndex-1)*@PageSize) + ' ['
??????? + @fldName + '] from [' + @tblName + '] where ' + @strWhere + ' '
??????? + @strOrder + ') as tblTmp) and ' + @strWhere + ' ' + @strOrder
if @PageIndex = 1
begin
??? set @strTmp = ''
??? if @strWhere != ''
??????? set @strTmp = ' where (' + @strWhere + ')'
??? set @strSQL = 'select top ' + str(@PageSize) + ' * from ['
??????? + @tblName + ']' + @strTmp + ' ' + @strOrder
end
exec (@strSQL)
GO
2.寫出一條Sql語(yǔ)句: 取出表A中第31到第40記錄(SQLServer, 以自動(dòng)增長(zhǎng)的ID作為主鍵,? 注意:ID可能不是連續(xù)的。)
select top 10 * from A where id not in (select top 30 id from A)
解2: select top 10 * from A where id > (select max(id) from (select top 30 id from A )as A)
3.public class c{ public c(string a) : this() {;}; public c() {;} } 解釋第一個(gè)構(gòu)造函數(shù)中發(fā)生了什么?這個(gè)構(gòu)造函數(shù)有什么用?
(第一個(gè)構(gòu)造函數(shù)調(diào)用了第二個(gè)構(gòu)造函數(shù),這個(gè)構(gòu)造函數(shù)構(gòu)造了一個(gè)c對(duì)象的實(shí)例。)
4.一個(gè)長(zhǎng)度為10000的字符串,通過(guò)隨機(jī)從a-z中抽取10000個(gè)字符組成。請(qǐng)用c#語(yǔ)言編寫主要程序來(lái)實(shí)現(xiàn)。
答:
?????? using System.Text;
StringBuilder sb = new StringBuilder(0, 10000);
??????? string strABC = "a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u,v,w,x,y,z";
??????? string[] ABC = strABC.Split(',');
??????? int len = ABC.Length;
??????? Random rd = new Random();
??????? for (int i = 0; i < 10000; i++)
??????? {
??????????? sb.Append(ABC[rd.Next(len)]);
??????? }
5.產(chǎn)生一個(gè)int數(shù)組,長(zhǎng)度為100,并向其中隨機(jī)插入1-100,并且不能重復(fù)。
int[] intArr=new int[100];
ArrayList myList=new ArrayList();
Random rnd=new Random();
while(myList.Count<100)
{
int num=rnd.Next(1,101);
if(!myList.Contains(num))
myList.Add(num);
}
for(int i=0;i<100;i++)
intArr[i]=(int)myList[i];
2.如何把一個(gè)Array復(fù)制到ArrayList里
答:
foreach( object o in array )arrayList.Add(o);
8.用C#寫一段選擇排序算法,要求用自己的編程風(fēng)格。
答:private int min;
??? public void xuanZhe(int[] list)//選擇排序
??? {
??????? for (int i = 0; i < list.Length - 1; i++)
??????? {
??????????? min = i;
??????????? for (int j = i + 1; j < list.Length; j++)
??????????? {
??????????????? if (list[j] < list[min])
??????????????????? min = j;
??????????? }
??????????? int t = list[min];
??????????? list[min] = list[i];
??????????? list[i] = t;
??????? }
??? }
4.寫一個(gè)函數(shù)計(jì)算當(dāng)參數(shù)為N的值:1-2+3-4+5-6+7……+N
答:public int returnSum(int n)
??? {
??????? int sum = 0;
??????? for (int i = 1; i <= n; i++)
??????? {
??????????? int k = i;
??????????? if (i % 2 == 0)
??????????? {
??????????????? k = -k;
??????????? }
??????????? sum = sum + k;
??????? }
??????? return sum;
??? }
??? public int returnSum1(int n)
??? {
??????? int k = n;
??????? if (n == 0)
??????? {
??????????? return 0;
??????? }
??????? if (n % 2 == 0)
??????? {
??????????? k = -k;
??????? }
??????? return aaa(n - 1) + k;
??? }
7. 某一密碼僅使用K、L、M、N、O共5個(gè)字母,密碼中的單詞從左向右排列,密碼單詞必須遵循如下規(guī)則 :
(1) 密碼單詞的最小長(zhǎng)度是兩個(gè)字母,可以相同,也可以不同
(2) K不可能是單詞的第一個(gè)字母
(3) 如果L出現(xiàn),則出現(xiàn)次數(shù)不止一次
(4) M不能使最后一個(gè)也不能是倒數(shù)第二個(gè)字母
(5) K出現(xiàn),則N就一定出現(xiàn)
(6) O如果是最后一個(gè)字母,則L一定出現(xiàn)
問(wèn)題一:下列哪一個(gè)字母可以放在LO中的O后面,形成一個(gè)3個(gè)字母的密碼單詞?
A) K B)L C) M D) N
答案:B
問(wèn)題二:如果能得到的字母是K、L、M,那么能夠形成的兩個(gè)字母長(zhǎng)的密碼單詞的總數(shù)是多少?
A)1個(gè) B)3個(gè) C)6個(gè) D)9個(gè)
答案:A
問(wèn)題三:下列哪一個(gè)是單詞密碼?
A) KLLN B) LOML C) MLLO D)NMKO
答案:C
62-63=1 等式不成立,請(qǐng)移動(dòng)一個(gè)數(shù)字(不可以移動(dòng)減號(hào)和等于號(hào)),使得等式成立,如何移動(dòng)?
答案:62移動(dòng)成2的6次方
17、列出常用的使用javascript操作xml的類包
答:
XML.prototype.xmlDoc = new ActiveXObject("Microsoft.XMLDOM");
XML.prototype.InitXML=InitXML;
XML.prototype.getFirstChild=getFirstChild;
XML.prototype.getLastChild=getLastChild;
XML.prototype.getChild=getChild;????? // 取得節(jié)點(diǎn)值
XML.prototype.getNodeslength=getNodeslength;?? // 最得節(jié)點(diǎn)下的子節(jié)點(diǎn)的個(gè)數(shù)
XML.prototype.getNode=getNode;?????? // 取得指定節(jié)點(diǎn)
XML.prototype.delNode=delNode;?????? // 刪除指定節(jié)點(diǎn),如果節(jié)點(diǎn)相同,則刪除最前面的節(jié)點(diǎn).
XML.prototype.getNodeAttrib=getNodeAttrib;??? // 取得節(jié)點(diǎn)的指定屬性值.
XML.prototype.InsertBeforeChild=InsertBeforeChild;? // 在指定節(jié)點(diǎn)之前插入一個(gè)節(jié)點(diǎn).
XML.prototype.InsertChild=InsertChild;???? // 在指定節(jié)點(diǎn)下插入節(jié)點(diǎn).
XML.prototype.setAttrib=setAttrib;????? //? 設(shè)置指定屬性的值.
XML.prototype.setNodeValue=setNodeValue;??? //? 設(shè)置指定節(jié)點(diǎn)的值.
XML.prototype.CreateNodeS=CreateNodeS;???? //? 創(chuàng)建一個(gè)指定名的節(jié)點(diǎn).
XML.prototype.addAttrib=addAttrib;????? //? 為指定節(jié)點(diǎn)添加指定屬性,并設(shè)置初值.
XML.prototype.FindString=FindString;???? // 在指定節(jié)點(diǎn)下查找字符串.
給定以下XML文件,完成算法流程圖<FileSystem>
< DriverC >
<Dir DirName=”MSDOS622”>
<File FileName =” Command.com” ></File>
</Dir>
<File FileName =”MSDOS.SYS” ></File>
<File FileName =” IO.SYS” ></File>
</DriverC>
</FileSystem>
請(qǐng)畫(huà)出遍歷所有文件名(FileName)的流程圖(請(qǐng)使用遞歸算法)。
答:
void FindFile( Directory d )
{
FileOrFolders = d.GetFileOrFolders();
foreach( FileOrFolder fof in FileOrFolders )
{
if( fof is File )
You Found a file;
else if ( fof is Directory )
FindFile( fof );
}
}
6.C#代碼實(shí)現(xiàn),確保windows程序只有一個(gè)實(shí)例(instance)
??????? ///<summary>
??????? ///應(yīng)用程序的主入口點(diǎn)。
??????? ///</summary>
??????? [STAThread]
??????? staticvoid Main()
??????? {
??????????? //防止程序多次運(yùn)行
??????????? if(!OneInstance.IsFirst("GetPayInfo"))
??????????? {
??????????????? MessageBox.Show ("警告:程序正在運(yùn)行中! 請(qǐng)不要重復(fù)打開(kāi)程序!可在右下角系統(tǒng)欄找到!","程序錯(cuò)誤提
示:",MessageBoxButtons.OK,MessageBoxIcon.Stop);
??????????????? return;
??????????? }
??????????? Application.Run(new Form1());
??????? }
??????? // ******************* 防止程序多次執(zhí)行 **************************
??????? publicabstractclass OneInstance
??????? {
??????????? ///<summary>
??????????? ///判斷程序是否正在運(yùn)行
??????????? ///</summary>
??????????? ///<param name="appId">程序名稱</param>
??????????? ///<returns>如果程序是第一次運(yùn)行返回True,否則返回False</returns>
??????????? publicstaticbool IsFirst(string appId)
??????????? {
??????????????? bool ret=false;
??????????????? if(OpenMutex(0x1F0001,0,appId)==IntPtr.Zero)
??????????????? {
??????????????????? CreateMutex(IntPtr.Zero,0,appId);
??????????????????? ret=true;
??????????????? }
??????????????? return ret;
??????????? }?
??????????? [DllImport("Kernel32.dll",CharSet=CharSet.Auto)]
??????????? privatestaticextern IntPtr OpenMutex(
??????????????? uint dwDesiredAccess, // access
??????????????? int bInheritHandle,??? // inheritance option
??????????????? string lpName????????? // object name
??????????????? );
??????????? [DllImport("Kernel32.dll",CharSet=CharSet.Auto)]
??????????? privatestaticextern IntPtr CreateMutex(
??????????????? IntPtr lpMutexAttributes, // SD
??????????????? int bInitialOwner,?????????????????????? // initial owner
??????????????? string lpName??????????????????????????? // object name
??????????????? );
??????? }?
轉(zhuǎn)載于:https://www.cnblogs.com/TwilightSnow/p/4194612.html
總結(jié)
以上是生活随笔為你收集整理的.NET面试经典问答的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: HTML5 Boilerplate -
- 下一篇: 360借条晚上放款要多久 时间不会那么久