.NET面試寶典
第1階段:HTML&c#基礎
1、簡述 private、 protected、 public、 internal 修飾符的訪問權限。
private : 私有成員, 在類的內部纔可以訪問。
protected : 保護成員,該類內部和繼承類中可以訪問。
public : 公共成員,完全公開,沒有訪問限制。
internal: 當前程序集內可以訪問。
2、ADO.NET中的五個主要對象
Connection:主要是開啓程序和數據庫之間的連接。沒有利用連接對象將數據庫打開,是無法從數據庫中取得數據的。Close和Dispose的區別,Close以後還可以Open,Dispose以後則不能再用。
Command:主要可以用來對數據庫發出一些指令,例如可以對數據庫下達查詢、新增、修改、刪除數據等指令,以及調用存在數據庫中的存儲過程等。這個對象是架構在Connection 對象上,也就是Command 對象是透過連接到數據源。
DataAdapter:主要是在數據源以及DataSet 之間執行數據傳輸的工作,它可以透過Command 對象下達命令後,並將取得的數據放入DataSet 對象中。這個對象是架構在Command對象上,並提供了許多配合DataSet 使用的功能。
DataSet:這個對象可以視爲一個暫存區(Cache),可以把從數據庫中所查詢到的數據保留起來,甚至可以將整個數據庫顯示出來,DataSet是放在內存中的。DataSet 的能力不只是可以儲存多個Table 而已,還可以透過DataAdapter對象取得一些例如主鍵等的數據表結構,並可以記錄數據表間的關聯。DataSet 對象可以說是ADO.NET 中重量級的對象,這個對象架構在DataAdapter對象上,本身不具備和數據源溝通的能力;也就是說我們是將DataAdapter對象當做DataSet 對象以及數據源間傳輸數據的橋樑。DataSet包含若干DataTable、DataTableTable包含若干DataRow。
DataReader:當我們只需要循序的讀取數據而不需要其它操作時,可以使用DataReader 對象。DataReader對象只是一次一筆向下循序的讀取數據源中的數據,這些數據是存在數據庫服務器中的,而不是一次性加載到程序的內存中的,只能(通過遊標)讀取當前行的數據,而且這些數據是隻讀的,並不允許作其它的操作。因爲DataReader 在讀取數據的時候限制了每次只讀取一筆,而且只能只讀,所以使用起來不但節省資源而且效率很好。使用DataReader 對象除了效率較好之外,因爲不用把數據全部傳回,故可以降低網絡的負載。
ADO.NET 使用Connection 對象來連接數據庫,使用Command 或DataAdapter對象來執行SQL語句,並將執行的結果返回給DataReader 或 DataAdapter ,然後再使用取得的DataReader 或DataAdapter 對象操作數據結果。
3、列舉ASP.NET 頁面之間傳遞值的幾種方式。
1.使用QueryString, 如....?id=1; response. Redirect()....
2.使用Session變量
3.使用Server.Transfer
4.Cookie傳值
4、面向對象的三個特性?
繼承性:就是讓一個類型的對象擁有另一個類型的對象的屬性的方法。繼承後,子類擁有父類的屬性和方法。
封裝性:就是將數據和代碼捆綁在一起,防止外界干擾。
多態性:就是一個事物擁有不同形式的能力。
5、C#中的委託是什麼?事件是不是一種委託?事件和委託的關係。
委託可以把一個方法作爲參數代入另一個方法。
委託可以理解爲指向一個函數的指針。
委託和事件沒有可比性,因爲委託是類型,事件是對象,下面說的是委託的對象(用委託方式實現的事件)和(標準的event方式實現)事件的區別。事件的內部是用委託實現的。因爲對於事件來講,外部只能“註冊自己+=、註銷自己-=”,外界不可以註銷其他的註冊者,外界不可以主動觸發事件,因此如果用Delegate就沒法進行上面的控制,因此誕生了事件這種語法。事件是用來閹割委託實例的,類比用一個自定義類閹割List。事件只能add、remove自己,不能賦值。事件只能+=、-=,不能= 。加分的補充回答:事件內部就是一個private的委託和add、remove兩個方法。
6、override與重載的區別
重載是方法的名稱相同,參數或參數類型不同,進行多次重載以適應不同的需要。
Override是進行基類中函數的重寫,爲了適應需要。
7、屬性和public字段的區別是什麼?調用set方法爲一個屬性設值,然後用get方法讀取出來的值一定是set進去的值嗎?
屬性可以對設值、取值的過程進行非法值控制,比如年齡禁止設值負數,而字段則不能進行這樣的設置。雖然一般情況下get讀取的值就是set設置的值,但是可以讓get讀取的值不是set設置的值的,極端的例子:Public Age{get{return 100;}set{}}。
8、三層架構
通常意義上的三層架構就是將整個業務應用劃分爲:表現層(UI)、業務邏輯層(BLL)、數據訪問層(DAL)。
區分層次的目的即爲了“高內聚,低耦合”的思想。
表現層(UI):通俗講就是展現給用戶的界面,即用戶在使用一個系統的時候的所見所得。
業務邏輯層(BLL):針對具體問題的操作,也可以說是對數據層的操作,對數據業務邏輯處理。
數據訪問層(DAL):該層所做事務直接操作數據庫,針對數據的增添、刪除、修改、更新、查找等每層之間是一種垂直的關係。
三層結構是N層結構的一種,一般來說,層次之間是向下依賴的,下層代碼未確定其接口(契約)前,上層代碼是無法開發的,下層代碼接口(契約)的變化將使上層的代碼一起變化。
優點: 分工明確,條理清晰,易於調試,而且具有可擴展性。
缺點: 增加成本。
9、什麼是裝箱(boxing)和拆箱(unboxing)?
裝箱:從值類型接口轉換到引用類型。
拆箱:從引用類型轉換到值類型。
object obj = null;//引用類型
obj = 1;//裝箱,boxing。把值類型包裝爲引用類型。
int i1 = (int)obj;//拆箱。Unboxing
10、CTS、CLS、CLR分別作何解釋?
CTS:Common Type System 通用類型系統。Int32、Int16→int、String→string、Boolean→bool。每種語言都定義了自己的類型,.Net通過CTS提供了公共的類型,然後翻譯生成對應的.Net類型。
CLS:Common Language Specification 通用語言規範。不同語言語法的不同。每種語言都有自己的語法,.Net通過CLS提供了公共的語法,然後不同語言翻譯生成對應的.Net語法。
CLR:Common Language Runtime 公共語言運行時,就是GC、JIT等這些。有不同的CLR,比如服務器CLR、Linux CLR(Mono)、Silverlight CLR(CoreCLR)。相當於一個發動機,負責執行IL。
第2階段:WEB前端基礎
1、JavaScript中的“=、==、===”區別?
=:即賦值運算;
==:判斷兩個變量是否相同,僅限於值,如果值相同而類型不同,那麼JavaScript引擎會在內部做類型轉換;
===:判斷兩個變量是否相同,無論是值還是類型,如果類型不同而值相同,也會返回false,而引擎不會在內部進行轉換。
2、JavaScript中的“undefined、null”區別?
通俗地講,undefined出現的原因是JavaScript引擎不知道這是個什麼東西,而對於null,JavaScript引擎識別了它,但是沒有被分配內存空間。
undefined的類型就是undefined,而null的類型是object。
3、簡述javascript的作用域和閉包?
js變量的作用域是指:函數內定義的局部變量只在此函數內有效,而全局變量可以全局有效。
閉包的作用就在於能夠改變局部變量的作用域,將值保存下來,但是如果使用不當會造成無法回收變量,引起性能問題,甚至崩潰。
4、對web標準以及w3c的理解和認識?
標籤閉合,標籤小寫,不亂嵌套,提高搜索機器人搜索機率。使用外鏈css和js腳本,結構行爲表現分離,內容能被更多廣泛的設備所訪問,更少的代碼和組件,容易維護,改版方便,不需要變動頁面內容。
5、Html和xhtml有什麼區別?
html是一種基本的web網頁設計語言,xhtml是一個基於XML的置標語言。
最主要的不同:
XHTML元素必須正確的被嵌套,元素必須關閉,標籤必須小寫,必須有根元素。
第3階段:ASP.NET基礎
1、請解釋ASP。NET中的web頁面與其隱藏類之間的關係?
一個ASP.NET頁面一般都對應一個隱藏類,一般都在ASP.NET頁面的聲明中指定了隱藏類例如一個頁面Tst1.aspx的頁面聲明如下:
<%@ Page language="c#" Codebehind="Tst1.aspx.cs" AutoEventWireup="false" Inherits="T1.Tst1" %>
Codebehind="Tst1.aspx.cs" 表明經編譯此頁面時使用哪一個代碼文件。
Inherits="T1.Tst1" 表用運行時使用哪一個隱藏類。
aspx頁面會編譯生成一個類,這個類從隱藏類繼承。
2、在什麼情況下會用到虛方法?它與接口有什麼不同?
子類重新定義父類的某一個方法時,必須把父類的方法定義爲virtual
在定義接口中不能有方法體,虛方法可以。
實現時,子類可以不重新定義虛方法,但如果一個類繼承接口,那必須實現這個接口。
3、DataReader和DataSet的異同?
DataReader使用時始終佔用SqlConnection,在線操作數據庫
每次只在內存中加載一條數據,所以佔用的內存是很小的是隻進的、只讀的
DataSet則是將數據一次性加載在內存中,拋棄數據庫連接,讀取完畢即放棄數據庫連接(非連接模式)
DataSet將數據全部加載在內存中.所以比較消耗內存,但是確比DataReader要靈活,可以動態的添加行、列、數據,對數據庫進行回傳更新操作(動態操作讀入到內存的數據)。
4、Server.Transfer和Response.Redirect的區別是什麼?
Server.Transfer僅是服務器中控制權的轉向,在客戶端瀏覽器地址欄中不會顯示出轉向後的地址;Response.Redirect則是完全的跳轉,瀏覽器將會得到跳轉的地址,並重新發送請求鏈接。這樣,從瀏覽器的地址欄中可以看到跳轉後的鏈接地址。
Server.Transfer是服務器請求資源,服務器直接訪問目標地址的URL,把那個URL的響應內容讀取過來,然後把這些內容再發給瀏覽器,瀏覽器根本不知道服務器發送的內容是從哪兒來的,所以它的地址欄中還是原來的地址。 這個過程中瀏覽器和Web服務器之間經過了一次交互。
Response.Redirect就是服務端根據邏輯,發送一個狀態碼,告訴瀏覽器重新去請求那個地址,一般來說瀏覽器會用剛纔請求的所有參數重新請求。這個過程中瀏覽器和Web服務器之間經過了兩次交互。
5、什麼是sql注入?如何避免sql注入?
用戶根據系統的程序構造非法的參數從而導致程序執行不是程序員期望的惡意SQL語句。使用參數化的SQL就可以避免SQL注入。
6、數據庫三範式是什麼?
第一範式:字段不能有冗餘信息,所有字段都是必不可少的。
第二範式:滿足第一範式並且表必須有主鍵。
第三範式:滿足第二範式並且表引用其他的表必須通過主鍵引用。
7、post、get的區別?
get的參數會顯示在瀏覽器地址欄中,而post的參數不會顯示在瀏覽器地址欄中;
使用post提交的頁面在點擊【刷新】按鈕的時候瀏覽器一般會提示“是否重新提交”,而get則不會;
用get的頁面可以被搜索引擎抓取,而用post的則不可以;
用post可以提交的數據量非常大,而用get可以提交的數據量則非常小(2k),受限於網頁地址的長度。
用post可以進行文件的提交,而用get則不可以。
8、Session,ViewState,Application,cookie的區別?
Session:用於保持狀態的基於 Web 服務器的方法。Session 允許通過將對象存儲在Web 服務器的內存中在整個用戶會話過程中保持任何對象。主要用於保持代碼隱藏類中對象的狀態。爲每個用戶創建的,用於存儲單個用戶,因爲他是相對每個用戶的.所以可能來取得在線人數等。
ViewState:主要用於保持 Web 頁上控件的狀態。當 Web 頁上的控件被綁定到代碼隱藏類中的對象。
Application 用於存儲所有用戶都可視的信息.所以它存儲的是要讓所有用戶共享的一些信息.如總訪問數等Cache,頁面緩存。
Cookie:通常我們都把它放在客戶端,也可以存儲在服務器端。主要用它存儲用戶的個性設制,和登錄信息。
9、寫出一條Sql語句:取出表A中第31到第40記錄(SQLServer,以自動增長的ID作爲主鍵,注意:ID可能不是連續的。
解1: select top 10 * from A where id not in (select top 30 id from A)
演變步驟:
1)select top 30 id from T_FilterWords--取前條
2)select * from T_FilterWords
where id not in (select top 30 id from T_FilterWords)--取id不等於前三十條的
--也就是把前條排除在外
3)select top 10 * from T_FilterWords
where id not in (select top 30 id from T_FilterWords)
--取把前條排除在外的前條,也就是-40條
解2: select top 10 * from A where id > (select max(id) from (select top 30 id from A )as A)
解答3:用ROW_NUMBER實現
10、橫表、縱錶轉換
縱表結構 TableA
Name | Course | Grade |
張三 | 語文 | 75 |
張三 | 數學 | 80 |
張三 | 英語 | 90 |
李四 | 語文 | 95 |
李四 | 數學 | 55 |
橫表結構 TableB
Name | 語文 | 數學 | 英語 |
張三 | 75 | 80 | 90 |
李四 | 95 | 55 | 0 |
先理解:
select Name,
(case Course when ‘語文‘ then Grade else 0 end) as 語文,
(case Course when ‘數學‘ then Grade else 0 end) as 數學,
(case Course when ‘英語‘ then Grade else 0 end) as 英語
from TableA
然後理解標準答案:
select Name,
sum(case Course when ‘語文‘ then Grade else 0 end) as 語文,
sum(case Course when ‘數學‘ then Grade else 0 end) as 數學,
sum(case Course when ‘英語‘ then Grade else 0 end) as 英語
from TableA
group by Name
橫錶轉縱表的"SQL"示例
橫表結構: TEST_H2Z
ID 姓名 語文 數學 英語
1 張三 80 90 70
2 李四 90 85 95
3 王五 88 75 90
轉換後的表結構:
ID 姓名 科目 成績
1 張三 語文 80
2 張三 數學 90
3 張三 英語 70
4 李四 語文 90
5 李四 數學 80
6 李四 英語 99
7 王五 語文 85
8 王五 數學 96
9 王五 英語 88
橫錶轉縱表SQL示例:
SELECT 姓名,'語文' AS 科目,語文 AS 成績 FROM TEST_H2Z UNION ALL
SELECT 姓名,'數學' AS 科目,數學 AS 成績 FROM TEST_H2Z UNION ALL
SELECT 姓名,'英語' AS 科目,英語 AS 成績 FROM TEST_H2Z
ORDER BY 姓名,科目 DESC;
第4階段:ASP.NET高級
1、Application 、Cookie和 Session 三種會話有什麼不同?
Application是用來存取整個網站全局的信息,而Session是用來存取與具體某個訪問者關聯的信息。Cookie是保存在客戶端的,機密信息不能保存在Cookie中,只能放小數據;Session是保存在服務器端的,比較安全,可以放大數據。
2、Session有什麼重大BUG,微軟提出了什麼方法加以解決?
IIS中由於有進程回收機制,系統繁忙的話Session會丟失,IIS重啓也會造成Session失。這樣用戶就要重新登錄或者重新添加購物車、驗證碼等放到Session中的信息。可以用State Server或SQL Server數據庫的方式存儲Session不過這種方式比較慢,而且無法捕獲Session的END事件。但是這不是Bug,只能說是In-Proc方式存儲Session的缺陷,缺陷是和Bug不一樣的,In-Proc方式存儲Session會由服務器來決定什麼時候釋Session,In-Proc方式不滿足要求的話完全可以用StateServer和數據庫的方式。
StateServer還可以解決集羣Session共享的問題。
3、Asp.net中的錯誤機制?
1)定製錯誤頁來將顯示一個友好的報錯頁面。
2)頁面中未捕獲一樣會觸發Page_Error,應用程序中的未捕獲異常會觸發Application_Error。通過HttpContext.Current.Server.GetLastError()拿到未捕捉異常,記錄到Log4Net日誌中。
4、介紹幾個使用過的開源的項目?
Lucene.net、NPOI、JQuery、ASP.Net AJAX toolkit、Quartz.Net、JqueryUI、ASP.Net MVC。在CodePlex、SourceForge等網站上有更多的開源項目。
5、如何提高頁面的顯示速度?假如一個頁面的加載時間是10.89s,你會用什麼樣的方式進行優化?
首先要找出問題所在,是服務器端運行的速度慢還是服務器端到客戶端的下載慢還是頁面在瀏覽器的加載速度慢。
如果是服務器端運行速度慢,則找是數據庫的原因還是算法的問題,如果是數據庫的問題則嘗試添加索引、優化SQL語句,如果是算法的問題,則優化算法。如果對於一些不經常改動的頁面可以使用靜態頁技術!對於一些數據不需要及時更新的而且取數據的過程非常耗時可以使用緩存。頁面中的內容可以按需加載(比如說可以像verycd網站的評論那樣當用戶需要看的時候再加載其內容),可以在圖片需要顯示的時候再進行加載。
如果是服務器端到客戶端的下載慢則看是頁面體積過於臃腫還是網絡問題,如果是頁面體積過於臃腫,則優化HTML代碼,去掉無用的標籤,壓縮JS、CSS,可以用CSS Spirit技術將多個圖片放到一個圖片中,減少向服務器的請求。如果是網絡問題,則嘗試在不同的網絡、地區部署服務器,然後使用CDN技術加速訪問。
如果是頁面中的JavaScript運行復雜導致運行速度慢,則優化JavaScript。
webkaka:測網速。
第5階段:ASP.NET企業級技術
1、談談你對MVC和三層架構的理解?
MVC即模型、視圖、控制器,模型表示業務數據及業務處理,用來封裝數據及行爲;視圖是用戶看到並與之交互的界面;控制器接受用戶輸入並調用模型和視圖去完成用戶的請求。使用MVC有利於關注點分離,自動化UI測試成爲了可能。
三層架構即表現層(UI)、業務邏輯層(BLL)、數據訪問層(DAL)。區分層次的目的即爲了“高內聚,低耦合”的思想。表現層通俗講就是展現給用戶的界面,業務邏輯層即針對具體問題的操作,也可以說是對數據層的操作,對數據業務邏輯處理。數據訪問層:該層所做事務直接操作數據庫,針對數據的增添、刪除、修改、更新、查找等。
2、在MVC中如何保持Sessions?
可使用tempdata、viewdata、viewbag三種方式。其中tempdata:在不同的控制器或動作間轉換時保持數據。另外,進行頁面轉向時,tempdata可以保持數據,它是一個內部的Session變量。Viewdata:可以在控制器和視圖間保持數據。Viewbag:它是視圖數據的動態包裝,使用viewbag不需要類型轉換,它使用的是內部動態關鍵詞。
3、MVC中如何做輸入驗證?
在M層使用數據模型的屬性標籤形如[Required],在C層使用ModelState.IsValid屬性檢查數據是否正確,也可在C層使用JavaScript進行數據驗證。
4、已經有了ASPX,爲什麼還要Razor?哪個更好?
Razor是一個輕量級的視圖引擎,MVC3引入,相比ASPX,Razor更乾淨、輕量級、語法更簡單,只需要使用@關鍵字,如@DataTime.Now
5、MVC有多少種不同類型的結果類型,請詳細描述?
有12種,最主要的是ActionResult類,它是一個基礎類,它有11個子類型。
ViewResult - 給響應流渲染指定的視圖
PartialViewResult - 給響應流渲染指定的局部視圖
EmptyResult - 返回空的響應結果。
RedirectResult - 執行一個HTTP轉向到指定的URL。
RedirectToRouteResult -執行一個HTTP轉向到一個URL,這個URL由基於路由數據的路由引擎來決定
JsonResult - 序列化一個ViewData對像到JSON格式。
JavaScriptResult - 返回一段javascript代碼,它可以在客戶端執行。
ContentResult - 寫內容到響應流,不需要視圖支持。
FileContentResult - 返回一個文件到客戶端。
FileStreamResult - 返回一個文件到客戶端,它提供的是流。
FilePathResult - 返回一個文件到客戶端。