天天看點

.NET測試

1.說明值類型與引用類型的差別?

值類型:

①存儲在棧中,調用速度快

②派生自System.ValueType 

③直接存儲的是資料值

④記憶體由系統進行自動釋放

⑤值類型包含結構體(數值類型、bool型、使用者定義的結構體),枚舉,可空類型

引用類型

①存儲在堆中,調用速度慢

②派生自System.Object

③存儲對其值的引用位置

④記憶體由GC來自動釋放

⑤引用類型包含:class、數組、interface 或 delegate、object、string 和 dynamic

2.簡述c#通路修飾符的作用?

public(公開的)    

所有類的類成員    

通路權限:不受任何限制

private(私有的)    

所有類或類成員使用    

通路權限:隻能在本類中通路

protected(受保護的)    

應用給類和内嵌類的所有成員    

通路權限:目前類及子類

internal    

應用給類和内嵌類的所有成員    

通路權限: 應用于同一程式集中

internal protected/    protected internal

應用給類和内嵌類的所有成員    

通路權限:應用于同一程式集和子類中

3.ADO.NET的五個主要對象?

DataConnection:連接配接資料庫

DataCommand:對資料庫執行指令操作

DataReader:隻需要循序的讀取資料而不需要其他操作

DataAdapter:擴充卡,在資料源和DataSet之間執行資料傳輸工作

DataSet:資料存儲器,視為一個暫存區,可以把從資料庫中所查詢到的資料保留起來

4.c#中的委托是什麼?事件是不是委托?事件和委托的關系?

委托是一個類,它定義了方法的類型,使得可以将方法作為另一個方法的參數進行傳遞。

事件是一種引用類型,實際上是一種特殊的委托,事件是對委托的高度封裝

5.重寫和重載,ref和out的差別是什麼?

重載:方法名相同,參數清單不同(參數個數,參數類型)

重寫:當一個子類繼承一個父類,而子類中的方法與父類中的方法名,參數個數,參數類型都完全一緻時,就稱子類中的這個方法重寫了父類中的這個方法。

差別:重載編譯時多态,重寫運作時多态,重載不需要繼承,重寫必須繼承

ref(引用傳參)和out(輸出參數)的差別:

相同點:

(1)兩者都是用來修飾參數

(2)在定義和調用方法是都必須帶上各自的關鍵字ref或out

不同點:

(1)ref必須在調用前進行初始化,而out必須在方法體内進行初始化

(2)ref有進有出,out隻出不進

(3)ref則用在需要被調用的方法修改調用者的引用的時候,而 out适合用在需要retrun多個傳回值的地方

6.c#中的索引器是否隻能根據數字進行索引?是否允許多個索引器參數?

索引器不隻是根據數字進行索引的,參數的個數和類型都是任意的。

索引可以有多個參數,參數類型任意

7.屬性和public字段的差別是什麼?調用set設定的一個屬性值,使用get方法讀取到的值一定是set設定進去的嗎?

屬性可以對設定值、擷取值的過程進行非法值控制,比如年齡禁止設值負數,而字段則不能進行這樣的設定。

雖然一般情況下get讀取的值就是set設定的值,但是可以讓get讀取的值不是set設定的值的。

8.簡述拆箱和裝箱?

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

String i=

"abc"

;

object

obj=(

object

)i;

拆箱:從引用類型轉換到值類型, 前提是裝箱

object

obj=

"abc"

;

string

i=(

string

)obj;

9.CTS,CLS,CLR分别代表什麼?作用是什麼?

CTS:通用類型系統,一種确定公共語言運作庫如何定義、使用和管理類型的規範。

CLS:公共語言規範,是CLR定義的語言特性集合,公共語言規範是一組限制和構造,它充當庫編寫器和編譯器的向導。

CLR:公共語言運作時,用于編碼MSIL的代碼,主要在.NET的背景環境下運作。

10.類和結構的差別?

同:

類與結構都可以執行個體化

異:

類是引用類型,結構是值類型

類有預設的構造函數和析構函數,結構不能聲明預設的構造函數

結構沒有析構函數

結構不支援繼承

結構的執行個體化可以不使用new

結構可以聲明構造函數,但必須帶參數

11.接口和類的差別?抽象和虛拟的差別?

接口和類的差別

同:

接口和類都可以從多個接口繼承

接口和類都可以包含事件,方法,屬性…

異:

類中可以有字段,接口中不能有字段

類中有構造函數和析構函數,接口中沒有構造函數和析構函數

類中可以定義具體的方法和實作,接口中隻能聲明方法,不能實作方法

類可以執行個體化,接口不能執行個體化

類可以繼承多個接口,但隻能繼承一個類

接口成員一定要是公開的,不能是靜态和虛拟的,類不限制

抽象和虛拟的差別

同:

抽象方法和虛拟方法都用重寫

異:

抽象方法,子類必須實作;虛拟方法,子類可以重寫,也可以不重寫

抽象方法隻能聲明,不能實作;虛拟方法有聲明有實作

抽象類不能執行個體化;包含虛拟方法的類可以執行個體化

12.String和stringBuilder的差別?

string是String的别名,它是不可變的,每次指派都會重新配置設定記憶體空間,String類來自于System.Object,不能使用new string()來構造一個string對象。

StringBuilder是可變的,當長度超過時,StringBuilder 将自動建立一個更長的數組,把原來的資料複制到新數組中,來自于 System.Text,可以執行個體化,支援空參。

13.DataReader和DataSet的差別?

DataReader 為線上操作資料, DataReader會一直占用SqlConnection連接配接,在其獲得資料過程中其它操作不可以再使用SqlConnection連接配接對象。

DataSet 為離線操作資料,DataSet會将資料一次性讀入記憶體,然後斷開連接配接,這時其它操作就可以使用SqlConnection連接配接對象。

DataReader在擷取資料時不能關閉連接配接。

DataSet可以關閉連接配接。

DataReader讀取速度快于DataSet。

DataReader一次隻讀取一行資料,是以占用記憶體較小。DataReader為隻進且隻讀的,也就是隻能單方向向前讀取,如果你想回頭去讀取上一條資料是不允許的,并且不允許其修改資料。

DataSet一次性讀取所有資料,是以比較消耗資源,但也提高了靈活性,在斷開資料庫連接配接情況下你可以對資料進行任何增删改查,按照任意的順序讀取資料,并可以将其寫回到資料庫。

14.簡述單例模式的作用?

封裝了唯一性,可嚴格控制客戶怎樣通路及何時通路,記憶體中隻有一個對象,可節約系統資源,提高系統性能。

實作:構造函數私有化,使用一個公開靜态方法,使用一個靜态屬性進行判斷目前視窗是否被建立,重寫方法

15.c#中怎樣進行異常捕獲?

try…catch…catch…finally

發生錯誤時,層層上抛,隻帶找到比對的catch為止

try:将預計可能引發異常的代碼包含在try中

catch:發生異常,轉入catch

finally:無論有沒有發生異常,它總會在這個異常處理結構的最後運作

16.SQL資料庫中的三大範式是什麼?

第一範式:字段不能有備援資訊,所有字段都是必不可少的。

第二範式:滿足第一範式并且表必須有主鍵。

第三範式:滿足第二範式并且表引用其他的表必須通過主鍵引用。

17.SQL注入是什麼?如何防止?

sql注入是利用現有應用程式,将惡意的sql指令注入到背景資料庫執行的一種惡意的操作

使用參數化的SQL就可以避免SQL注入

18.資料完整性包括哪些方面?

資料完整性指存儲在資料庫中資料正确的正确性,有效性和一緻性

實體完整性:要求每一張表中的主鍵字段不能為空或重複。實體完整性指表中行的完整性,要求表中的所有行都有唯一辨別符(主關鍵字),主關鍵字是否可以被修改或整個列是否可以被删除取決于主關鍵字與其他表之間要求的完整性

區域完整性:它為列或列組指定一個有效的集,并确定該列是否為空,要求向表中指定列中輸入的資料必須是正确的資料類型,格式及有效的資料範圍

參照完整性:指作用于兩張或兩張以上的表,通過使用主鍵和外鍵或主鍵和唯一鍵的關系,使表中的鍵值在所有表中保持一緻性

19.簡述SQL中的左聯接和右聯接查詢?

左聯接:如果左表的某一行在右表中沒有比對行,則在關聯的結果集行中,來自右表的所有選擇清單列均為空值。

右聯接:将傳回右表的所有行。如果右表的某一行在左表中沒有比對行,則将為左表傳回空值。

20.事務,視圖和索引有什麼作用?

事務是指一個工作單元,它包含了一組資料操作指令,并且所有的指令作為一個整體一起向系統送出或撤消請求操作,即這組指令要麼都執行,要麼都不執行。

視圖是從一張或多張表中導出的一張虛拟表,虛拟表具有和實體表相同的功能,可以對虛拟表進行增删改查操作。

索引是為了加速對表中的資料行的檢索而建立的一種分散存儲結構,相當于書的目錄。

21.使用SQL語句查詢第30條到第40條資料(資料可能不連續)

SELECT TOP 5 * FROM A WHERE ID > (SELECT MAX(ID) FROM A WHERE ID IN(SELECT TOP 10 ID FROM A ORDER BY ID ASC))

SELECT TOP 5 * FROM A WHERE ID NOT IN (SELECT TOP 10 ID FROM A ORDER BY ID ASC)

22.數組和泛型集合的差別是什麼?

數組是一個存儲相同類型元素的固定大小的順序集合。         

差別:

①數組定長,占用記憶體少,周遊速度快;

②集合不定長,占用記憶體多,周遊速度慢;

③數組存放類型隻能是一種,集合可以不是一種;

④在功能上,數組能實作的所有功能,集合都能實作;反之,集合能實作的某些功能,數組難以實作。

23.較長的描述T-SQL語言包含哪三種常用語言?

①、資料操縱語言(DML):SQL允許使用者或應用程式通過添加新資料、删除舊資料和修改以前存儲的資料對資料庫進行更新,用來操縱資料庫資料指令。

②、資料定義語言(DDL):SQL讓使用者定義存儲資料的結構群組織,以及資料項之間的關系。用來建立資料庫、資料庫對象和定義列指令。

③、資料控制語言(DCL):可以使用SQL來限制使用者檢索、添加和修改資料的能力,保護存儲的資料不被未授權的使用者所通路,用來控制資料庫元件存取、權限等指令。

24.請描述Socket進行同步通訊程式設計的詳細步驟?

伺服器端:

第一步:建立一個用于監聽連接配接的Socket對象;

第二步:用指定的端口号和伺服器的ip建立一個EndPoint對象;

第三步:用socket對象的Bind()方法綁定EndPoint;

第四步:用socket對象的Listen()方法開始監聽;

第五步:接收到用戶端的連接配接,用socket對象的Accept()方法建立一個新的用于和用戶端進行通信的socket對象;

第六步:通信結束後一定記得關閉socket;

用戶端:

第一步:建立一個Socket對象;

第二步:用指定的端口号和伺服器的ip建立一個EndPoint對象;

第三步:用socket對象的Connect()方法以上面建立的EndPoint對象做為參數,向伺服器發出連接配接請求;

第四步:如果連接配接成功,就用socket對象的Send()方法向伺服器發送資訊;

第五步:用socket對象的Receive()方法接受伺服器發來的資訊 ;

第六步:通信結束後一定記得關閉socket;

25.詳細說明三層架構?

資料通路層,業務層,表示層。

資料通路層(DAL)主要是存放對資料類的通路,即對資料庫的添加、删除、修改、更新等基本操作

業務邏輯層(BLL)對傳送資料進行邏輯判斷分折,并進行傳送正确的值。

表示層(UI)為了與使用者互動的界面。

UI–BLL–DAL–BLL–UI

三層架構的優點:

①開發人員可以隻關注結構中的某一層

②可以輕易用新的實作來替換原有層次的實作

③降低層與層之間的依賴

④有利于标準化

⑤有利于各層邏輯的複用

⑥結構更明确

⑦降低維護成本和維護時間

26.存儲過程作用是什麼?

①加快系統的運作速度

②封裝複雜操作

③實作代碼重用

④增強安全性

⑤減少網絡流量

27.JS基本資料類型是什麼?

JS基本資料類型分為兩大類:簡單資料類型和複雜資料類型

簡單資料類型:數字類型(Number),字元串類型(String),布爾類型(bool)

複雜資料類型:空類型(null),未定義類型(undefined),對象類型(Object)

28.介紹” “,null,undefined的差別?

“ ”:是字元串類型的預設值,占用記憶體

null:null用來表示尚未存在的對象,常用來表示函數企圖傳回一個不存在的對象。轉換為值傳回0.

undefined:當聲明的變量還未被初始化時,變量的預設值為undefined。轉換為值傳回NAN

29.介紹post和get的差別?

相同點:都是送出表單的方式,通過用戶端一封包的形式送出給服務端

不同點:

post送出以封包頭的方式顯示到URL位址中,安全性較高

get送出以封包體的方式顯示到URL位址中,安全性低

30.簡述const和readonly的差別?

Readonly表示隻讀,定義的時候可以不用初始化,可以延遲到構造方法中進行初始化。

Const表示常量,定義的時候就要初始化。

Const預設是靜态的,Readonly如果設定為靜态就必須進行顯示聲明。

31.簡述B/S和C/S的差別?

.NET測試

32.使用算法實作冒泡排序?

int[] arr = new int[5] { 10, 6, 96, 25, 38 };
            for (int i = 0; i < arr.Length - 1; i++)
            {
                for (int j = 0; j < arr.Length - 1 - i; j++)
                {
                    if (arr[j] > arr[j + 1])
                    {
                        int temp;
                        temp = arr[j];
                        arr[j] = arr[j + 1];
                        arr[j + 1] = temp;
                    }
                }
            }
            for (int i = 0; i < arr.Length; i++)
            {
                Console.Write(arr[i] + ",");
            }
           

33.使用算法求出斐波那契數列?

static void Main(string[] args)
        {
            //斐波那契數列0,1,1,2,3,5,8,13,21.....
            Console.WriteLine("請輸入需要計算的斐波那契數列的位數");
            int i = int.Parse(Console.ReadLine());
            int result = GetRes(i);
            Console.WriteLine("求出斐波那契數列第{0}位是{1}",i,result);
            Console.ReadLine();
        }
        static int GetRes(int i)
        {
            int res = 0;
            if (i==1)
            {
                res = 0;
            }
            else if (i==2)
            {
                res = 1;
            }
            else
            {
                res = GetRes(i - 1) + GetRes(i - 2);
            }
            return res;
        }
           

34.使用算法實作從一個數組中求出不重複數字的個數?

int[] array1 = new int[] {1,2,3,4,5,2,3,4,5,6,7,8,2,5,9};
            int length = array1.Length;
            for (int i = 0; i < array1.Length-1; i++)
            {
                for (int j = i+1; j < array1.Length; j++)
                {
                    int num = array1[i];
                    if (array1[j]==num)
                    {
                        //如果出現重複,數組長度-1
                        length--;
                        i++;
                    }
                }
            }
            Console.WriteLine("不重複的數字總個數為:" + length);
           

繼續閱讀