1. 程式人生 > >.NET筆試題集(一)

.NET筆試題集(一)

table 分開 裏的 積累 run control scalar forever 類定義

題目來源於傳智播客和各大互聯網,復習、重新整理貼出來。

1、簡述 private、 protected、 public、 internal、protected internal 訪問修飾符和訪問權限

private : 私有成員, 在類的內部才可以訪問。

protected : 保護成員,該類內部和繼承類中可以訪問。

public : 公共成員,完全公開,沒有訪問限制。

internal: 當前程序集內可以訪問。

protected internal: 訪問僅限於當前程序集或從包含類派生的類型。

不帶修飾符的類是默認internal。

2、簡述abstract、sealed類修飾符

abstract:

可以被指示一個類只能作為其它類的基類。

sealed:指示一個類不能被繼承。

3、簡述C#成員修飾符

abstract:指示該方法或屬性沒有實現。

const:指定域或局部變量的值不能被改動。

event:聲明一個事件。

extern:指示方法在外部實現。

override:對由基類繼承成員的新實現。

readonly:指示一個域只能在聲明時以及相同類的內部被賦值。

static:指示一個成員屬於類型本身,而不是屬於特定的對象。

virtual:指示一個方法或存取器的實現可以在繼承類中被覆蓋。

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

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

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

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 對象操作數據結果。

5、列舉ASP.NET 頁面之間傳遞值的幾種方式和優缺點

1.使用QueryString, 如....?id=1; response. Redirect(): 傳遞的參數會顯示在url中,不安全並且不能傳遞數組或對象。

2.使用Session變量:簡單,但易丟失 作用於用戶個人,過量的存儲會導致服務器內存資源的耗盡。

3.使用Server.Transfer:流程從當前頁面引導到另一個頁面中,新的頁面使用前一個頁面的應答流,數據庫穩定,安全,但性能相對弱。

4.Cookie傳值:簡單,但可能不支持,可能被偽造 Cookie是存放在客戶端的,而session是存放在服務器端的。而且Cookie的使用要配合ASP.NET內置對象Request來使用

5.Application傳值:對象的作用範圍是整個全局,也就是說對所有用戶都有效。其常用的方法用Lock和UnLock

6.PreviosPage:這個一般比較少用。

Server.Transfer和Response.Redirect的區別:Server.Transfer是服務器內部的轉接,瀏覽器不知道;Response.Redirect是有瀏覽器參與的,所以在地址欄中可以看到地址的變化。

6、C#中的委托是什麽?事件是不是一種委托?事件和委托的關系

委托可以把一個方法作為參數代入另一個方法。

委托可以理解為指向一個函數的指針。

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

7、重寫(override)與重載(overload)的區別

override 是進行基類中函數的重寫。override是面向對象的概念。override 方法提供從基類繼承的成員的新實現。通過 override 聲明重寫的方法稱為重寫基方法。重寫的基方法必須與 override 方法具有相同的簽名

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

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

參數的個數和類型都是任意的。用reflector反編譯可以看出,索引器的內部本質上就是set_item、get_item方法。

9、屬性和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;
                }
            }
        }
        static void Main(string[] args)
        {
            Person p1 = new Person();
            p1.Age = 30;
            p1.Age++;
            Console.Write(p1.Age);//輸出3
       Console.ReadKey(); }
技術分享 技術分享

10、三層架構

通常意義上的三層架構就是將整個業務應用劃分為:表現層(UI)、業務邏輯層(BLL)、數據訪問層(DAL)。

區分層次的目的即為了“高內聚,低耦合”的思想。

表現層(UI):通俗講就是展現給用戶的界面,即用戶在使用一個系統的時候的所見所得。

業務邏輯層(BLL):針對具體問題的操作,也可以說是對數據層的操作,對數據業務邏輯處理。

數據訪問層(DAL):該層所做事務直接操作數據庫,針對數據的增添、刪除、修改、更新、查找等每層之間是一種垂直的關系。

三層結構是N層結構的一種,一般來說,層次之間是向下依賴的,下層代碼未確定其接口(契約)前,上層代碼是無法開發的,下層代碼接口(契約)的變化將使上層的代碼一起變化。

優點: 分工明確,條理清晰,易於調試,而且具有可擴展性。

缺點: 增加成本。

11、MVC模式

MVC(Model View Controller)模型-視圖-控制器

aspx就是View,視圖;Model:DataSet、Reader、對象;Controller:cs代碼。

MVC是典型的平行關系,沒有說誰在上誰在下的關系,模型負責業務領域的事情,視圖負責顯示的事情,控制器把數據讀取出來填充模型後把模型交給視圖去處理。而各種驗證什麽的應該是在模型裏處理了。它強制性的使應用程序的輸入、處理和輸出分開。MVC最大的好處是將邏輯和頁面分離。

12、什麽是裝箱(boxing)和拆箱(unboxing)?

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

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

object obj = null;//引用類型

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

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

13、什麽叫應用程序域(AppDomain)

一種邊界,它由公共語言運行庫圍繞同一應用程序範圍內創建的對象建立(即,從應用程序入口點開始,沿著對象激活的序列的任何位置)。

應用程序域有助於將在一個應用程序中創建的對象與在其他應用程序中創建的對象隔離,以使運行時行為可以預知。

在一個單獨的進程中可以存在多個應用程序域。應用程序域可以理解為一種輕量級進程。起到安全的作用。占用資源小。

14、CTS、CLS、CLR分別作何解釋

CTS:Common Type System 通用系統類型。Int32、Int16→int、String→string、Boolean→bool

CLS:Common Language Specification 通用語言規範。不同語言語法的不同。

CLR:Common Language Runtime 公共語言運行時,就是.Net提供的那些類

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

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

Struct屬於值類型,是分配在內存的棧上的。結構體是復制傳遞的。

16、堆和棧的區別?

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

堆是程序運行期間動態分配的內存空間,你可以根據程序的運行情況確定要分配的堆內存的大小。

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

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

18、GC是什麽? 為什麽要有GC?

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

要請求垃圾收集,可以調用下面的方法:GC.Collection()一般不需要手動調用GC.Collection()。

19、String s = new String("xyz");創建了幾個String Object?

兩個對象,一個是“xyz”,一個是指向“xyz”的引用對象。

20、值類型和引用類型的區別?

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

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

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

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

21、C#中的接口和類有什麽異同。

不同點:

不能直接實例化接口。

接口不包含方法的實現。

接口可以多繼承,類只能單繼承。

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

相同點:

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

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

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

22、abstract class和interface有什麽區別?

相同點:

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

不同點:

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

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

接口可以用於支持回調(CallBack);抽象類不能實現回調,因為繼承不支持。

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

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

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

23、是否可以繼承String類?

String類是sealed類故不可以繼承。

24、try {}裏有一個return語句,那麽緊跟在這個try後的finally {}裏的code會不會被執行,什麽時候被執行?

會執行,在return前執行。

技術分享 技術分享
public int QueryCount()
{
  try
  {
    return cmd.ExecuteScalar();
  }
  finally
  {
    cmd.Dispose();
  }
}
技術分享 技術分享

如果C#設計的是先執行cmd.Dispose()再執行return就會出現return執行失敗了,因為cmd已經Dispose了。

25、new 關鍵字用法

new 運算符 用於創建對象和調用構造函數。

new 修飾符 用於向基類成員隱藏繼承成員。

new 約束 用於在泛型聲明中約束可能用作類型參數的參數的類型。

26、如何把一個Array復制到ArrayList裏

實現1 string[] s ={ "111", "22222" }; ArrayList list = new ArrayList(); list.AddRange(s);

實現2 string[] s ={ "111", "22222" }; ArrayList list = new ArrayList(s);

27、描述線程與進程的區別?

1.線程(Thread)與進程(Process)二者都定義了某種邊界,不同的是進程定義的是應用程序與應用程序之間的邊界,不同的進程之間不能共享代碼和數據空間,而線程定義的是代碼執行堆棧和執行上下文的邊界。

2.一個進程可以包括若幹個線程,同時創建多個線程來完成某項任務,便是多線程。而同一進程中的不同線程共享代碼和數據空間。用一個比喻來說,如果一個家庭代表一個進程,在家庭內部,各個成員就是線程,家庭中的每個成員都有義務對家庭的財富進行積累,同時也有權利對家庭財富進行消費,當面對一個任務的時候,家庭也可以派出幾個成員來協同完成,而家庭之外的人則沒有辦法直接消費不屬於自己家庭的財產。

28、什麽是強類型,什麽是弱類型?哪種更好些?為什麽?

C#中

int i=3;

i="a";

不可以

JavaScript中

var i=3;

i="a";

可以

強類型是在編譯的時候就確定類型的數據,在執行時類型不能更改,而弱類型在執行的時候才會確定類型。

沒有好不好,二者各有好處,強類型安全,因為它事先已經確定好了,而且效率高。弱類型更靈活,但是效率低,而且出錯概率高

一般用於編譯型編程語言,如c++,java,c#,pascal等,弱類型相比而言不安全,在運行的時候容易出現錯誤,但它靈活,多用於解釋型編程語言,如javascript,vb等

29、什麽是反射?

程序集包含模塊,而模塊又包括類型,類型下有成員,反射就是管理程序集,模塊,類型的對象,它能夠動態的創建類型的實例,設置現有對象的類型或者獲取現有對象的類型,能調用類型的方法和訪問類型的字段屬性。它是在運行時創建和使用類型實例。

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

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

.NET筆試題集(一)