一、簡答題
1.簡述C#中的所有通路修飾符及通路權限
private(私有的)
給類,及所有類成員使用
所有類成員的預設通路修飾符
可通路範圍
目前類自身
public(公開的)
給類,及所有類成員使用
可通路範圍
目前類自身
所有的子類
同一程式集其他類通過執行個體化也可以通路
其他程式集中的類也可以執行個體化通路
protected(受保護的)
類,内嵌類的所有成員
類的預設通路修飾符
可通路範圍
目前類自身
所有的子類可以通路
同一程式集其他類不可以通路
其他程式集中可以通過繼承也可以通路
internal
類,内嵌類的所有成員
可通路範圍
目前類自身
同一程式集的其他類可以通過執行個體化通路
同一程式集中的子類也可以通路
其他程式集中不管是不是子類都無法通路
internal protected
類,及内嵌類的所有成員
可通路範圍
目前類自身
同一程式集的其他類可以通過執行個體化進行通路
所有子類可以通路
其他程式集中可以通過繼承進行通路,但執行個體化不行
2.簡單介紹方法的重載和重寫
重寫:當一個子類繼承一父類,而子類中的方法與父類中的方法的名稱,參數個數、類型都完全一緻時,就稱子類中的這個方法重寫了父類中的方法。
重載:一個類中的方法與另一個方法同名,但是參數表不同,這種方法稱之為重載方法。
3.方法中的ref參數和out、參數的用法是什麼
①、ref的使用:使用ref進行參數的傳遞時,該參數在建立時,必須設定其初始值,且ref側重于修改;
②、out的使用:采用out參數傳遞時,該參數在建立時,可以不設定初始值,但是在方法中必須初始化,out側重于輸出;
ref是有進有出,而out是隻出不進。
4.簡單介紹數組和集合的差別
①、數組聲明了元素的類型,集合不聲明
②、數組是靜态的,有固定大小,建立了就無法改變容量,而集合是動态擴充容量,可以根據需要改變大小.
③、數組存放類型隻能是一種,集合可以不是一種
5.簡單介紹C#類中的兩個特殊函數
構造函數
構造函數又叫構造方法,它是一種特殊的成員函數,它主要用于為對象配置設定存儲空間,對資料成員進行初始化(對類進行初始化)。
如果類中沒有聲明構造函數,那麼系統會自動生成一個構造函數,如果聲明了構造函數,那麼系統将不會再理會,構造函數可以重載
析構函數
析構函數是實作銷毀一個類的執行個體的方法成員。析構函數不能有參數,當類生成的對象被釋放時自動生成的函數
6.簡單介紹static靜态的用法、特性
用法:
①、Static可以修飾類,使類成為靜态類。這樣在此類中隻能定義靜态的方法和靜态的變量。
②、static可以修飾變量,這個變量隻能是成員變量,不能是局部的。
既不能修飾方法體中的變量,以及形式參數。
③、static可以修飾方法,Main方法必須用static修飾,因為它是與程式共存亡的,是程式的入口和結束的大門。
特性:
①、隻會在編譯時配置設定空間,程式真正執行時,是不會重新配置設定空間的.
②、值能變,但是其指向位址不會變
③、用static聲明了的變量不會被GC(辣雞回收機制)所回收. 是以使用時需要注意.
7.C#中的委托是什麼?事件是不是委托?
委托是一種在對象裡儲存方法引用的類型,同時也是一種類型安全的函數指針。把一個方法作為參數帶入另一個方法
事件是一種特殊的委托。
8.C#中類(class)與結構(struct)的異同
①、值類型與引用類型
結構Struct是值類型:值類型在堆棧上配置設定位址,所有的基類型都是結構類型,例如:int 對應System.int32 結構,string 對應 system.string 結構 ,通過使用結構可以建立更多的值類型。
類Class是引用類型:引用類型在堆上配置設定位址。
結構是值類型是以結構之間的指派可以建立新的結構,而類是引用類型,類之間的指派隻是複制引用。
②、繼承性
結構:不能從另外一個結構或者類繼承,本身也不能被繼承,雖然結構沒有明确的用sealed聲明,可是結構是隐式的sealed .
類:完全可擴充的,除非顯示的聲明sealed 否則類可以繼承其他類和接口,自身也能被繼承
③、内部結構:
結構:
沒有預設的構造函數,但是可以添加構造函數
沒有析構函數
沒有 abstract 和 sealed(因為不能繼承)
不能有protected 修飾符
可以不使用new 初始化
類:
有預設的構造函數
有析構函數
可以使用 abstract 和 sealed
有protected 修飾符
必須使用new 初始化
同:
①、雖然結構與類的類型不一樣,可是他們的基類型都是對象(object),c#中所有類型的基類型都是object
②、雖然結構的初始化也使用了New 操作符可是結構對象依然配置設定在堆棧上而不是堆上,
9.介紹C#的String和StringBuilder的用法
string是個基礎類型,每次指派都會重新配置設定記憶體空間,string是對System.String命名空間起的一個名字。String類有不可改變性,每次執行字元操作時,都會建立一個新的String對象。
StringBuilder:使用前先進行執行個體化,支援空參數構造,在對象執行個體化後就不再重新配置設定記憶體。StringBuilder是由Char數組構成的。建構新的StringBuilder時能設定容量大小,當添加字元串,超過已配置設定的數組大小時,就會建立一個新的數組,此時容量會翻倍,舊空間自動銷毀。
10.抽象和虛拟的差別 【virtual(虛拟函數)、abstract(抽象函數)】
①、virtual修飾的方法必須有實作,而abstract修飾的方法一定不能實作。
②、virtual可以被子類重寫,而abstract必須被子類重寫。
③、如果類成員被abstract修飾,則該類前必須添加abstract,因為隻有抽象類才可以有抽象方法。
④、無法建立abstract類的執行個體,隻能被繼承無法執行個體化,比如: BaseTest2 base2 = new BaseTest2();将出現編譯錯誤:抽象類或接口不能建立執行個體。
⑤、C#中如果要在子類中重寫方法,必須在父類方法前加virtual,在子類方法前添加override,這樣就避免了程式員在子類中不小心重寫了父類方法。
⑥、abstract方法必須重寫,virtual方法必須有實作
11.C#中的接口和類有什麼異同?
不同點:
不能直接執行個體化接口。
接口不包含方法的實作。
接口可以多繼承,類隻能單繼承。
類定義可以在不同的源檔案之間進行拆分。
相同點:
接口、類和結構都可以從多個接口繼承。
接口類似于抽象基類:繼承接口的任何非抽象類型都必須實作接口的所有成員。
接口和類都可以包含事件、索引器、屬性。
12.程序和線程的差別是什麼?
①、線程作為排程和配置設定的基本機關,程序作為擁有資源的基本機關
②、不僅程序之間可以并發執行,同一個程序的多個線程之間也可并發執行
③、程序是擁有資源的一個獨立機關,線程不擁有系統資源,但可以通路隸屬于程序的資源.
④、在建立或撤消程序時,由于系統都要為之配置設定和回收資源,導緻系統的開銷明顯大于建立或撤消線程時的開銷。
13.請詳述C#中的繼承問題
①、子承父業:
子類會繼承父類的屬性,構造,行為
②、父親具有的,兒子不一定具有,子類具有的,父類也不一定具有
當父類隻有帶參構造,子類自動會要有帶參構造
③、C#不支援多重繼承,但是可以多重接口繼承
④、關鍵字this:目前類自己,base:代表目前類的親父類
⑤、執行個體化過程(對象建立過程,先調用的最終父類的構造函數然後依次往下調用目前類)
⑥、析構過程(對象銷毀的過程,從自己開始銷毀直到最終父類)
14.簡單介紹break,continue,return的差別
return:跳出目前循環,直到代碼塊結束
break:隻跳出目前循環,執行代碼之後的代碼
continue:隻跳出目前本次循環,執行下一次循環
15.簡單描述Socket通信TCP協定的三次握手的作用
三次握手的目的在于驗證伺服器浏覽器之間兩者的收,發功能是否正常。
①、保證用戶端能夠具有發送資料的能力
②、保證服務端能接收到資料,保證服務端能夠發送資料的能力
③、保證用戶端能夠接收到資料
16.按照步驟叙述建立Socket通信的服務端,用戶端的步驟
伺服器端:
第一步:建立一個用于監聽連接配接的Socket對像;
第二步:用指定的端口号和伺服器的ip建立一個EndPoint對像;
第三步:用socket對像的Bind()方法綁定EndPoint;
第四步:用socket對像的Listen()方法開始監聽;
第五步:接收到用戶端的連接配接,用socket對像的Accept()方法建立一個新的用于和用戶端進行通信的socket對像;
第六步:通信結束後一定記得關閉socket;
用戶端:
第一步:建立一個Socket對像;
第二步:用指定的端口号和伺服器的ip建立一個EndPoint對像;
第三步:用socket對像的Connect()方法以上面建立的EndPoint對像做為參數,向伺服器發出連接配接請求;
第四步:如果連接配接成功,就用socket對像的Send()方法向伺服器發送資訊;
第五步:用socket對像的Receive()方法接受伺服器發來的資訊 ;
第六步:通信結束後一定記得關閉socket;
二、算法
1.使用遞歸算法計算斐波那契數列
2.在1-20這20個數中求出7個不重複的随機數
————————————————