1. 程式人生 > 其它 >C#.NET面試題彙總系列一:基礎語法

C#.NET面試題彙總系列一:基礎語法

C#.NET面試題彙總系列一:基礎語法
0. 參考文件
1. .NET和C#有什麼區別?

.NET一般指 .NET FrameWork框架,它是一種平臺,一種技術

C#是一種程式語言,可以開發基於.NET平臺的應用

2. ASP.NET和ASP有什麼區別?

ASP.NET的指令碼是與HTML分離的,程式碼被編譯成了DLL,DLL可以在server端執行

ASP的指令碼是與HTML在一起的,每次都會進行解釋執行

3. string str=null和string str=""和string str=string.Empty的區別?

string.Empty相當於"",Empty是一個靜態只讀的欄位

string str="" 初始化物件,並分配一個空字串的記憶體空間,string str=null 初始化物件,不會分配記憶體空間

4. byte b = 'a'; byte c = 1; byte d = 'ab'; byte e = '啊'; byte g = 256; 這些變數有些錯誤是錯再哪裡?

1byte =8bit,1個漢字=2個byte,1個英文=1個byte=8bit

所以bc是對的,deg是錯的。'a'是char型別,a錯誤,java byte取值範圍是-128~127, 而C#裡一個byte是0~255

5. string和StringBuilder的區別,兩者效能的比較

相同點:都是引用型別,分配在堆上

不同點:string 物件時恆定不變的,stringBuider 物件表示的字串是可變的

stringBuilder 是.net 提供的動態建立 string 的高效方式,以克服 string 物件恆定性帶來的效能影響

對於簡單的字串連線操作,在效能上 stringBuilder 並不一定總是優於 string。因為 stringBuider 物件建立代價較大,在字串目標連線較少的情況下,過度濫用 stringBuilder 會導致效能的浪費,只有大量的或者無法預知次數的字串操作,才考慮 stringBuilder 來實現

事實上,一般連線次數設定 100 次以內,根本看不出兩者的效能差別

6. 什麼是擴充套件方法?

一句話解釋,擴充套件方法使你能夠向現有型別“新增”方法,無需修改型別

條件:1.必須要靜態類中的靜態方法,2.第一個引數的型別是要擴充套件的型別,並且需要新增this關鍵字

建議:通常,只在不得已的情況下才實現擴充套件方法,並謹慎的實現

使用:不能通過類名呼叫,直接使用型別來呼叫

7. byte a =255;a+=5;a的值是多少?

byte的取值範圍是-2的8次方至2的8次方-1,-256至255,a+=1時,a的值時0,a+=5時,a的值是4

8. 什麼是裝箱和拆箱?

裝箱就是隱式地將一個值型別轉換成引用型別,如:

int i=0;
Syste.Object obj=i;

拆箱就是將引用型別轉換成值型別,如:

int i=0;
System.Object obj=i;
int j=(int)obj;(將obj拆箱)

裝箱和取消裝箱過程需要進行大量的計算。對值型別進行裝箱時,必須分配並構造一個全新的物件。記憶體拷貝,從引用型別轉換成值型別,需要從堆拷貝到棧!處理器處理的事情多了,自然引發效能問題

9. 說說 123+”” 和 123.Tostring() 的區別

123+”” 由於涉及到不同的資料型別,數字需要通過裝箱操作轉化為引用型別才可以新增到字串中

使用值型別的ToString方法可以避免裝箱操作,從而提高應用程式效能

10. C#中,運算子“?”和“??”的區別是什麼?

int? x = null;//定義可空型別變數

i=3?2:5 //還可為三元運算子

int? y = x ?? 1000;//使用合併運算子,當變數x為null時,預設賦值1000

11. 值型別和引用型別的區別

值型別變數是直接包含值。將一個值型別變數賦給另一個值型別變數,是複製包含的值,預設值是0

引用型別變數的賦值只複製對物件的引用,而不復制物件本身,預設值是null

值型別儲存在棧中,引用型別儲存在堆中

12. 棧和堆的區別

比如:程式記憶體分割槽中的堆與棧,另外一種是資料結構中的

棧由作業系統自動分配釋放,無需手動控制;堆的申請和釋放工作手動控制,容易產生記憶體洩漏

堆:是無序的,是一片不連續的記憶體域,由使用者自己來控制和釋放,如果使用者自己不釋放的話,當記憶體達到一定的特定值時,通過垃圾回收器(GC)來回收

棧記憶體無需我們管理,也不受GC管理。當棧頂元素使用完畢,立馬釋放。而堆則需要GC清理

13. new關鍵字的作用?

運算子:建立物件例項,預設呼叫無參建構函式

修飾符:在派生類定義一個重名的方法,隱藏掉基類方法

約束:泛型約束定義,約束可使用的泛型型別,如

14. int?和int有什麼區別?

int?為可空型別,預設值可以是null

int預設值是0

int?是通過int裝箱為引用型別實現

15. C#中的委託是什麼?

一句話解釋就是:將方法當作引數傳入另一個方法的引數,本質是一個類

作用:提高方法的擴充套件性

.net中有很多常見的委託如:Func 、Action

16. 簡述Func與Action的區別?

Func是有返回值的委託,Action是沒有返回值的委託

17. 用最有效的方法算出2乘以8等於幾?

位運算是最快,使用的是位運算(邏輯左位移<<)

方法是2<<3相當於0000 0000 0000 0010 (2的16位int二進位制)左移三位就是 0000 0000 0001 0000(16的二進位制)

18. const和readonly有什麼區別?

都可以標識一個常量。主要有以下區別:

  • 初始化位置不同。const必須在宣告的同時賦值;readonly即可以在宣告處賦值,也可以在靜態構造方法(必須是靜態構造方法,普通構造方法不行)裡賦值
  • 修飾物件不同。const即可以修飾類的欄位,也可以修飾區域性變數;readonly只能修飾類的欄位
  • const是編譯時常量,在編譯時確定該值;readonly是執行時常量,在執行時確定該值
19. 判斷一個整數是否是2的N次方

取模運算: 用number%2==0可以判斷,但是這個有點低階

位運算:(使用位運算邏輯並,兩個位上的都為1才是1,其餘都是0,判斷是否等於0)

20. CTS、CLS、CLR分別作何解釋

CTS:通用語言系統。CLS:通用語言規範。CLR:公共語言執行庫

CTS:Common Type System 通用型別系統。Int32、Int16→int、String→string、Boolean→bool。每種語言都定義了自己的型別,.Net通過CTS提供了公共的型別,然後翻譯生成對應的.Net型別

CLS:Common Language Specification 通用語言規範。不同語言語法的不同。每種語言都有自己的語法,.Net通過CLS提供了公共的語法,然後不同語言翻譯生成對應的.Net語法

CLR:Common Language Runtime 公共語言執行時,就是GC、JIT等這些。有不同的CLR,比如伺服器CLR、Linux CLR(Mono)、Silverlight CLR(CoreCLR)。相當於一個發動機,負責執行IL

21. 在.net中,配件的意思是?

程式集(中間語言,源資料,資源,裝配清單)

22. Strings = new String(“xyz”);建立了幾個 String 物件?

兩個物件,一個是“xyz”,一個是指向“xyz”的引用物件 s

23. 靜態成員和非靜態成員的區別
  • 靜態成員用statis修飾符宣告,在類被例項化時建立,通過類進行訪問
  • 不帶statis的變數時非靜態變數,在物件被例項化時建立,通過物件進行訪問
  • 靜態方法裡不能使用非靜態成員,非靜態方法可以使用靜態成員
  • 靜態成員屬於類,而不屬於物件
24. 什麼是受管制的程式碼?

unsafe:非託管程式碼,不經過CLR執行

25. c#可否對記憶體直接操作?

C#在unsafe 模式下可以使用指標對記憶體進行操作, 但在託管模式下不可以使用指標,C#NET預設不執行帶指標的,需要設定下,選擇專案右鍵->屬性->選擇生成->“允許不安全程式碼”打勾->儲存

26. short s1 = 1; s1 = s1 + 1;有什麼錯?

s1+1不能隱式轉換成short型別,可以修改為s1 =(short)(s1 + 1)

27. 什麼是強型別,什麼是弱型別?哪種更好些?為什麼?

強型別是在編譯的時候就確定型別的資料,在執行時型別不能更改,而弱型別在執行的時候才會確定型別

二者各有好處,強型別安全,因為它事先已經確定好了,而且效率高

28. using關鍵字的作用

引用名稱空間,也可using 別名

釋放資源,實現了IDisposiable的類在using中建立,using結束後會自定呼叫該物件的Dispose方法,釋放資源

29. ref 和 out 有什麼區別

都是按引用型別進行傳遞,屬性不是變數不能作為out、ref引數傳遞

  • ref引數在傳入方法之前必須進行初始化;而out引數在傳入方法之前可以不用初始化
  • ref引數在方法內部可以直接使用;而out引數在方法內部不能直接使用
  • ref引數在方法內部可以使用也可以不使用;而out引數在方法返回之前必須對其賦值
30. a.Equals(b)和a==b一樣嗎?

不一樣,a==b僅僅表示a和b值相等,a.Equals(b)表示a與b一致

31. Math.Round(11.5)等於多少? Math.Round(-11.5)等於多少?

Math.Round(11.5)=12,Math.Round(-11.5)=-12

33. i++和++i有什麼區別?

i++是先賦值,然後再自增;++i是先自增,後賦值

34. as和is的區別

as在轉換的同時判斷相容性,如果無法進行轉換,返回位null(沒有產生新的物件)

is只是做型別相容性判斷,並不執行真正的型別轉換,返回true或false,物件為null也會返回false

as比is效率更高,as只需要做一次型別相容檢查

35. .net Remoting 的工作原理是什麼?

伺服器端向客戶端傳送一個程序編號,一個程式域編號,以確定物件的位置

到達勝利之前無法回頭!