日本综合一区二区|亚洲中文天堂综合|日韩欧美自拍一区|男女精品天堂一区|欧美自拍第6页亚洲成人精品一区|亚洲黄色天堂一区二区成人|超碰91偷拍第一页|日韩av夜夜嗨中文字幕|久久蜜综合视频官网|精美人妻一区二区三区

RELATEED CONSULTING
相關(guān)咨詢
選擇下列產(chǎn)品馬上在線溝通
服務(wù)時間:8:30-17:00
你可能遇到了下面的問題
關(guān)閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營銷解決方案
匿名方法的作用與缺點

匿名方法的作用

超過10余年行業(yè)經(jīng)驗,技術(shù)領(lǐng)先,服務(wù)至上的經(jīng)營模式,全靠網(wǎng)絡(luò)和口碑獲得客戶,為自己降低成本,也就是為客戶降低成本。到目前業(yè)務(wù)范圍包括了:成都網(wǎng)站制作、網(wǎng)站設(shè)計、外貿(mào)網(wǎng)站建設(shè),成都網(wǎng)站推廣,成都網(wǎng)站優(yōu)化,整體網(wǎng)絡(luò)托管,小程序定制開發(fā),微信開發(fā),成都app開發(fā),同時也可以讓客戶的網(wǎng)站和網(wǎng)絡(luò)營銷和我們一樣獲得訂單和生意!

千萬不要小看匿名方法的作用,有些時候您認(rèn)為它的作用僅限于上文描述,只是因為沒有在某些問題上踏前一步。例如,對于那些只需要“按需創(chuàng)建”,且要“線程安全”的對象,您會怎么做呢?沒錯,可以使用Double Check:

 
 
 
  1. private object m_mutex = new object();
  2. private bool m_initialized = false;
  3. private BigInstance m_instance = null;
  4. public BigInstance Instance
  5. {
  6.     get
  7.     {
  8.         if (!this.m_initialized)
  9.         {
  10.             lock (this.m_mutex)
  11.             {
  12.                 if (!this.m_initialized)
  13.                 {
  14.                     this.m_instance = new BigInstance();
  15.                     this.m_initialized = true;
  16.                 }
  17.             }
  18.         }
  19.         return this.m_instance;
  20.     }
  21. }

嗯,做的很漂亮!那么……這樣的屬性再來一個,再來三個,再來五個呢?可能有些朋友就會開始大段地Copy & Paste,于是錯誤便難免了。這里有一件真人真事,以前某位同學(xué)在一堆這樣的代碼中迷茫了,說為什么用了這種方法,還是初始化了多次對象了?檢查了半天沒有看出問題來。***發(fā)現(xiàn),原因是訪問了錯誤的initialized變量(例如,在某個應(yīng)該訪問artistInitialized的地方訪問了articleInitialized)??上?,大段時間已經(jīng)被浪費了——更糟的是,心情也隨之變差了。

其實,Copy & Paste很明顯沒有遵守DRY原則埃為什么不把它們封裝在一處呢?例如:

 
 
 
  1. public class Lazy
  2. {
  3.     public Lazy(Func func)
  4.     {
  5.         this.m_initialized = false;
  6.         this.m_func = func;
  7.         this.m_mutex = new object();
  8.     }
  9.     private Func m_func;
  10.     private bool m_initialized;
  11.     private object m_mutex;
  12.     private T m_value;
  13.     public T Value
  14.     {
  15.         get
  16.         {
  17.             if (!this.m_initialized)
  18.             {
  19.                 lock (this.m_mutex)
  20.                 {
  21.                     if (!this.m_initialized)
  22.                     {
  23.                         this.m_value = this.m_func();
  24.                         this.m_func = null;
  25.                         this.m_initialized = true;
  26.                     }
  27.                 }
  28.             }
  29.             return this.m_value;
  30.         }
  31.     }
  32. }

于是,之前的代碼就可以簡化成這樣了:

 
 
 
  1. private Lazy m_lazyInstance =
  2.     new Lazy(delegate { return new BigInstance(); });
  3. public BigInstance Instance { get { return this.m_lazyInstance.Value; } }

還是太丑,上Lambda表達(dá)式!

 
 
 
  1. private Lazy m_lazyInstance =
  2.     new Lazy(() => new BigInstance());
  3. public BigInstance Instance { get { return this.m_lazyInstance.Value; } }

如果沒有匿名方法,許多容易使用的編程模型和方式都難以開展。例如,我們就不會有CacheHelper,也不會有AsyncTaskDispatcher(上,下),也很難利用“延遲”所帶來的便利,更難以出現(xiàn)微軟并行擴(kuò)展、CCR等優(yōu)秀框架??梢赃@么說,如果您不善于使用委托,您如果不知道如何合適地使用匿名方法,您在不自知的情況下可能就已經(jīng)編寫了大量額外的代碼了。

老趙平時的工作之一,便是為項目提供各種擴(kuò)展API,可以讓程序員們更愉快地進(jìn)行開發(fā)工作,得到更好的生產(chǎn)力,讓代碼變得更加美好。如今C#有了匿名方法、Lambda表達(dá)式、表達(dá)式樹、擴(kuò)展方法等優(yōu)秀的語言特性,真讓我有“如魚得水”的感覺。因此,我對于Java這樣不思進(jìn)取的語言可以說深惡痛絕(Java朋友們趕快學(xué)習(xí)Scala吧)。在看閱讀大量Java開源項目代碼時,我常有這樣的感覺:“如果是C#的話,利用匿名方法,這個類不就可以不寫,那個類就可以省略……”。沒錯,所以匿名方法的作用就是,為了保留回調(diào)函數(shù)的上下文而創(chuàng)建一些類,對于C#程序員來說,的確是一件有些不可思議的事情。

至于Lambda表達(dá)式以及其他話題,我們下次再說吧。

匿名方法的缺點

匿名方法的優(yōu)勢在于自動形成閉包,而它的缺點也是讓程序員“不自覺”地創(chuàng)建了閉包,這會讓某些對象的生命周期加長。例如在一開始的TestRequest方法中,表面上看起來url是參數(shù),request是局部變量,有些朋友可能會認(rèn)為它們在方法退出后就已經(jīng)準(zhǔn)備回收了。不過因為形成了閉包,url和request已經(jīng)“升級”為一個對象的域變量,它的生命周期延長了,延長至回調(diào)函數(shù)執(zhí)行完畢。因此,一不注意可能就會產(chǎn)生一些莫名其妙的情況。

其實,這些都是“延遲”所帶來的陷阱,作為一個優(yōu)秀的開發(fā)人員,除了知道某個東西的作用和優(yōu)勢,也要知道它的問題,不是嗎?


網(wǎng)站名稱:匿名方法的作用與缺點
本文鏈接:http://www.dlmjj.cn/article/cdjeccg.html