.net經典面試題

一、簡述 private、 protected、 public、 internal 修飾符的訪問權限。html

private : 私有成員, 在類的內部才能夠訪問。protected : 保護成員,該類內部和繼承類中能夠訪問。jquery

public : 公共成員,徹底公開,沒有訪問限制。 internal: 當前程序集內能夠訪問。程序員

二、ADO.NET中的五個主要對象web

Connection:主要是開啓程序和數據庫之間的鏈接。沒有利用鏈接對象將數據庫打開,是沒法從數據庫中取得數據的。Close和Dispose的區別,Close之後還能夠Open,Dispose之後則不能再用。面試

Command:主要能夠用來對數據庫發出一些指令,例如能夠對數據庫下達查詢、新增、修改、刪除數據等指令,以及調用存在數據庫中的存儲過程等。這個對象是架構在Connection 對象上,也就是Command 對象是透過鏈接到數據源。ajax

DataAdapter:主要是在數據源以及DataSet 之間執行數據傳輸的工做,它能夠透過Command 對象下達命令後,並將取得的數據放入DataSet 對象中。這個對象是架構在Command對象上,並提供了許多配合DataSet 使用的功能。算法

DataSet:這個對象能夠視爲一個暫存區(Cache),能夠把從數據庫中所查詢到的數據保留起來,甚至能夠將整個數據庫顯示出來,DataSet是放在內存中的。DataSet 的能力不僅是能夠儲存多個Table 而已,還能夠透過DataAdapter對象取得一些例如主鍵等的數據表結構,並能夠記錄數據表間的關聯。DataSet 對象能夠說是ADO.NET 中重量級的對象,這個對象架構在DataAdapter對象上,自己不具有和數據源溝通的能力;也就是說咱們是將DataAdapter對象當作DataSet 對象以及數據源間傳輸數據的橋樑。DataSet包含若干DataTable、DataTableTable包含若干DataRow。sql

DataReader:當咱們只須要循序的讀取數據而不須要其它操做時,可使用DataReader 對象。DataReader對象只是一次一筆向下循序的讀取數據源中的數據,這些數據是存在數據庫服務器中的,而不是一次性加載到程序的內存中的,只能(經過遊標)讀取當前行的數據,並且這些數據是隻讀的,並不容許做其它的操做。由於DataReader 在讀取數據的時候限制了每次只讀取一筆,並且只能只讀,因此使用起來不但節省資源並且效率很好。使用DataReader 對象除了效率較好以外,由於不用把數據所有傳回,故能夠下降網絡的負載。數據庫

ADO.NET 使用Connection 對象來鏈接數據庫,使用Command 或DataAdapter對象來執行SQL語句,並將執行的結果返回給DataReader 或 DataAdapter ,而後再使用取得的DataReader 或DataAdapter 對象操做數據結果。編程

三、列舉ASP.NET 頁面之間傳遞值的幾種方式。

1.使用QueryString, 如....?id=1; response. Redirect().... 2.使用Session變量 3.使用Server.Transfer4.Cookie傳值

四、C#中的委託是什麼?事件是否是一種委託?事件和委託的關係。

委託能夠把一個方法做爲參數代入另外一個方法。委託能夠理解爲指向一個函數的指針。

委託和事件沒有可比性,由於委託是類型,事件是對象,下面說的是委託的對象(用委託方式實現的事件)和(標準的event方式實現)事件的區別。事件的內部是用委託實現的。由於對於事件來說,外部只能「註冊本身+=、註銷本身-=」,外界不能夠註銷其餘的註冊者,外界不能夠主動觸發事件,所以若是用Delegate就無法進行上面的控制,所以誕生了事件這種語法。事件是用來閹割委託實例的,類比用一個自定義類閹割List。事件只能add、remove本身,不能賦值。事件只能+=、-=,不能= 。加分的補充回答:事件內部就是一個private的委託和add、remove兩個方法

 

面試聊:用Reflector查看.Net的類的內部實現,解決問題。

五、override與重載(overload)的區別

重載是方法的名稱相同。參數或參數類型不一樣,進行屢次重載以適應不一樣的須要。重載(overload)是面向過程的概念。

Override 是進行基類中函數的重寫。Override是面向對象的概念

六、C#中索引器是否只能根據數字進行索引?是否容許多個索引器參數?

參數的個數和類型都是任意的。加分的補充回答:用reflector反編譯能夠看出,索引器的內部本質上就是set_item、get_item方法。

索引的語法:public string this[string s],經過get、set塊來定義取值、賦值的邏輯

索引能夠有多個參數、參數類型任意

索引能夠重載。

若是隻有get沒有set就是隻讀的索引。索引其實就是set_Item、get_Item兩個方法。

七、屬性和public字段的區別是什麼?調用set方法爲一個屬性設值,而後用get方法讀取出來的值必定是set進去的值嗎?

屬性能夠對設值、取值的過程進行非法值控制,好比年齡禁止設值負數,而字段則不能進行這樣的設置。雖然通常狀況下get讀取的值就是set設置的值,可是可讓get讀取的值不是set設置的值的,極端的例子。Public Age{get{return 100;}set{}}。加分的補充回答:用reflector反編譯能夠看出,屬性內部本質上就是set_***、get_***方法    class Person

{        public int Age

{            get            {                return 3;            }            set            {            }

}    }

Person p1 = new Person();            p1.Age = 30;            p1.Age++;            Console.Write(p1.Age);//輸出3

必須手寫掌握的代碼(既包含拿電腦寫,拿筆寫):

一、 手寫三層架構

二、 手寫冒泡排序

三、 手寫AJAX:XMLHttpRequest

四、 手寫增刪改查、SQLHelper

八、三層架構

一般意義上的三層架構就是將整個業務應用劃分爲:表現層(UI)、業務邏輯層(BLL)、數據訪問層(DAL)。區分層次的目的即爲了「高內聚,低耦合」的思想。表現層(UI):通俗講就是展示給用戶的界面,即用戶在使用一個系統的時候的所見所得。業務邏輯層(BLL):針對具體問題的操做,也能夠說是對數據層的操做,對數據業務邏輯處理。數據訪問層(DAL):該層所作事務直接操做數據庫,針對數據的增添、刪除、修改、更新、查找等每層之間是一種垂直的關係。三層結構是N層結構的一種,通常來講,層次之間是向下依賴的,下層代碼未肯定其接口(契約)前,上層代碼是沒法開發的,下層代碼接口(契約)的變化將使上層的代碼一塊兒變化。

優勢: 分工明確,條理清晰,易於調試,並且具備可擴展性。

缺點: 增長成本。

九、什麼是裝箱(boxing)和拆箱(unboxing)? (*)

Object是引用類型,可是它的子類Int32居然不能去Object能去的「要求必須是引用類型」的地方,違反了繼承的原則,因此須要把Int32裝在Object中才能傳遞。

裝箱:從值類型接口轉換到引用類型。

拆箱:從引用類型轉換到值類型。

object obj = null;//引用類型

obj = 1;//裝箱,boxing。把值類型包裝爲引用類型。

int i1 = (int)obj;//拆箱。unboxing

2)下面三句代碼有沒有錯,以inboxing或者unboxing爲例,解釋一下內存是怎麼變化的

int i=10; object obj = i;int j = obj;

分析:在inboxing(裝箱)時是不須要顯式的類型轉換的,不過unboxing(拆箱)須要顯式的類型轉換,因此第三行代碼應該改成:

3 int j = (int)obj;

要掌握裝箱與拆箱,就必須瞭解CTS及它的特色:NET重要技術和基礎之一的CTS(Common Type System)。CTS是爲了實如今應用程序聲明和使用這些類型時必須遵循的規則而存在的通用類型系統。.Net將整個系統的類型分紅兩大類 :值類型和引用類型。

CTS中的全部東西都是對象;全部的對象都源自一個基類——System.Object類型。值類型的一個最大的特色是它們不能爲null,值類型的變量總有一個值。爲了解決值類型不能夠爲null,引用類型能夠爲null的問題,微軟在.Net中引入了裝箱和拆箱:裝箱就是將值類型用引用類型包裝起來轉換爲引用類型;而從引用類型中拿到被包裝的值類型數據進行拆箱。

十、CTS、CLS、CLR分別做何解釋(*)把英文全稱背過來。

C#和.Net的關係。

C#只是抽象的語言,能夠把C#編譯生成Java平臺的二進制代碼,也能夠把Java代碼編譯生成.Net平臺的二進制代碼。因此C#只是提供了if、while、+-*/、定義類、int、string等基礎的語法,而Convert.ToInt3二、FileStream、SqlConnection、String.Split等都屬於.Net的東西。深藍色是C#的,淺藍色是.Net的。

C# new→IL:newobj

C# string →.Net中的String

類型的差異:.net中的Int32在C#中是int,在VB.Net中是Integer。String、Int32等公共類型。

語法的差異:IL中建立一個對象的方法是L_0001: newobj instance void 索引.C1::.ctor()

C#中是new C1();VB.net中是 Dim c1 As New C1

CTS:Common Type System 通用類型系統。Int3二、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。

十一、在dotnet中類(class)與結構(struct)的異同?

Class能夠被實例化,屬於引用類型,是分配在內存的堆上的。類是引用傳遞的。

Struct屬於值類型,是分配在內存的棧上的。結構體是複製傳遞的。加分的回答:Int3二、Boolean等都屬於結構體

十二、堆和棧的區別?

棧是編譯期間就分配好的內存空間,所以你的代碼中必須就棧的大小有明確的定義;局部值類型變量、值類型參數等都在棧內存中。

堆是程序運行期間動態分配的內存空間,你能夠根據程序的運行狀況肯定要分配的堆內存的大小。

1三、能用foreach遍歷訪問的對象的要求

須要實現IEnumerable接口或聲明GetEnumerator方法的類型。

1四、GC是什麼? 爲何要有GC?

C/C++中由程序員進行對象的回收像學校食堂中由學生收盤子,.Net中由GC進行垃圾回收像餐館中店員去回收。

GC是垃圾收集器(Garbage Collection)。程序員不用擔憂內存管理,由於垃圾收集器會自動進行管理。GC只能處理託管內存資源的釋放,對於非託管資源則不能使用GC進行回收,必須由程序員手工回收,一個例子就是FileStream或者SqlConnection須要程序員調用Dispose進行資源的回收。

要請求垃圾收集,能夠調用下面的方法:GC.Collect()通常不須要手動調用GC.Collect()。當一個對象沒有任何變量指向(再也不能使用)的時候就能夠被回收了。

基礎知識:當沒有任何變量指向一個對象的時候對象就能夠被回收掉了,但不必定會當即被回收。

object obj = new object();//只有new纔會有新對象

Console.WriteLine(obj);

object obj2 = obj;

obj = null;

obj2 = null;

Console.WriteLine();

1五、值類型和引用類型的區別?

1.將一個值類型變量賦給另外一個值類型變量時,將複製包含的值。引用類型變量的賦值只複製對對象的引用,而不復制對象自己。

2.值類型不可能派生出新的類型:全部的值類型均隱式派生自 System.ValueType。但與引用類型相同的是,結構也能夠實現接口。

3.值類型不可能包含 null 值:然而,可空類型功能容許將 null 賦給值類型。

4.每種值類型均有一個隱式的默認構造函數來初始化該類型的默認值。

1六、C#中的接口和類有什麼異同。

不一樣點:

不能直接實例化接口。

接口不包含方法的實現。

接口能夠多繼承,類只能單繼承。

類定義可在不一樣的源文件之間進行拆分。

相同點:

接口、類和結構均可以從多個接口繼承。

接口相似於抽象基類:繼承接口的任何非抽象類型都必須實現接口的全部成員。

接口和類均可以包含事件、索引器、方法和屬性。

基礎知識:接口只能定義方法(只能定義行爲,不能定義實現也就是字段),由於事件、索引器、屬性本質上都是方法,因此接口中也能夠定義事件、索引器、屬性。

1七、abstract class和interface有什麼區別?

相同點:

都不能被直接實例化,均可以經過繼承實現其抽象方法。

不一樣點:

接口支持多繼承;抽象類不能實現多繼承。

接口只能定義行爲;抽象類既能夠定義行爲,還可能提供實現。

接口只包含方法(Method)、屬性(Property)、索引器(Index)、事件(Event)的簽名,但不能定義字段和包含實現的方法;

抽象類能夠定義字段、屬性、包含有實現的方法。

接口能夠做用於值類型(Struct)和引用類型(Class);抽象類只能做用於引用類型。例如,Struct就能夠繼承接口,而不能繼承類。

加分的補充回答:講設計模式的時候SettingsProvider的例子。

1八、是否能夠繼承String類?

String類是sealed類故不能夠繼承。

1九、int、DateTime、string是否能夠爲null?

null表示「不知道」,而不是「沒有」。沒有年齡和不知道年齡是不同。

數據庫中null不能用0表示。0歲和不知道多少歲不同。

Sex is zero。《色便是空》

//int i1 = null;

//int? i2 = null;//值類型後加?就成了可空數據類型

////int i3 = i2;//因此把可空的賦值給必定不能爲空的會報錯。

//int i4 = (int)i2;//能夠顯式轉換,由程序員來保證「必定不爲空」

//int? i5 = i4;//必定會成功!

//using()→try{]catch{}finally{}

//int?是微軟的一個語法糖。是一種和int沒有直接關係的Nullable類型

Nullable<int> d1 = new Nullable<int>();//int? d1=null;

Nullable<int> d2 = new Nullable<int>(3);//int? d2=3;

Console.WriteLine(d1==null);

int、DateTime不能,由於其爲Struct類型,而結構屬於值類型,值類型不能爲null,只有引用類型才能被賦值null。string能夠爲null。

C#中int等值類型不能夠爲null、而數據庫中的int能夠爲null,這就是糾結的地方。int?就變成了可空的int類型。bool?、DateTime?

int i1 = 3;

int? i2 = i1;

//int i3 = i2;//不能把可能爲空的賦值給必定不能爲空的變量

int i3 = (int)i2;//顯式轉換

可空數據類型經典應用場景:三層中的Model屬性的設計。

int?翻譯生成.Net的Nullable<int>,CTS。

20、using關鍵字有什麼用?什麼是IDisposable?

using能夠聲明namespace的引入,還能夠實現非託管資源的釋放,實現了IDisposiable的類在using中建立,using結束後會自動調用該對象的Dispose方法,釋放資源。加分的補充回答:using其實等價於try……finally,用起來更方便。

2一、XML 與 HTML 的主要區別

1. XML是區分大小寫字母的,HTML不區分。

2. 在HTML中,若是上下文清楚地顯示出段落或者列表鍵在何處結尾,那麼你能夠省略</p>或者</li>之類的結束 標記。在XML中,絕對不能省略掉結束標記。

HTML:<img src="1.jpg"><br><br>

XML:<img src="1.jpg"></img><br/><br/>

3. 在XML中,擁有單個標記而沒有匹配的結束標記的元素必須用一個 / 字符做爲結尾。這樣分析器就知道不用 查找結束標記了。

4. 在XML中,屬性值必須分裝在引號中。在HTML中,引號是可用可不用的。

5. 在HTML中,能夠擁有不帶值的屬性名。在XML中,全部的屬性都必須帶有相應的值。

XML是用來存儲和傳輸數據的

HTML是用來顯示數據的

若是使用了徹底符合XML語法要求的HTML,那麼就叫作符合XHTML標準。符合XHTML標準的頁面有利於SEO。

2二、string str = null 與 string str =」」說明其中的區別。

答:string str = null 是不給他分配內存空間,而string str = \"\" 給它分配長度爲空字符串的內存空間。 string str = null沒有string對象,string str = 「」有一個字符串對象。

string s3 = string.Empty;//反編譯發現,string.Empty就是在類構造函數中 Empty = "";

2三、寫出一條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實現

2四、.Net中全部可序列化的類都被標記爲

[serializable]

2五、什麼是code-Behind技術。

就是代碼隱藏,在ASP.NET中經過ASPX頁面指向CS文件的方法實現顯示邏輯和處理邏輯的分離,這樣有助於web應用程序的建立。好比分工,美工和編程的能夠個幹各的,不用再像之前asp那樣都代碼和html代碼混在一塊兒,難以維護。code-Behind是基於部分類技術實現的,在個人項目的三層代碼生成器中用到了部分類。

2六、接口是一種引用類型,在接口中能夠聲明(   a),但不能夠聲明公有的域或私有的成員變量。   
  a) 方法、屬性、索引器和事件;    b) 索引器和字段;       c) 事件和字段;

解讀:接口中不能聲明字段只能聲明方法,屬性、索引器和事件 最終都編譯生成方法。由於字段屬於實現層面的東西,只有存取值的時候纔會用到字段,因此中接口中不能定義字段。

2七、ADO.NET中,對於Command對象的ExecuteNonQuery()方法和ExecuteReader()方法,下面敘述錯誤的是(c)。  
  a) insert、update、delete等操做的Sql語句主要用ExecuteNonQuery()方法來執行;  
  b) ExecuteNonQuery()方法返回執行Sql語句所影響的行數。  
  c) Select操做的Sql語句只能由ExecuteReader()方法來執行;  
  d) ExecuteReader()方法返回一個DataReader對象;

SQLHelper實現一下。

2八、StringBuilder 和 String 的區別?

答:String 在進行運算時(如賦值、拼接等)會產生一個新的實例,而 StringBuilder 則不會。因此在大量字符串拼接或頻繁對某一字符串進行操做時最好使用 StringBuilder,不要使用 String

若是要操做一個不斷增加的字符串,儘可能不用String類,改用StringBuilder類。兩個類的工做原理不一樣:String類是一種傳統的修改字符串的方式,它確實能夠完成把一個字符串添加到另外一個字符串上的工做沒錯,可是在.NET框架下,這個操做實在是划不來。由於系統先是把兩個字符串寫入內存,接着刪除原來的String對象,而後建立一個String對象,並讀取內存中的數據賦給該對象。這一來二去的,耗了很多時間。而使用System.Text命名空間下面的StringBuilder類就不是這樣了,它提供的Append方法,可以在已有對象的原地進行字符串的修改,簡單並且直接。固然,通常狀況下覺察不到這兩者效率的差別,但若是你要對某個字符串進行大量的添加操做,那麼StringBuilder類所耗費的時間和String類簡直不是一個數量級的。

2九、請敘述屬性與索引器的區別。 *)

屬性 索引器

經過名稱標識。 經過簽名標識。

經過簡單名稱或成員訪問來訪問。 經過元素訪問來訪問。

能夠爲靜態成員或實例成員。 必須爲實例成員。

屬性的   get   訪問器沒有參數。 索引器的   get   訪問器具備與索引器相同的形參表。

屬性的   set   訪問器包含隱式   value   參數。 除了   value   參數外,索引器的 set 訪問器還具備與索引器相同的形參表。

30、請解釋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頁面會編譯生成一個類,這個類從隱藏類繼承。

3一、您在什麼狀況下會用到虛方法?它與接口有什麼不一樣?

答案:子類從新定義父類的某一個方法時,必須把父類的方法定義爲virtual

在定義接口中不能有方法體,虛方法能夠。

實現時,子類能夠不從新定義虛方法,但若是一個類繼承接口,那必須實現這個接口。

3二、DataReader和DataSet的異同?

DataReader使用時始終佔用SqlConnection,在線操做數據庫

每次只在內存中加載一條數據,因此佔用的內存是很小的

是隻進的、 只讀的

DataSet則是將數據一次性加載在內存中.拋棄數據庫鏈接..讀取完畢即放棄數據庫鏈接(非鏈接模式)

DataSet將數據所有加載在內存中.因此比較消耗內存...可是確比DataReader要靈活..能夠動態的添加行,列,數據.對數據庫進行 回傳更新操做(動態操做讀入到內存的數據)

3三、public static const int  A = 1;這段代碼有錯誤麼?

錯誤:const不能被修飾爲static ;由於定義爲常量 (const )後就是靜態的(static )。

3四、傳入某個屬性的set方法的隱含參數的名稱是什麼?

value,它的類型和屬性所聲名的類型相同。

3五、C#支持多重繼承麼?

類之間不支持,接口之間支持。類對接口叫作實現,不叫繼承。 類是爹、接口是能力,能有多個能力,但不能有多個爹。

3六、C#中全部對象共同的基類是什麼?System.Object

3七、經過超連接怎樣傳遞中文參數?

答:用URL編碼,經過QueryString傳遞,用urlencode編碼 用urldecode解碼

3八、string、String;int、Int32;Boolean、bool的區別

String、Int3二、Boolean等都屬於.Net中定義的類,而string、int、bool至關於C#中對這些類定義的別名。CTS。

3九、Server.TransferResponse.Redirect的區別是什麼?(常考)

: Server.Transfer僅是服務器中控制權的轉向,在客戶端瀏覽器地址欄中不會顯示出轉向後的地址;Response.Redirect則是徹底的跳轉,瀏覽器將會獲得跳轉的地址,並從新發送請求連接。這樣,從瀏覽器的地址欄中能夠看到跳轉後的連接地址。

Server.Transfer是服務器請求資源,服務器直接訪問目標地址的URL,把那個URL的響應內容讀取過來,而後把這些內容再發給瀏覽器,瀏覽器根本不知道服務器發送的內容是從哪兒來的,因此它的地址欄中仍是原來的地址。 這個過程當中瀏覽器和Web服務器之間通過了一次交互。

Response.Redirect就是服務端根據邏輯,發送一個狀態碼,告訴瀏覽器從新去請求那個地址,通常來講瀏覽器會用剛纔請求的全部參數從新請求。這個過程當中瀏覽器和Web服務器之間通過了兩次交互。

Server.Transfer不能夠轉向外部網站,而Response.Redirect能夠。

Server.Execute效果和Server.Transfer相似,可是是把執行的結果嵌入當前頁面。

40、不是說字符串是不可變的嗎?string s="abc";s="123"不就是變了嗎?

String是不可變的在這段代碼中,s原先指向一個String對象,內容是 "abc",而後咱們將s指向"123",那麼s所指向的那個對象是否發生了改變呢?答案是沒有。這時,s不指向原來那個對象了,而指向了另外一個 String對象,內容爲"123",原來那個對象還存在於內存之中,只是s這個引用變量再也不指向它了。

4一、是否能夠從一個static方法內部發出對非static方法的調用?

不能夠。由於非static方法是要與對象關聯在一塊兒的,必須建立一個對象後,才能夠在該對象上進行方法調用,而static方法調用時不須要建立對象,能夠直接調用。也就是說,當一個static方法被調用時,可能尚未建立任何實例對象,若是從一個static方法中發出對非static方法的調用,那個非static方法是關聯到哪一個對象上的呢?這個邏輯沒法成立,因此,一個static方法內部不能發出對非static方法的調用。

4二、說出一些經常使用的類、接口,請各舉5個

要讓人家感受你對.Net開發很熟,因此,不能僅僅只列誰都能想到的那些東西,要多列你在作項目中涉及的那些東西。就寫你最近寫的那些程序中涉及的那些類。

經常使用的類:StreamReader、WebClient、Dictionary<K,V>、StringBuilder、SqlConnection、FileStream、File、Regex、List<T>

經常使用的接口:IDisposable、IEnumerable、IDbConnection、IComparable、ICollectionIList、IDictionary

要出乎意料!不要僅僅完成任務!筆試不是高考!到處要顯出牛!

說出幾個開源軟件?MySQL、Linux、 Discuz、Apache、Paint.Net、Android、Chrome、Notepad++……

開源項目有一些是開發包。開源軟件指的是能夠直接用的。Jquery、NPOI、ASP.Net MVC、Silverlight  Toolkit、AJAX toolkit、json.net

4三、編寫一個單例(Singleton)類。

把構造函數設置爲private,設置一個public、static的對象實例

public FileManager

{

private FileManager(){}

public readonly static FileManager Instance = new FileManager();

}

擴展:搜「C#  Singleton」,有線程安全的更牛B的實現

4四、什麼是sql注入?如何避免sql注入?

用戶根據系統的程序構造非法的參數從而致使程序執行不是程序員指望的惡意SQL語句。使用參數化的SQL就能夠避免SQL注入。

詳細參考複習ppt。舉例子,擺事實!1' or 1=1

4五、數據庫三範式是什麼?

用本身的話解釋,而不是背概念。

第一範式:字段不能有冗餘信息,全部字段都是必不可少的。

第二範式:知足第一範式而且表必須有主鍵。

第三範式:知足第二範式而且表引用其餘的表必須經過主鍵引用。

員工內部→本身的老大→外部的老大      記憶順序:本身內部不重複→別人引用本身→本身引用別人。

4六、post、get的區別

get的參數會顯示在瀏覽器地址欄中,而post的參數不會顯示在瀏覽器地址欄中;

使用post提交的頁面在點擊【刷新】按鈕的時候瀏覽器通常會提示「是否從新提交」,而get則不會;

get的頁面能夠被搜索引擎抓取,而用post的則不能夠;

post能夠提交的數據量很是大,而用get能夠提交的數據量則很是小(2k),受限於網頁地址的長度。

post能夠進行文件的提交,而用get則不能夠。

參考閱讀:http://www.cnblogs.com/skynet/archive/2010/05/18/1738301.html

4七、.Net、ASP.Net、C#、VisualStudio之間的關係是什麼?

答:.Net通常指的是.Net Framework,提供了基礎的.Net類,這些類能夠被任何一種.Net編程語言調用,.Net Framework還提供了CLR、JIT、GC等基礎功能。

ASP.Net是.Net中用來進行Web開發的一種技術,ASP.Net的頁面部分寫在aspx 文件中,邏輯代碼一般經過Code-behind的方式用C#、VB.Net等支持.Net的語言編寫。

C#是使用最普遍的支持.Net的編程語言。除了C#還有VB.Net、IronPython等。

VisualStudio是微軟提供的用來進行.Net開發的集成開發環境(IDE),使用VisualStudio能夠簡化不少工做,不用程序員直接調用csc.exe等命令行進行程序的編譯,並且VisualStudio提供了代碼自動完成、代碼高亮等功能方便開發。除了VisualStudio,還有SharpDevelop、MonoDevelop等免費、開源的IDE,VisualStudio Express版這個免費版本。

4八、AJAX解決什麼問題?如何使用AJAX?AJAX有什麼問題須要注意?項目中哪裏用到了AJAX?

答:AJAX解決的問題就是「無刷新更新頁面」,用傳統的HTML表單方式進行頁面的更新時,每次都要將請求提交到服務器,服務器返回後再重繪界面,這樣界面就會經歷:提交→變白→從新顯示這樣一個過程,用戶體驗很是差,使用AJAX則不會致使頁面從新提交、刷新。

AJAX最本質的實現是在Javascript中使用XMLHttpRequest進行Http的請求,開發中一般使用UpdatePanel、JQuery等方式簡化AJAX的開發,UpdatePanel的方式實現AJAX最簡單,可是數據通信量比較大,由於要來回傳整個ViewState,並且不靈活,對於複雜的需求則可使用JQuery提供的ajax功能。

UpdatePanel的內部原理。

AJAX最重要的問題是沒法跨域請求(www.rupeng.com →so.rupeng.com),也就是沒法在頁面中向和當前域名不一樣的頁面發送請求,可使用在當前頁面所在的域的服務端作代理頁面的方式解決。

在如鵬網項目中發帖的時候顯示相關帖的功能、站內搜索項目中顯示搜索Suggestion、數據採集項目中都用到了AJAX。

常考:不用任何框架編寫一個AJAX程序。XHR:XmlHttpRequest。背也要背下來!

若是面試的時候談AJAX談到UpdatePanel的時候,就是NB的時候!!!先侃UpdatePanel的原理!引出爲何Dom操做的動態效果在用UpdatePanel提交刷新之後沒有了,以及CKEditor被套在UpdatePanel中提交之後也變成了textarea,爲何把Fileupload放到Updatepanel中沒法實現無刷新上傳。說成是公司內部的一個菜鳥用UpdatePanel遇到這樣問題,因爲我懂XHR、UpdatePanel的原理,因此輕鬆解決!UpdatePanel生成的上萬行JS腳本,不適合於互聯網項目。「WebForm怎麼可能把開發人員編程傻子呢!不明白原理苦命呀!仍是MVC好呀,MVC。。。。。。。」

4九、Application Cookie Session 兩種會話有什麼不一樣

答:Application是用來存取整個網站全局的信息,而Session是用來存取與具體某個訪問者關聯的信息。Cookie是保存在客戶端的,機密信息不能保存在Cookie中,只能放小數據;Session是保存在服務器端的,比較安全,能夠放大數據。

談到Session的時候就侃Session和Cookie的關係:Cookie中的SessionId。和別人對比說本身懂這個原理而給工做帶來的方便之處。

50、開放式問題:你常常訪問的技術類的網站是什麼?

博客園(www.cnblogs.com)、csdn、codeplex、codeproject、msdn文檔、msdn論壇(遇到問題先到網上搜解決方案,還不行就問同事,同事也解決不了就去MSDN論壇提問,必定能獲得解決)。Cnbeta.com。

5一、你對.net的GC的理解

GC是.Net的垃圾收集器,能夠進行內存資源的回收,程序員無需關心資源的回收,當一個對象沒有任何引用的時候就能夠被回收了。一個對象能夠被回收並不意味着必定會被當即回收,GC會選擇時機進行回收。能夠調用GC.Collect()讓GC當即回收。GC不能回收非託管資源,對於非託管資源通常都實現了IDisposable接口,而後使用using關鍵字進行資源的回收。

5二、請你簡單的說明數據庫創建索引的優缺點

使用索引能夠加快數據的查詢速度,不過因爲數據插入過程當中會建索引,因此會下降數據的插入、更新速度,索引還會佔磁盤空間。

5三、不用JQuery等框架實現AJAX無刷新登陸。(常考)

提示:用純XMLHttpRequest實現。

5四、Http狀態碼各是什麼意思。

301(永久重定向)、302 :重定向
404 :頁面不存在

500:服務器內部錯誤

5五、Session有什麼重大BUG,微軟提出了什麼方法加以解決?(常考)

iis中因爲有進程回收機制,系統繁忙的話Session會丟失,IIS重啓也會形成Session丟失。這樣用戶就要從新登陸或者從新添加購物車、驗證碼等放到Session中的信息。能夠用State  server或SQL Server數據庫的方式存儲Session不過這種方式比較慢,並且沒法捕獲Session的END事件。可是(必定要寫上,這樣纔夠拽)我認爲這不是Bug,只能說是In-Proc方式存儲Session的缺陷,缺陷是和Bug不同的,In-Proc方式存儲Session會由服務器來決定何時釋放Session,這是By Design,In-Proc方式不知足要求的話徹底能夠用StateServer和數據庫的方式。

StateServer還能夠解決集羣Session共享的問題。

5六、asp.net中<%%>、<%=%>、<%#%>的區別是什麼

<%%>是執行<%%>中的C#代碼,<%=%>是將=後表達式的值輸出到Response中,<%#%>是數據綁定,通常用在ListView、GridView、Repeater等控件的綁定中。數據綁定分爲:Eval:單向綁定和Bind:雙向綁定。

5七、說說在軟件設計中你遇到的以空間換時間的例子?

參考回答:談Cache(緩存)、索引這些例子。用額外的磁盤、內存空間的消耗來提升執行速度。Lucene.Net也是一個例子。

5八、asp.net中的錯誤機制。(常考)

參考:

定製錯誤頁來將顯示一個友好的報錯頁面。

頁面中未捕獲同樣會觸發Page_Error(不經常使用),應用程序中的未捕獲異常會觸發Application_Error。經過HttpContext.Current.Server.GetLastError()、HttpContext.Current.Error;拿到未捕捉異常,記錄到Log4Net日誌中

5九、介紹幾個使用過的開源的項目

Lucene.net、NPOI、JQuery、ASP.Net AJAX  toolkit、Quartz.Net、JqueryUI、ASP.Net MVC。在CodePlex、SourceForge等網站上有更多的開源項目

60、說出五個集合類

List、Dictionary、Set、Stack(先入後出)、Queue(先入先出)、Tree等。

6一、有一個10個數的數組,計算其中不重複數字的個數。{3,5,9,8,10,5,3}

工程化的非最優解答:用HashSet或者List

int[] values = { 3, 5, 9, 8, 10, 5, 3 };

HashSet<int> set = new HashSet<int>();

foreach (int i in values)

{

set.Add(i);

}

Console.WriteLine(set.Count);

6二、說一下SQLServer中索引的兩種類型(常考!!!)

參考:聚簇(或者叫作彙集,cluster)索引和非聚簇索引。

字典的拼音目錄就是聚簇(cluster)索引,筆畫目錄就是非聚簇索引。這樣查詢「G到M的漢字」就很是快,而查詢「6劃到8劃的字」則慢。

聚簇索引是一種特殊索引,它使數據按照索引的排序順序存放表中。聚簇索引相似於字典,即全部詞條在字典中都以字母順序排列。聚簇索引實際上重組了表中的數據,因此你只能在表中創建一個聚簇索引。
當數據按值的範圍查詢時,聚簇索引就顯得特別有用。由於全部SQLServer都必需先找到所查詢範圍的第一行,而後依次下去,直到該範圍的最後一個值找到爲止,而且保證了全部其餘值也落在這個範圍內。舉一個例子,一個應用程序要查找首字母位於G和P之間的姓名列表,SQLServer首先找到以字母G開頭的名字,取出全部記錄,直到找到以字母P開頭的名字爲止,這種方法使得查詢過程很是高效。

進行大量數據改動的表不適宜用聚簇索引,由於SQLServer將不得不在表中維護行的次序。若是要索引的值極少,例如一個列包含的全都是1和0,建立聚簇索引就不是個好主意。若是表常常由一個指定的列來排序,該列將是簇索引的最佳候選列。這是由於表中的數據已經爲你排好序了。若是訪問一個表並使用BETWEEN、<、>、>=或<=操做符來返回一個範圍的值時,應該考慮使用聚簇索引。

6三、可否脫離VS用相似editplus的工具手寫代碼?你以爲如何才能提升代碼的效率和性能?

能夠,使用CSC.exe 來編譯.cs文件!

能夠根據業務流程、業務數據的特色進行優化,好比能夠採用緩存、索引、表驅動等來提高代碼的效率和性能,同時不要進行無心義的代碼優化,重點優化系統的性能瓶頸。

6四、如何提升頁面的顯示速度?假如一個頁面的加載時間是10.89s,你會用什麼樣的方式進行優化?

回答要大氣!顯得很牛!

提示:分而治之的思想。

首先要找出問題所在,是服務器端運行的速度慢仍是服務器端到客戶端的下載慢仍是頁面在瀏覽器的加載速度慢。

若是是服務器端運行速度慢,則找是數據庫的緣由仍是算法的問題,若是是數據庫的問題則嘗試添加索引、優化SQL語句,若是是算法的問題,則優化算法。若是對於一些不常常改動的頁面可使用靜態頁技術!對於一些數據不須要及時更新的並且取數據的過程很是耗時可使用緩存。頁面中的內容能夠按需加載(好比說能夠像verycd網站的評論那樣當用戶須要看的時候再加載其內容),能夠在圖片須要顯示的時候再進行加載。

若是是服務器端到客戶端的下載慢則看是頁面體積過於臃腫仍是網絡問題,若是是頁面體積過於臃腫,則優化HTML代碼,去掉無用的標籤,壓縮JS、CSS,能夠用CSS Spirit技術將多個圖片放到一個圖片中,減小向服務器的請求。若是是網絡問題,則嘗試在不一樣的網絡、地區部署服務器,而後使用CDN技術加速訪問。

若是是頁面中的JavaScript運行復雜致使運行速度慢,則優化JavaScript。

webkaka:測網速。

如何處理百萬條數據的優化?

對於常常進行檢索的字段建立索引,對於常常進行範圍查詢的一個字段建立彙集索引;

當有大量數據進行插入的時候進行批量插入;

一些代碼用存儲過程進行重寫(當一個邏輯有多行SQL要執行的時候用存儲過程能夠優化速度,能夠避免客戶端和SQLServer之間屢次交互);

(*)集羣、讀寫分離;

(*)分區、分表;

6五、在程序編碼的時候,你會對Sql注入漏洞的防範採起什麼樣的措施?

儘可能不要拼SQL語句!使用參數化查詢或存儲過程能夠防止SQL注入攻擊!在必須用SQL拼接的地方對用戶輸入的內容進行檢查、過濾。

6六、你會採用什麼樣的策略和方法來實現系統緩存?

ASP.NET中 緩存有 頁面緩存,數據源緩存,和一些本身定義的緩存!

對於那些整個頁面不常常變化的咱們可使用頁面緩存,而對於那些執行很是耗時的SQL語句而且數據的及時性要求不高的咱們可使用數據源緩存。

對於頁面緩存、數據源緩存等都不知足要求的狀況下采用直接操做HttpRuntime.Cache來自定義緩存策略。若是須要用多臺Web服務器做爲一個集羣來承載網站的狀況,則能夠部署專門的分佈式緩存服務器,好比Memcached

6七、網站想要實現文件防盜鏈的功能,說說你的解決方案。

讀取HTTP報文頭中的UrlReferrer在Application_BeginRequest中咱們能夠判斷用戶的請求是否來源於本網站。若是不是咱們能夠終止用戶的請求(Response.End();)!

6八、ref與out的區別?

Ref和Out這樣個2個關鍵字都可以提供類似的功效,其做用也很像C中的指針變量。稍有不相同之處是:
Ref型參數時,傳入的參數必須先被初始化。而Out則不要要,對Out而言,就必須在方法中對其完成初始化。
Ref和Out時都必須注意,在方法的參數和執行方法時,都要加Ref或Out關鍵字。以知足匹配。
Out更適合用在要要Return多個返回值的地方,而Ref則用在要要被調出使用的方法修改調出使用者的引用的時候。

6九、MVC路由理解?

一、首先咱們要理解MVC中路由的做用:url Routing的做用是將瀏覽器的URL請求映射到特定的MVC控制器動做。

二、當咱們訪問http://localhost:8080/Home/Index這個地址的時候,請求首先被UrlRoutingModule截獲,截獲請求後,從Routes中獲得與當前請求URL相符合的RouteData對象,將RouteData對象和當前URL封裝成一個RequestContext對象,而後從Requestcontext封裝的RouteData中獲得Controller名字,根據Controller的名字,經過反射建立控制器對象,這個時候控制器才真正被激活,最後去執行控制器裏面對應的action。

70、談談你以爲作的不錯系統,大概介紹下用到了哪些技術?

就拿我以前作過的一個項目爲例來簡單說明一下吧。項目分爲客戶端和服務端,客戶端分爲BS客戶端和CS客戶端,BS客戶端採用MVC 5.0的框架,CS客戶端是Winform項目,服務端使用WebApi統一提供服務接口,考慮之後可能還要擴展手機端,因此服務接口的參數和返回值使用通用的Json格式來傳遞數據。

一、服務端採用的面向接口編程,咱們在軟件架構的過程當中,層和層之間經過接口依賴,下層不是直接給上層提供實現,而是提供接口,具體的實現以依賴注入的方式在運行的時候動態注入進去。MEF就是實現依賴注入的一種組件。它的使用使得UI層不直接依賴於BLL層,而是依賴於中間的一個IBLL層,在程序運行的時候,經過MEF動態將BLL裏面的實現注入到UI層裏面去,這樣作的好處是減小了層與層之間的耦合。服務端的異常裏面、權限驗證、日誌記錄等通用功能使用了AOP攔截的機制統一管理,項目中使用的是Postsharp這個組件,很好地將通用需求功能從不相關的類當中分離出來,提升了代碼的可維護性。

二、BS的客戶端採用的jquery+bootstrap 的方式,全部頁面採用流式佈局,能更好適應各類不一樣的終端設備(PC、手機)。項目中使用了各類功能強大的bootstrap組件,能適應各類複雜的業務需求。

7一、談談你對設計模式的認識?結合你用得最多的一種設計模式說說它的使用。

7二、IIS的工做原理?

一、當客戶端發送HTTP Request時,服務端的HTTP.sys(能夠理解爲IIS的一個監聽組件) 攔截到這個請求;

二、HTTP.sys 聯繫 WAS 向配置存儲中心請求配置信息。

三、而後將請求傳入IIS的應用程序池。

四、檢查請求的後綴,啓動aspnet_isapi.dll這個dll,這個dll是.net framework裏面的,也就是說到這一步,請求進入了.net framework的管轄範圍。

五、這個時候若是是WebForm,開始執行復雜的頁面生命週期(HttpRuntime→ProcessRequest→HttpContext→HttpHandler);若是是MVC,則啓動mvc的路由機制,根據路由規則爲URL來指定HttpHandler。

六、httpHandler處理請求後,請求結束,給出Response,客戶端處理響應,整個過程結束。

7三、Http協議

一、http協議是瀏覽器和服務器雙方共同遵循的規範,是一種基於TCP/IP應用層協議。

二、http是一種典型的請求/響應協議。客戶端發送請求,請求的內容以及參數存放到請求報文裏面,服務端收到請求後,作出響應,返回響應的結果放到響應報文裏面。經過F12能夠查看請求報文和響應報文。

三、http協議是」無狀態」的,當客戶端向服務端發送一次http請求後,服務端收到請求而後返回給客戶端相應的結果,服務器會當即斷開鏈接並釋放資源。在實際開發過程當中,咱們有時須要「保持」這種狀態,因此衍生出了Session/Cookie這些技術。

四、http請求的方式主要有get/post。

五、http狀態碼最好記幾個,博主有一次面試就被問到了。200(請求成功)、404(請求的資源不存在)、403(禁止訪問)、5xx(服務端錯誤)

7四、數據庫優化經驗(後端工程師很是常見)

一、數據庫運維方面的優化:啓用數據庫緩存。對於一些比較經常使用的查詢能夠採用數據庫緩存的機制,部署的時候須要注意設置好緩存依賴項,防止「過時」數據的產生。

二、數據庫索引方面的優化:好比經常使用的字段建索引,聯合查詢考慮聯合索引。(PS:若是你有基礎,能夠敞開談談彙集索引和非彙集索引的使用場景和區別)

三、數據庫查詢方面的優化:避免select * 的寫法、儘可能不用in和not in 這種耗性能的用法等等。

四、數據庫算法方面的優化:儘可能避免大事務操做、減小循環算法,對於大數據量的操做,避免使用遊標的用法等等。

7五、關於代碼優化你怎麼理解?你會考慮去代碼重構嗎?

一、對於代碼優化,以前的公司每週會作代碼審覈,審覈的主要做用就是保證代碼的正確性和執行效率,好比減小代碼的層級結構、避免循環嵌套、避免循環CURD數據庫、儘可能避免一次取出大量數據放在內存中(容易內存溢出)、優化算法等。

二、對於陳舊代碼,可能不少地方有調用,而且開發和維護人員頗有可能不是同一我的,因此重構時要格外當心,若是沒有十足的把握,不要輕易重構。若是必需要重構,必須作好充分的單元測試和全局測試。

7六、關於服務器端 MVC 架構的技術實現,您是怎樣理解的?這種架構方式有什麼好處?您在項目中是如何應用這一架構的?

參考答案:MVC,顧名思義,Model、View、Controller。全部的界面代碼放在View裏面,全部涉及和界面交互以及URL路由相關的邏輯都在Controller裏面,Model提供數據模型。MVC的架構方式會讓系統的可維護性更高,使得每一部分更加專一本身的職責,而且MVC提供了強大的路由機制,方便了頁面切換和界面交互。而後能夠結合和WebForm的比較,談談MVC如何解決複雜的控件樹生成、如何避免了複雜的頁面生命週期。

7七、網站優化:網站運行慢,如何定位問題?發現問題如何解決?

瀏覽器F12→網絡→查看http請求數以及每一個請求的耗時,找到問題的根源,而後依次解決,解決方案能夠參考問題一里面的Web優化方案。

7八、說說你最擅長的技術?並說說你是如何使用的?

簡單談談MEF在咱們項目裏面的使用吧。

在談MEF以前,咱們必需要先談談DIP、IOC、DI

依賴倒置原則(DIP):一種軟件架構設計的原則(抽象概念)

控制反轉(IoC):一種反轉流、依賴和接口的方式(DIP的具體實現方式)。

依賴注入(DI):IoC的一種實現方式,用來反轉依賴(IoC的具體實現方式)。

什麼意思呢?也就是說,咱們在軟件架構的過程當中,層和層之間經過接口依賴,下層不是直接給上層提供實現,而是提供接口,具體的實現以依賴注入的方式在運行的時候動態注入進去。MEF就是實現依賴注入的一種組件。它的使用使得UI層不直接依賴於BLL層,而是依賴於中間的一個IBLL層,在程序運行的時候,經過MEF動態將BLL裏面的實現注入到UI層裏面去,這樣作的好處是減小了層與層之間的耦合。這也正是面向接口編程方式的體現。

7九、本身寫過多線程組件嗎?簡要說明!

參考答案:能夠參考http://www.cnblogs.com/Alexander-Lee/archive/2009/10/31/1593647.html

80、談談ERP、CRM、MES、OA類型系統的不一樣

ERP:Enterprise Resource Planning,企業資源計劃。是指創建在信息技術基礎上,以系統化的管理思想,爲企業決策層及員工提供決策運行手段的管理平臺。

CRM:Customer Relationship Management,客戶關係管理。是一種以"客戶關係一對一理論"爲基礎,旨在改善企業與客戶之間關係的新型管理機制。

MES:manufacturing execution system,生產執行系統。是一套面向製造企業車間執行層的生產信息化管理系統

OA:Office Automation,辦公自動化。將現代化辦公和計算機網絡功能結合起來的一種新型的辦公方式

8一、如何處理幾十萬條併發數據?

答:用存儲過程或事務。取得最大標識的時候同時更新..注意主鍵不是自增量方式這種方法併發的時候是不會有重複主鍵的..取得最大標識要有一個存儲過程來獲取.

8二、ASP.Net頁面生命週期簡單描述

 

每一個頁面的生命週期爲用戶的每一次訪問,也就是說每一次客戶端與服務器之間的一個往返過程.全局變量的生命週期在此之間.

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;

================================================================================

相關文章
相關標籤/搜索