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