C#旨在設計成為一種"簡單、現代、通用",以及面向對象的程序設計語言,此種語言的實現,應提供對於以下軟件工程要素的支持:強類型檢查、數組維度檢查、未初始化的變量引用檢測、自動垃圾收集(Garbage Collection,指一種自動內存釋放技術)。下面就由本站小編為大家介紹一下C#筆試常見題的文章,歡迎閲讀。
C#筆試常見題篇1
1、簡述 private、 protected、 public、 internal 修飾符的訪問權限。
private : 私有成員, 在類的內部才可以訪問。
protected : 保護成員,該類內部和繼承類中可以訪問。
public : 公共成員,完全公開,沒有訪問限制。
internal: 當前程序集內可以訪問。
2、中的五個主要對象
Connection:主要是開啟程序和數據庫之間的連接。沒有利用連接對象將數據庫打開,是無法從數據庫中取得數據的。Close和Dispose的區別,Close以後還可以Open,Dispose以後則不能再用。
Command:主要可以用來對數據庫發出一些指令,例如可以對數據庫下達查詢、新增、修改、刪除數據等指令,以及調用存在數據庫中的存儲過程等。這個對象是架構在Connection 對象上,也就是Command 對象是透過連接到數據源。
DataAdapter:主要是在數據源以及DataSet 之間執行數據傳輸的工作,它可以透過Command 對象下達命令後,並將取得的數據放入DataSet 對象中。這個對象是架構在Command對象上,並提供了許多配合DataSet 使用的功能。
DataSet:這個對象可以視為一個暫存區(Cache),可以把從數據庫中所查詢到的數據保留起來,甚至可以將整個數據庫顯示出來,DataSet是放在內存中的。DataSet 的能力不只是可以儲存多個Table 而已,還可以透過DataAdapter對象取得一些例如主鍵等的數據表結構,並可以記錄數據表間的關聯。DataSet 對象可以説是 中重量級的對象,這個對象架構在DataAdapter對象上,本身不具備和數據源溝通的能力;也就是説我們是將DataAdapter對象當做DataSet 對象以及數據源間傳輸數據的橋樑。DataSet包含若干DataTable、DataTableTable包含若干DataRow。
DataReader:當我們只需要循序的讀取數據而不需要其它操作時,可以使用DataReader 對象。DataReader對象只是一次一筆向下循序的讀取數據源中的數據,這些數據是存在數據庫服務器中的,而不是一次性加載到程序的內存中的,只能(通過遊標)讀取當前行的數據,而且這些數據是隻讀的,並不允許作其它的操作。因為DataReader 在讀取數據的時候限制了每次只讀取一筆,而且只能只讀,所以使用起來不但節省資源而且效率很好。使用DataReader 對象除了效率較好之外,因為不用把數據全部傳回,故可以降低網絡的負載。
使用Connection 對象來連接數據庫,使用Command 或DataAdapter對象來執行SQL語句,並將執行的結果返回給DataReader 或 DataAdapter ,然後再使用取得的DataReader 或DataAdapter 對象操作數據結果。
3、列舉 頁面之間傳遞值的幾種方式。
1.使用QueryString, 如....?id=1; response. Redirect....
2.使用Session變量
3.使用sfer
ie傳值
4、C#中的委託是什麼?事件是不是一種委託?事件和委託的關係。
委託可以把一個方法作為參數代入另一個方法。
委託可以理解為指向一個函數的指針。
委託和事件沒有可比性,因為委託是類型,事件是對象,下面説的是委託的對象(用委託方式實現的事件)和(標準的event方式實現)事件的區別。事件的內部是用委託實現的。因為對於事件來講,外部只能“註冊自己+=、註銷自己-=”,外界不可以註銷其他的註冊者,外界不可以主動觸發事件,因此如果用Delegate就沒法進行上面的控制,因此誕生了事件這種語法。事件是用來閹割委託實例的,類比用一個自定義類閹割List。事件只能add、remove自己,不能賦值。事件只能+=、-=,不能= 。加分的補充回答:事件內部就是一個private的委託和add、remove兩個方法
C#筆試常見題篇2
1、override與重載(overload)的區別
重載是方法的名稱相同。參數或參數類型不同,進行多次重載以適應不同的需要。重載(overload)是面向過程的概念。
Override 是進行基類中函數的重寫。Override是面向對象的概念
2、C#中索引器是否只能根據數字進行索引?是否允許多個索引器參數?
參數的個數和類型都是任意的。加分的補充回答:用reflector反編譯可以看出,索引器的內部本質上就是set_item、get_item方法。
基礎知識:
索引的語法:
public string this[string s],通過get、set塊來定義取值、賦值的邏輯
索引可以有多個參數、參數類型任意
索引可以重載。
如果只有get沒有set就是隻讀的索引。
索引其實就是set_Item、get_Item兩個方法。
3、屬性和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;
= 30;
++;
e();//輸出3
必須手寫掌握的代碼(既包含拿電腦寫,拿筆寫):
1、 手寫三層架構
2、 手寫冒泡排序
3、 手寫AJAX:XMLHttpRequest
4、 手寫增刪改查、SQLHelper
C#筆試常見題篇3
1、三層架構
通常意義上的三層架構就是將整個業務應用劃分為:表現層(UI)、業務邏輯層(BLL)、數據訪問層(DAL)。
區分層次的目的即為了“高內聚,低耦合”的思想。
表現層(UI):通俗講就是展現給用户的界面,即用户在使用一個系統的時候的所見所得。
業務邏輯層(BLL):針對具體問題的操作,也可以説是對數據層的操作,對數據業務邏輯處理。
數據訪問層(DAL):該層所做事務直接操作數據庫,針對數據的增添、刪除、修改、更新、查找等每層之間是一種垂直的關係。
三層結構是N層結構的一種,一般來説,層次之間是向下依賴的,下層代碼未確定其接口(契約)前,上層代碼是無法開發的,下層代碼接口(契約)的變化將使上層的代碼一起變化。
優點: 分工明確,條理清晰,易於調試,而且具有可擴展性。
缺點: 增加成本。
2、關於拆箱裝箱:
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是為了實現在應用程序聲明和使用這些類型時必須遵循的規則而存在的通用類型系統。將整個系統的類型分成兩大類 :值類型和引用類型。
CTS中的所有東西都是對象;所有的對象都源自一個基類——ct類型。值類型的一個最大的特點是它們不能為null,值類型的變量總有一個值。為了解決值類型不可以為null,引用類型可以為null的問題,微軟在中引入了裝箱和拆箱:裝箱就是將值類型用引用類型包裝起來轉換為引用類型;而從引用類型中拿到被包裝的值類型數據進行拆箱。
(*)
renceEquals;//用來判斷兩個對象是否是同一個對象
eLine(renceEquals(3,3));//因為兩個3被裝到了兩個箱子中,所以是false
Equals ==的關係
3、CTS、CLS、CLR分別作何解釋(*)把英文全稱背過來。
C#和的關係。
C#只是抽象的語言,可以把C#編譯生成Java平台的二進制代碼,也可以把Java代碼編譯生成平台的二進制代碼。所以C#只是提供了if、while、+-*/、定義類、int、string等基礎的語法,而t32、FileStream、SqlConnection、t等都屬於的東西。深藍色是C#的,淺藍色是的。
C# new→IL:newobj
C# string →中的String
類型的差別:中的Int32在C#中是int,在中是Integer。String、Int32等公共類型。
語法的差別:IL中創建一個對象的方法是L_0001: newobj instance void 索引.C1::
C#中是new C1;中是 Dim c1 As New C1
CTS:Common Type System 通用類型系統。Int32、Int16→int、String→string、Boolean→bool。每種語言都定義了自己的類型,通過CTS提供了公共的類型,然後翻譯生成對應的類型。
CLS:Common Language Specification 通用語言規範。不同語言語法的不同。每種語言都有自己的語法,通過CLS提供了公共的語法,然後不同語言翻譯生成對應的語法。
CLR:Common Language Runtime 公共語言運行時,就是GC、JIT等這些。有不同的CLR,比如服務器CLR、Linux CLR(Mono)、Silverlight CLR(CoreCLR)。相當於一個發動機,負責執行IL。
4、在dotnet中類(class)與結構(struct)的異同?
Class可以被實例化,屬於引用類型,是分配在內存的堆上的。類是引用傳遞的。
Struct屬於值類型,是分配在內存的棧上的。結構體是複製傳遞的。加分的回答:Int32、Boolean等都屬於結構體。
5、堆和棧的區別?
棧是編譯期間就分配好的內存空間,因此你的代碼中必須就棧的大小有明確的定義;局部值類型變量、值類型參數等都在棧內存中。
堆是程序運行期間動態分配的內存空間,你可以根據程序的運行情況確定要分配的堆內存的大小。
6、能用foreach遍歷訪問的對象的要求
需要實現IEnumerable接口或聲明GetEnumerator方法的類型。
7、GC是什麼? 為什麼要有GC?
C/C++中由程序員進行對象的回收像學校食堂中由學生收盤子,中由GC進行垃圾回收像餐館中店員去回收。
GC是垃圾收集器(Garbage Collection)。程序員不用擔心內存管理,因為垃圾收集器會自動進行管理。GC只能處理託管內存資源的釋放,對於非託管資源則不能使用GC進行回收,必須由程序員手工回收,一個例子就是FileStream或者SqlConnection需要程序員調用Dispose進行資源的回收。
要請求垃圾收集,可以調用下面的方法:ect一般不需要手動調用ect。當一個對象沒有任何變量指向(不再能使用)的時候就可以被回收了。
基礎知識:當沒有任何變量指向一個對象的時候對象就可以被回收掉了,但不一定會立即被回收。
object obj = new object;//只有new才會有新對象
eLine(obj);
object obj2 = obj;
obj = null;
obj2 = null;
eLine;
8、值類型和引用類型的區別?
1.將一個值類型變量賦給另一個值類型變量時,將複製包含的值。引用類型變量的賦值只複製對對象的引用,而不復制對象本身。
2.值類型不可能派生出新的類型:所有的值類型均隱式派生自 eType。但與引用類型相同的是,結構也可以實現接口。
3.值類型不可能包含 null 值:然而,可空類型功能允許將 null 賦給值類型。
4.每種值類型均有一個隱式的默認構造函數來初始化該類型的默認值。
9、C#中的接口和類有什麼異同。
不同點:
不能直接實例化接口。
接口不包含方法的實現。
接口可以多繼承,類只能單繼承。
類定義可在不同的源文件之間進行拆分。
相同點:
接口、類和結構都可以從多個接口繼承。
接口類似於抽象基類:繼承接口的任何非抽象類型都必須實現接口的所有成員。
接口和類都可以包含事件、索引器、方法和屬性。
基礎知識:接口只能定義方法(只能定義行為,不能定義實現也就是字段),因為事件、索引器、屬性本質上都是方法,所以接口中也可以定義事件、索引器、屬性。
10、abstract class和interface有什麼區別?
相同點:
都不能被直接實例化,都可以通過繼承實現其抽象方法。
不同點:
接口支持多繼承;抽象類不能實現多繼承。
接口只能定義行為;抽象類既可以定義行為,還可能提供實現。
接口只包含方法(Method)、屬性(Property)、索引器(Index)、事件(Event)的簽名,但不能定義字段和包含實現的方法;
抽象類可以定義字段、屬性、包含有實現的方法。
接口可以作用於值類型(Struct)和引用類型(Class);抽象類只能作用於引用類型。例如,Struct就可以繼承接口,而不能繼承類。
加分的補充回答:講設計模式的時候SettingsProvider的例子。