這些天太忙了都沒更新部落格了,這篇我們繼續聊聊「屬性」,大家都知道,屬性其實分兩種,無參屬性和有參屬性,顧名思義
無參屬性就是我們平時用到的 「屬性」,有參屬性就是我們所說的 「索引器」,
1 public class bird
2
4 5 public string this[int i] set }
6 }
乍一看這兩個還是蠻像的,本質上來說這兩個都是get***,set***方法,只是編譯器為了提高我們的開發效率而做的語法糖。
好,下面回答幾個小問題,當然是我自己的個人見解。
q:為什麼型別中要存在屬性?
a:被錯誤的修改,就會導致類的破壞,所以建議在字段中加一層殼,由屬性來提供高層訪問。
舉個例子:person的age欄位不能設為<0 || >150的非法資料,這個時候我們就可以在屬性的set方法上進行過濾了。
private int age;
public int age
set}
q: 我看到上面欄位age和屬性age,那麼請問自動屬性有封裝欄位嗎,比如下面的**?
1 public int age
2
a:其實這個問題問的好,如果你是平時用用而沒有用il看一下的話,可能還真被矇到了,既然說到了il,那就用il看一下。
從il上可以清楚的看到其實編譯器給我們生成了乙個私有的k__backingfield 字段。
q: 提到屬性,我想問一下「型別初始化器」和「建構函式」有什麼區別。
1 var b = new bird ;
a:從il上可以看出,兩個nop之間,我們呼叫了建構函式(ctor),並且先後呼叫了set_name,set_age方法,所以本質上來說,
「型別初始化器」只是乙個語法糖,跟我們手工在建構函式中初始化一樣。
q:我經常看到session["***"],cookie["***"],請問索引器只能用到類的例項上嗎?可不可以
用到型別上?
a:這個問題問的好,其實你可以發現,我們在定義乙個索引器的時候,根本就沒有定義索引器的名字,而是直接用this,重點
就在這裡,我們知道this表示當前例項的上下文,導致我們的只能用到型別的例項上,也就做不了將用到型別上。
q:從上圖中看到索引器本質上是get_item,set_item,但是我如果自己手工定義了乙個
get_item
造成方法名衝突了,這個怎麼辦?
1 public string this[int i]
2
4 set
5 }
public class bird
set
}//重名了,這個怎麼辦?
a:wcf的時候,可能會遇到給方法標記別名的情況,然後我們就用operationcontract給方法換乙個名字,現在估計就有人想到
了我是不是也可以給「索引器」加上別名?確實可以這樣,在這裡我們可以用indexername來完成。
1 [indexername("fly")]
2 public string this[int i]
3
5 set
6 }
然後我們再看看il**,就這樣成功的修改了索引器的方法名。
關於「引數」的幾個問題,也許面試會問到哦
這篇繼續聊聊 引數 的一些話題,我們知道引數大概有 預設引數 可選引數 ref引數 out引數 以及 可變引數 下面提幾個小問題,可能在面試中會被問到。q 請問我按照如下方式傳遞引數的時候,最後的m等於多少?1 static void main string args 27 8static void...
幾個問題,別人問的
udp丟包,丟的是啥?rtp頭?udp頭?資料幀?還是完整包全丟?tcp和udp丟包的區別以及如何通過二進位制資料或者抓包檔案快速區別 udp丟包和tcp丟包的區別啊?udp丟包,丟的是rtp頭?udp頭?udp包?還是資料流?如何判斷丟包是否是由擁塞控制導致?還是包大小導致?udp如何做資料分頁 ...
關於網路的幾個問題
q1 請你分別划划osi的七層網路結構圖,和tcp ip的五層結構圖?1 osi每層功能及特點 a 物理層 為資料鏈路層提供物理連線,在其上序列傳送位元流,即所傳送資料的單位是位元。此外,該層中還具有確定連線裝置的電氣特性和物理特性等功能。b 資料鏈路層 負責在網路節點間的線路上通過檢測 流量控制和...