1. 程式人生 > >C# 面試基礎題

C# 面試基礎題

1、將字串“123456”反轉

思路:首先將字串分割成陣列,split(''),然後利用陣列的反序函式reverse(),最後將這個陣列join掉

例如:

string str = "123456789";

string newStr = str.split('').reverse().join();

 

2、c#中非同步與同步的區別:

同步:阻塞的

比如說張三喊李四去吃飯,李四說等會兒,張三就一直等著,一直等到李四將事情忙完了一起去吃飯 

等價於

瀏覽器向伺服器請求資料,伺服器比較忙,瀏覽器一直等著(頁面空白),直到瀏覽器在返回資料時才顯示

 

非同步:非阻塞的

比如說張三喊你李四吃飯,李四說知道了,然後就自己去吃飯了,李四忙完了就自己去吃飯了;

等價於

瀏覽器向伺服器請求資料,伺服器比較忙的,瀏覽器還是幹自己的事(顯示頁面),去伺服器將資料返回回來的時候告訴瀏覽器一聲,瀏覽器把返回的資料渲染到頁面,區域性重新整理;

 

3、C#是否可以對直接記憶體操作?

答案是:可以對記憶體直接操作;

為什麼呢?

在C#直接對記憶體操作是非安全的,為什麼呢?因為直接對記憶體操作需要有"unsafe"修飾

例如:

unsafe class MyClass{}

unsafe void Getunsafe(){}

這裡問題就來了,不安全為什麼還有人要用他呢?答案就是有些情況下,有些時候,還要用到指標;

那什麼是指標呢?

指標是一種用來儲存一種變數地址的特殊變數,如果你把一個變數地址賦給第二個變數,你可以說第一個變數指向第二個變數,CLrR支援3種指標型別:1、受託管指標;2、非託管指標;3、非託管函式指標;

受託管指標儲存在堆上的託管塊的引用,一個非託管指標是傳統的C++指標並且每次使用必須要放在unsafe程式碼塊中,一個非託管函式指標也是指向函式地址的傳統的C++指標(delegates 可以被看做是非託管函式指標).

例如1:

            unsafe 
            {
                int* pi;
                int x = 1;
                pi = &x;
                Console.WriteLine(*pi);
            }

在上述例項中:我們聲明瞭兩個變數;一個是pi指向Int的指標,x是int型別,我們將x的地址賦給pi;理解這一點就是,我們放在pi中的變數是x的地址,而不是x的值很重要

上述編譯後輸出:1

 

指標也是可以接受Null值的,也可能是用void指標型別

unsafe 
{
nt x = 10;
void* px = &x;
double *pd = (double*)px;
}

在C#中是指標一定要比C++當中使用指標一定要更加的注意,應為c#當中的垃圾回收機制會執行記憶體清理,在清理的過程中gc會改變物件在記憶體中的位置,這樣就會導致指標指向錯誤的物件位置;為了避免這個為題,c#包含'fiexd'關鍵字,他告訴物件不要重新部署物件

 

我們已經知道了指標在C#中非常有用的部分,使用指標的並不難但是要非常小心,因為可能導致難易診斷的問題,使用指標很有可能擾亂垃圾回收機制的功能,所以當我們的程式中存在大量指標是就應該考慮考慮其他解決問題的辦法了

 

4、靜態類與非靜態類的區別:

1、靜態類不能被例項化,而普通類可以;

2、靜態類只能從system.object繼承,而不普通類除了sealed與static修飾的類都可以繼承,但是也只能繼承一個類;

3、靜態類不能繼承介面,普通類可以多繼承介面;

4、靜態類只能包含靜態成員,而普通類既可以有靜態成員也可以有非靜態成員;

5、靜態類不能作為欄位、方法引數、區域性變數的使用,普通類可以;

 

5、簡述Ajax的執行過程

1、建立XMLHttpRequest物件,也就是建立一個非同步呼叫的物件;

2、建立一個HTTP請求,並指定請求的方法、URL地址及驗證資訊;

3、設定Http狀態變化的函式(即成功與失敗);

4、向伺服器傳送Http請求;

5、獲取非同步請求返回的資料;

6、然後使用JavaScript將返回的資料渲染到頁面上;