1. 程式人生 > 其它 >C# 面試

C# 面試

1、簡述 private、 protected、 public、 internal 修飾符的訪問許可權。

private 私有成員 在類的內部可以訪問

protected 保護成員 在類的內部和繼承類中可以使用

public 公共成員 沒有訪問限制

internal 在當前程式集中可以呼叫

1.1

類的預設修飾符為internal
成員變數的預設為private

1.2

程式集是程式碼進行編譯是的一個邏輯單元,把相關的程式碼和型別進行組合,然後生成PE檔案。程式集只是邏輯上的劃分,一個程式集可以只由一個檔案組成,也可由多個檔案組成。不管是單檔案程式集還是多檔案程式集,它們都由固定的結構組成,外在的表現形式為exe或者dll檔案。

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 ,DataReader 或DataAdapter物件來執行SQL語句,

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

1.使用QueryString, 如....?id=1; response. Redirect()....

2.使用Session變數

3.使用Server.Transfer

4.Cookie傳值

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

委託可以把一個方法作為引數代入另一個方法。

委託可以理解為指向一個函式的指標。

委託和事件沒有可比性,因為委託是型別,事件是物件,下面說的是委託的物件(用委託方式實現的事件)和(標準的event方式實現)事件的區別。事件的內部是用委託實現的。因為對於事件來講,外部只能“註冊自己+=、登出自己-=”,外界不可以登出其他的註冊者,外界不可以主動觸發事件,因此如果用Delegate就沒法進行上面的控制,因此誕生了事件這種語法。事件是用來閹割委託例項的,類比用一個自定義類閹割List。事件只能add、remove自己,不能賦值。事件只能+=、-=,不能= 。加分的補充回答:事件內部就是一個private的委託和add、remove兩個方法

5、override與過載(overload)的區別

過載是方法的名稱相同。引數或引數型別不同,進行多次過載以適應不同的需要。過載(overload)是面向過程的概念。

Override 是進行基類中函式的重寫。Override是面向物件的概念

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

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

7、屬性和public欄位的區別是什麼?呼叫set方法為一個屬性設值,然後用get方法讀取出來的值一定是set進去的值嗎?

屬性可以對設值、取值的過程進行非法值控制,比如年齡禁止設值負數,而欄位則不能進行這樣的設定。雖然一般情況下get讀取的值就是set設定的值,但是可以讓get讀取的值不是set設定的值的,極端的例子。Public Age{get{return 100;}set{}}。加分的補充回答:用reflector反編譯可以看出,屬性內部本質上就是set_、get_方法,

10、關於拆箱裝箱:

裝箱:從值型別介面轉換到引用型別。

拆箱:從引用型別轉換到值型別

NET重要技術和基礎之一的CTS(Common Type System)。CTS是為了實現在應用程式宣告和使用這些型別時必須遵循的規則而存在的通用型別系統。.Net將整個系統的型別分成兩大類 :值型別和引用型別。

CTS中的所有東西都是物件;所有的物件都源自一個基類——System.Object型別。值型別的一個最大的特點是它們不能為null,值型別的變數總有一個值。為了解決值型別不可以為null,引用型別可以為null的問題,微軟在.Net中引入了裝箱和拆箱:裝箱就是將值型別用引用型別包裝起來轉換為引用型別;而從引用型別中拿到被包裝的值型別資料進行拆箱。

10.1值型別和引用型別

值型別線上程棧分配空間,引用型別在託管堆分配空間

值型別(value type):byte,short,int,long,float,double,decimal,char,bool 和 struct 統稱為值型別。值型別變數聲明後,不管是否已經賦值,編譯器為其分配記憶體。

string,Object,陣列,class是引用型別,簡單型別,列舉,結構是值型別。

12、CTS、CLS、CLR分別作何解釋(

CTS(Common Type System)是通用型別系統,主要用於解決不同語言的資料型別不同的問題,它是一種型別標準,在這個標準中不但實現了COM的變數相容型別,還定義了通 過使用者自定義型別的方式來進行型別擴充套件,所有以.NET平臺為目標的語言通過建立本身資料型別與CTS之間的對映來實現與其他語言的資料型別的互動。

CLS(Common Language Specification)是公共語言規範,主要用於實現多種語言之間的互操作性,是公共語言執行庫的子集。

CLR(Common Language Runtime)是公共語言執行庫,是所有.NET應用程式執行時的環境,所有應用程式都要使用的程式設計基礎,它如同一個支援.NET應用程式執行和開發的虛擬機器。

14、堆和棧的區別?

棧是編譯期間就分配好的記憶體空間,因此你的程式碼中必須就棧的大小有明確的定義;區域性值型別變數、值型別引數等都在棧記憶體中。

堆是程式執行期間動態分配的記憶體空間,你可以根據程式的執行情況確定要分配的堆記憶體的大小。

15、能用foreach遍歷訪問的物件的要求

需要實現IEnumerable介面或宣告GetEnumerator方法的型別。

16、GC是什麼? 為什麼要有GC?

GC是垃圾收集器(Garbage Collection)。程式設計師不用擔心記憶體管理,因為垃圾收集器會自動進行管理。GC只能處理託管記憶體資源的釋放,對於非託管資源則不能使用GC進行回收,必須由程式設計師手工回收,一個例子就是FileStream或者SqlConnection需要程式設計師呼叫Dispose進行資源的回收。

回收堆上面的資料

19、C#中的介面和類有什麼異同。

不同點:

不能直接例項化介面。

介面不包含方法的實現。

介面可以多繼承,類只能單繼承。

類定義可在不同的原始檔之間進行拆分。

相同點:

介面、類和結構都可以從多個介面繼承。

介面類似於抽象基類:繼承介面的任何非抽象型別都必須實現介面的所有成員。

介面和類都可以包含事件、索引器、方法和屬性。

基礎知識:介面只能定義方法(只能定義行為,不能定義實現也就是欄位),因為事件、索引器、屬性本質上都是方法,所以介面中也可以定義事件、索引器、屬性。

28、int、DateTime、string是否可以為null?

int、DateTime不能,因為其為Struct型別,而結構屬於值型別,值型別不能為null,只有引用型別才能被賦值null。string可以為null。