一、簡述 private、 protected、 public、 internal 修飾符的訪問權限。數據庫
private : 私有成員, 在類的內部才能夠訪問。服務器
protected : 保護成員,該類內部和繼承類中能夠訪問。網絡
public : 公共成員,徹底公開,沒有訪問限制。 架構
internal: 當前程序集內能夠訪問。ide
二、ADO.NET中的五個主要對象函數
Connection:主要是開啓程序和數據庫之間的鏈接。沒有利用鏈接對象將數據庫打開,是沒法從數據庫中取得數據的。Close和Dispose的區別,Close之後還能夠Open,Dispose之後則不能再用。this
Command:主要能夠用來對數據庫發出一些指令,例如能夠對數據庫下達查詢、新增、修改、刪除數據等指令,以及調用存在數據庫中的存儲過程等。這個對象是架構在Connection 對象上,也就是Command 對象是透過鏈接到數據源。spa
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 對象操做數據結果。
三、列舉ASP.NET 頁面之間傳遞值的幾種方式。
1.使用QueryString, 如....?id=1; response. Redirect()....
2.使用Session變量
3.使用Server.Transfer
4.Cookie傳值
四、C#中的委託是什麼?事件是否是一種委託?事件和委託的關係。
委託能夠把一個方法做爲參數代入另外一個方法。
委託能夠理解爲指向一個函數的指針。
委託和事件沒有可比性,由於委託是類型,事件是對象,下面說的是委託的對象(用委託方式實現的事件)和(標準的event方式實現)事件的區別。事件的內部是用委託實現的。由於對於事件來說,外部只能「註冊本身+=、註銷本身-=」,外界不能夠註銷其餘的註冊者,外界不能夠主動觸發事件,所以若是用Delegate就無法進行上面的控制,所以誕生了事件這種語法。事件是用來閹割委託實例的,類比用一個自定義類閹割List。事件只能add、remove本身,不能賦值。事件只能+=、-=,不能= 。加分的補充回答:事件內部就是一個private的委託和add、remove兩個方法
五、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_***方法.
八、三層架構
一般意義上的三層架構就是將整個業務應用劃分爲:表現層(UI)、業務邏輯層(BLL)、數據訪問層(DAL)。
區分層次的目的即爲了「高內聚,低耦合」的思想。
表現層(UI):通俗講就是展示給用戶的界面,即用戶在使用一個系統的時候的所見所得。
業務邏輯層(BLL):針對具體問題的操做,也能夠說是對數據層的操做,對數據業務邏輯處理。
數據訪問層(DAL):該層所作事務直接操做數據庫,針對數據的增添、刪除、修改、更新、查找等每層之間是一種垂直的關係。
三層結構是N層結構的一種,通常來講,層次之間是向下依賴的,下層代碼未肯定其接口(契約)前,上層代碼是沒法開發的,下層代碼接口(契約)的變化將使上層的代碼一塊兒變化。
優勢: 分工明確,條理清晰,易於調試,並且具備可擴展性。
缺點: 增長成本。
十、關於拆箱裝箱:
1)什麼是裝箱(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中引入了裝箱和拆箱:裝箱就是將值類型用引用類型包裝起來轉換爲引用類型;而從引用類型中拿到被包裝的值類型數據進行拆箱。
(*)
object.ReferenceEquals();//用來判斷兩個對象是不是同一個對象
Console.WriteLine(object.ReferenceEquals(3,3));//由於兩個3被裝到了兩個箱子中,因此是false
Equals ==的關係