關於「引數」的幾個問題,也許面試會問到哦

2022-02-18 07:53:11 字數 2142 閱讀 2963

這篇繼續聊聊 」引數「的一些話題,我們知道引數大概有」預設引數「,」可選引數「,」ref引數「,」out引數「以及」可變引數「。

下面提幾個小問題,可能在面試中會被問到。

q:請問我按照如下方式傳遞引數的時候,最後的m等於多少?

1

static

void main(string

args)27

8static

void run(int i, int j, intm)9

a: 不管這個問題算不算小兒科,既然被問到了,並且又是在引數這個博文裡面,當然要麼直接加等於2,要麼就是0,如果你在

區域性**區域直接寫k++,那麼毫無疑問的就是k=k;k=k+1,也就是先賦值再自增,那如果作為引數的話,還是一樣嗎?

答案當然就在il裡面。

從il上我們看的很清楚,即使++操作是作為引數的形式,也是依次執行了三個add,然後add完之後再call我們的run方法。

最後得到結果毫無疑問就是2了。

q:我知道預設引數是c#4.0的新特性,難道它又是一塊語法糖嗎?

1

static

void run(int i = 4)2

a: 可以這麼說的,我們知道c#有乙個限制,就是預設值必須是編譯時就能確定的常量值,既然是常量值,那麼這個值就一定

會嵌入到程式集的元資料中,老規矩,繼續看下生成的il**。

如果你仔細觀察,你會發現有兩個不同的地方。

①:引數列表中的opt,這個引數其實就是編譯器給該引數打上了optionalatrribute標記,既然是特性,它也會嵌入到程式集

的元資料中,下面看下它的源**會發現沒什麼有價值的地方,就是標記這個引數是不是可選的。

② 我們會發現有乙個param引數,其實這個引數就是編譯器給引數打上的乙個預設值的標記,繼續看下源**。

這裡我們發現有乙個建構函式,需要傳遞乙個預設值,而這個預設值取自我們定義的常量值,也就是4.

所以綜合來說,確實是一塊語法糖,其實真實的**應該是這樣,只是賦值操作給了編譯器。

1

static

void run(inti)2

q:我知道param有些場景會比int更有語意,比如下面**,能說明下它的實現原理嗎?

1

public

class

program2);

67//是不是有更好的語意

8 addrange(1, 2, 3);9

}1011///

12///

這裡必須傳遞int陣列

13///

14///

15static

void add(int

nums)

1619

20///

21///

這裡直接傳遞資料元素值即可,不需要int

22///

23///

24static

void addrange(params

int nums)

2528 }

a:  確實在add的場景下語意大增了不少,同時也讓我少寫了一些**,那麼到底param是如果做到的呢?我們繼續

看下il**。

從il中上可以看到,其實所謂的呼叫方,即:addrange(1, 2, 3); 它在呼叫之前已經new了乙個arr,並且將1,2,3

加入到arr中去了,然後再呼叫addrange陣列的,所以可以看出,又是一枚語法糖。

好了,大概就這樣了,夜深了,睡覺了。

關於「屬性」的幾個問題,也許面試會問到哦

這些天太忙了都沒更新部落格了,這篇我們繼續聊聊 屬性 大家都知道,屬性其實分兩種,無參屬性和有參屬性,顧名思義 無參屬性就是我們平時用到的 屬性 有參屬性就是我們所說的 索引器 1 public class bird 2 4 5 public string this int i set 6 乍一看這...

幾個問題,別人問的

udp丟包,丟的是啥?rtp頭?udp頭?資料幀?還是完整包全丟?tcp和udp丟包的區別以及如何通過二進位制資料或者抓包檔案快速區別 udp丟包和tcp丟包的區別啊?udp丟包,丟的是rtp頭?udp頭?udp包?還是資料流?如何判斷丟包是否是由擁塞控制導致?還是包大小導致?udp如何做資料分頁 ...

關於網路的幾個問題

q1 請你分別划划osi的七層網路結構圖,和tcp ip的五層結構圖?1 osi每層功能及特點 a 物理層 為資料鏈路層提供物理連線,在其上序列傳送位元流,即所傳送資料的單位是位元。此外,該層中還具有確定連線裝置的電氣特性和物理特性等功能。b 資料鏈路層 負責在網路節點間的線路上通過檢測 流量控制和...