让你觉得破坏了封装性的扩展方法
擴(kuò)展方法
源于對(duì)擴(kuò)展方法的了解是來自List<T>的Where、Order、GroupBy等方法的使用,智能感知提示這些方法都是擴(kuò)展方法,于是MSDN上查閱后總結(jié)如下自定義擴(kuò)展方法(將字符串轉(zhuǎn)換為Int,代碼拷貝)
namespace?MyCommon
{
????public?static?class?EString
????{
????????public?static?int?ToInt(this?string?t)
????????{
????????????int?id;
????????????int.TryParse(t, out?id);//這里當(dāng)轉(zhuǎn)換失敗時(shí)返回的id為0
????????????return?id;
????????}
????}
}
微軟規(guī)定,擴(kuò)展方法:1、必須是靜態(tài)類和靜態(tài)方法(而且必須是public)
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 2、參數(shù)必須以this作為前綴
其實(shí)咋一看,擴(kuò)展方法明顯違法了封裝性的原則,把方法設(shè)為public,讓外界直接調(diào)用,這是很違法封裝原則的,但是這里沒有辦法,如果改為private,外界實(shí)例無法訪問,但是微軟告訴我們,雖然是使用實(shí)例方法的語法來調(diào)用擴(kuò)展方法,但是編譯器生成的IL中間語言的時(shí)候會(huì)把代碼轉(zhuǎn)換成對(duì)靜態(tài)方法的調(diào)用,理論上說并未真正違法封裝性的原則,但是這種解釋有點(diǎn)牽強(qiáng)。
我突然發(fā)現(xiàn),該靜態(tài)類的名稱?EString似乎毫無用處,似乎可以隨意改動(dòng),的確是這樣,這里要的只是命名空間和方法名,而方法的第一個(gè)參數(shù)決定了該擴(kuò)展方法是用于對(duì)何種類型的擴(kuò)展,例如上面的例子this?string?t,第一個(gè)參數(shù)的類型是string,則是對(duì)string做的擴(kuò)展方法
另外擴(kuò)展方法的優(yōu)先級(jí)總是比實(shí)例本身的方法的優(yōu)先級(jí)低,即如果A類本身有fun1()方法,則另外擴(kuò)展一個(gè)同名的fun1方法,則擴(kuò)展的fun1,永遠(yuǎn)不會(huì)執(zhí)行,因?yàn)樵诰幾g的時(shí)候編譯器永遠(yuǎn)不會(huì)綁定到該擴(kuò)展方法
轉(zhuǎn)載于:https://www.cnblogs.com/yinhaichao/p/3253299.html
總結(jié)
以上是生活随笔為你收集整理的让你觉得破坏了封装性的扩展方法的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: win7中的画图
- 下一篇: hdu 4666 Hyperspace