1,什麼是強型別,什麼是若類型?
強若類型是指類型檢查的嚴格程度,語言有無類型、弱類型和強型別三種。無類型的語言不檢查且不區分指令和資料;若類型的語言檢查很弱,僅能嚴格區分指令和資料;強型別語言則嚴格地在編譯的時候進行檢查。例如,C語言和JavaScript是若類型語言,Java和C#是強型別語言。
技巧提示:編寫簡單小應用,使用弱類型語言可以節省代碼量,有更高的開發效率;而對於構建大型項目,使用強型別語言會更加規範可靠。
2,為什麼在C#中我們不擔心記憶體漏洞?
解析:考察C#的記憶體管理機制。C#採用記憶體回收機制來管理記憶體,當程式運行時,垃圾收集器在記憶體中建立一個託管堆,每使用一次new運算子,運行庫就在上一個對象之後為建立的對象在託管堆中分配一個記憶體空間,垃圾收集器儲存了一個指標,該指標始終指向最後一個對象的記憶體空間。當該指標指向託管堆以外的空間時,就需要對該託管堆中的無用記憶體進行回收,此時假設隊中的所有的對象都需要回收。
說明:記憶體回收機制是C#相對於C和C++的一大優點,它不需要程式員顯示地刪除動態分配給堆的記憶體。
GC 是垃圾收集器,C#程式員不用擔心記憶體管理,因為垃圾收集器會自行進行管理。如果要請求垃圾收集,可以使用下面的方法之一:
System.gc()
Runtime.getRuntime().gc()
3,談談final,finally和finalize的區別
final是一個修飾符,如果一個類被聲明為final,意味著它不能再派生出新的子類,不能作為父類被繼承;而如果將變數或方法聲明為final,可以保證它們在使用中不被改變。被聲明為final的變數必須在聲名時給定初值,而在以後的引用中只能讀取,不可修改;被聲明為final的方法同樣也只能使用,不能重載。
finally用來在異常處理時執行任何任何清除操作,如果拋出一個異常,那麼相匹配的catch子句就會執行,然後控制就會進入finally塊(如果有的話)。
finalize(_)是一個方法名,是在垃圾收集器刪除對象之前對這個對象調用的,它是Object類中定義的,因此所有的類都繼承了它。子類覆蓋finalize()方法以整理系統資源或者執行其它清理工作。
4,const和readonly有什麼區別?
C#定義了兩種類型的常量,一種用const關鍵字聲明,一種用readonly關鍵字聲明。用const聲明的是真正的常量,而用readonly聲明的實際上是“唯讀變數”。const聲明的變數在編譯時間進行設定並且設定後就永遠不能改變,此時編譯器會把所有的const常量全部替換為常數;而readonly聲明的常量是在程式運行期間初始化,該操作只能進行一次。另外,const常量只能在聲明中賦值,readonly常量的初始化既可以在聲明中進行,也可以在建構函式中進行,使用建構函式,readonly欄位可被賦予不同的值。
總之,const關鍵字用來聲明編譯時間的常量,readonly用來聲明運行是常量。
5,參考型別何止類型的區別?
C#中的資料類型有兩種,分別是實值型別和參考型別,二者的差異在於資料的儲存方式,實值型別直接儲存資料;而參考型別則儲存實際資料的引用,程式通過此引用找到真正的資料,因此參考型別的變數通常也叫做對象。對於實值型別,由於每個變數都有自己的值,所以對一個變數的操作不會影響另一個變數;而對於參考型別來說,兩個或多個參考型別的變數引用同一個對象,實際上是指這些變數在堆棧中儲存的堆地址相同,因此對一個變數的操作會影響到引用相同對象的另一個變數。
技巧:實值型別變數聲明初始化後即可訪問,參考型別變數必須先使用new關鍵字為其聲明的變數分配記憶體後方可訪問。
參考型別儲存在堆上,包含一個指向執行個體的指標,預設值為null;實值型別儲存在堆上,儲存的是一個實際的值。未賦值前不同實值型別有不同的預設值但不可為空。
6,簡述堆和棧的區別?
棧是由編譯器自動分配,釋放的,在方法體中定義的變數通常在棧上。堆一般由程式員分配釋放,用new運算子等分配記憶體方法分配得到的就是在堆上。棧是機器系統提供的資料結構,而堆是C/C++函數提供的,他們的區別如下:
棧是系統提供的功能,特點是快速高效,缺點是有限制,資料不靈活;而堆是函數庫提供的功能。特點是靈活方便,資料適應面廣泛,但是效率有一定降低。
棧是系統資料結構,對於進程或線程式唯一的;而堆是函數庫內部的結構,不一定唯一,不同的堆分配的記憶體無法相互操作。
棧空間分靜態分配和動態分配兩種,其中,靜態分配是編譯器完成的,比如自動變數的分配;而動態分配是由啊alloca()函數完成的,棧的動態分配無需釋放,但為了可移植的程式,棧的動態分配操作是不鼓勵的。堆空間的分配總是動態。
答案:棧是編譯期間就分配好記憶體空間,因此代碼中必須就棧的大小明確定義;堆是程式運行期間動態分配記憶體空間,可以根據程式的運行情況確定要分配的堆的大小。
7,簡述枚舉的作用?
枚舉通常用於定義多個常量,這些常量公用一種基本的資料類型,該類型在定義是由冒號來指定。
答案:枚舉可以避免不合理的賦值,它表示一組有限的值,對可能的值進行約束,是代碼更清晰。並且允許使用描述性的名稱表示資料,使用時直觀方便。
待續....