1. 程式人生 > >.net必問的面試題系列之基本概念和語法

.net必問的面試題系列之基本概念和語法

上個月離職了,這幾天整理了一些常見的面試題,整理成一個系列給大家分享一下,機會是給有準備的人,面試造火箭,工作擰螺絲,不慌,共勉。
1.net必問的面試題系列之基本概念和語法
2.net必問的面試題系列之面向物件
3.net必問的面試題系列之設計模式
4.net必問的面試題系列之集合、異常、泛型
5.net必問的面試題系列之簡單演算法
6.net必問的面試題系列之資料庫
7.net必問的面試題系列之web前端

1. 字串中string str=null和string str=""的區別

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

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

a 本題考查的是資料型別能承載資料的大小。
b 1byte =8bit,1個漢字=2個byte,1個英文=1個byte=8bit
c 所以bc是對的,deg是錯的。'a'是char型別,a錯誤
d java byte取值範圍是-128~127, 而C#裡一個byte是0~255

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

a 都是引用型別,分配再堆上
b StringBuilder預設容量是16,可以允許擴充它所封裝的字串中字元的數量.每個StringBuffer物件都有一定的緩衝區容量,當字串大小沒有超過容量時,不會分配新的容量,當字串大小超過容量時,會自動增加容量。
c 對於簡單的字串連線操作,在效能上stringbuilder不一定總是優於string。因為stringbulider物件的建立也消耗大量的效能,在字串連線比較少的情況下,過度濫用stringbuilder會導致效能的浪費而非節約,只有大量無法預知次數的字串操作才考慮stringbuilder的使用。從最後分析可以看出如果是相對較少的字串拼接根本看不出太大差別。
d Stringbulider的使用,最好制定合適的容量值,否則優於預設值容量不足而頻繁的進行記憶體分配操作,是不妥的實現方法。
參考連結:https://www.cnblogs.com/haofuqi/p/4826262.html

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

a 一句話解釋,擴充套件方法使你能夠向現有型別“新增”方法,無需修改型別
b 條件:按擴充套件方法必須滿足的條件,1.必須要靜態類中的靜態方法2.第一個引數的型別是要擴充套件的型別,並且需要新增this關鍵字以標識其為擴充套件方法
c建議:通常,只在不得已的情況下才實現擴充套件方法,並謹慎的實現
d使用:不能通過類名呼叫,直接使用型別來呼叫

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

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

6.什麼是裝箱和拆箱?

裝箱就是隱式地將一個值型別轉換成引用型別,如:
int i=0;
Syste.Object obj=i;
拆箱就是將引用型別轉換成值型別,如:
int i=0;
System.Object obj=i;
int j=(int)obj;(將obj拆箱)

7.值型別和引用型別的區別
  • 值型別變數是直接包含值。將一個值型別變數賦給另一個值型別變數,是複製包含的值,預設值是0。引用型別變數的賦值只複製對物件的引用,而不復制物件本身,預設值是null
  • 值型別有整形、浮點型、bool、列舉。引用型別有class、delegate、Object、string
  • 值型別儲存在棧中,引用了型別儲存在堆中
8.new關鍵字的作用
  • 運算子:建立物件例項
  • 修飾符:在派生類定義一個重名的方法,隱藏掉基類方法
  • 約束:泛型約束定義,約束可使用的泛型型別

    public class ItemFactory

9. int?和int有什麼區別

int?為可空型別,預設值可以是null,int預設值是0,int?是通過int裝箱為引用型別實現

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

一句話解釋就是:將方法當作引數傳入另一個方法的引數。
.net中有很多常見的委託如:Func 、Action
作用:提高方法的擴充套件性

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

位運算是最快,使用的是位運算 邏輯左位移<<。
方法是2<<3相當於0000 0000 0000 0010 (2的16位int二進位制)左移三位就是 0000 0000 0001 0000(16的二進位制)
相關參考連結:https://www.cnblogs.com/zhangmumu/p/10781201.html

12.const和readonly有什麼區別?

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

1、初始化位置不同。const必須在宣告的同時賦值;readonly即可以在宣告處賦值,也可以在靜態構造方法(必須是靜態構造方法,普通構造方法不行)裡賦值。
2、修飾物件不同。const即可以修飾類的欄位,也可以修飾區域性變數;readonly只能修飾類的欄位
3、const是編譯時常量,在編譯時確定該值;readonly是執行時常量,在執行時確定該值。
4、const預設是靜態的;而readonly如果設定成靜態需要顯示宣告
5、修飾引用型別時不同,const只能修飾string或值為null的其他引用型別;readonly可以是任何型別。

13.現有一個整數number,請寫一個方法判斷這個整數是否是2的N次方

4(100)、5(101)、8(1000)、16(10000)
取模運算:
用number%2==0可以判斷,但是這個有點低階
位運算:(使用位運算邏輯並,兩個位上的都為1才是1,其餘都是0,判斷是否等於0)
4&3相當於100&011 ,結果是000等於0,所以4是2的n次方
5&4相當於101&100,結果是100不等於0,所以5不是2的n次方
如果要問如果是2的N次方,這個N是多少?這該怎麼算?

 private static byte get(int n)
{
    byte number = 1;
    while (n/2!=1)
    {
        n = n / 2;
        number += 1;
    }
    return number;
}
14.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。

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

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

16.分析下面程式碼,a、b的值是多少?
        string strTmp = "a1某某某";
         int a = System.Text.Encoding.Default.GetBytes(strTmp).Length;
         int b = strTmp.Length;

分析:一個字母、數字佔一個byte,一箇中文佔佔兩個byte,所以a=8,b=5

17.Strings = new String(“xyz”);建立了幾個String Object?

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

18.能用foreach遍歷訪問的物件需要實現 ______介面或宣告______方法的型別。

IEnumerable 、 GetEnumerator

19.靜態成員和非靜態成員的區別

1.靜態成員用statis修飾符宣告,在類被例項化時建立,通過類進行訪問
2.不帶statis的變數時非靜態變數,在物件被例項化時建立,通過物件進行訪問,
3.靜態方法裡不能使用非靜態成員,非靜態方法可以使用靜態成員
4.靜態成員屬於類,而不屬於物件

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

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

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

s1+1不能顯式轉換成short型別,可以修改為s1 =(short)(s1 + 1) 。short s1 = 1; s1 += 1正確

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

強型別是在編譯的時候就確定型別的資料,在執行時型別不能更改,而弱型別在執行的時候才會確定型別。沒有好不好,二者各有好處,強型別安全,因為它事先已經確定好了,而且效率高。一般用於編譯型程式語言,如c++,java,c#,pascal等,弱型別相比而言不安全,在執行的時候容易出現錯誤,但它靈活,多用於解釋型程式語言,如javascript,vb,php等

23.using關鍵字的作用

1.引用名稱空間
2.釋放資源,實現了IDisposiable的類在using中建立,using結束後會自定呼叫該物件的Dispose方法,釋放資源。

24.ref和out有什麼區別

1.都是按引用型別進行傳遞
2.屬性不是變數不能作為out、ref引數傳遞
3.ref引數必須初始化。out不需要初始化
4.作用,當方法有多個返回值時,out非常有用

25.a.Equals(b)和a==b一樣嗎?

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

26.下面這段程式碼求值
class Class1
{
    internal static int count = 0;
    static Class1()
    {
        count++;
    }
    public Class1()
    {
        count++;
    }
}
Class1 o1 = new Class1();
Class1 o2 = new Class1();

o1.count的值是多少?
答案:3,靜態 構造方法計算一次,兩個例項化物件計算兩次。

27.關於建構函式說法正確的是哪個?

a)建構函式可以宣告返回型別。

b)建構函式不可以用private修飾

c)建構函式必須與類名相同

d)建構函式不能帶引數
答案:c ,建構函式必須與類名相同,可以傳遞多個傳遞,作用就是便於初始化物件成員,不能有任何返回型別

28.Math.round(11.5)等於多少? Math.round(-11.5)等於多少?

c#裡面都是12

29.&和&&的區別

&是位運算邏輯與運算子,如true&true 結果是true,0&0結果是0,2&3的結果是(10&11=10)2
&&是與運算子,兩個都為true才是true
參考連結https://www.cnblogs.com/zhangmumu/p/10781201.html

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

1.i++是先賦值,然後再自增;++i是先自增,後賦值。
2.i=0,i++=0,++i=1; Console.WriteLine(++i==i++); 結果位true

31.float f = 3.4; 是否正確?

不正確,。3.4是double型別雙精度的,double向下轉型float會造成精度缺失(類似於long轉int),因此需要強制轉換,float f =3.4F 或者float f =(float)3.4

32.什麼是自動轉換,什麼是強制轉換,什麼時候需要自動轉換,什麼時候需要強制轉換

1.自動型別轉換:編譯器自動完成型別轉換,不需要在程式中編寫程式碼。
2.強制型別轉換:強制編譯器進行型別轉換,必須在程式中編寫程式碼
3.轉換規則:從儲存範圍小的型別到儲存範圍大的型別,是自動轉換,如byte=>short=>int=>l