成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

匿名方法的作用與缺點

開發 后端
本文總結了匿名方法的作用:為了保留回調函數的上下文而創建一些類,對于C#程序員來說,的確是一件有些不可思議的事情。

匿名方法的作用

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

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

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

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

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

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

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

還是太丑,上Lambda表達式!

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

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

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

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

匿名方法的缺點

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

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

【編輯推薦】

  1. 概述C# 匿名函數
  2. C#在應用程序間發送消息實現淺析
  3. 一些C#時間類型的入門知識
  4. 警惕.NET中的匿名方法造成變量共享
  5. 如何使用匿名函數
責任編輯:yangsai 來源: 老趙點滴
相關推薦

2023-10-17 11:34:42

2009-08-20 16:28:45

C#匿名方法

2009-08-20 16:15:19

C# 匿名方法

2009-06-19 18:36:15

JPAHibernate

2009-08-27 17:51:34

C#匿名方法

2009-08-20 16:25:59

C# 匿名方法

2013-11-13 14:11:43

2009-03-13 10:12:18

變量共享匿名方法.NET

2011-05-23 11:22:37

2009-07-08 15:01:00

Servlet的作用

2009-08-21 18:01:32

C#匿名方法

2009-08-27 17:47:18

C#匿名方法作為參數傳

2018-10-24 09:00:26

KafkaSpark數據

2012-05-03 09:58:19

VLANVLAN劃分

2019-04-16 13:12:52

2010-08-03 11:35:19

Flex全屏

2010-01-05 15:43:13

.NET Framew

2012-04-02 14:03:08

web緩存

2010-07-12 14:29:42

BOOTPBOOTP協議

2010-06-30 15:57:23

匿名FTP
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 亚洲综合大片69999 | 亚洲另类春色偷拍在线观看 | 日韩精品一区二区三区中文在线 | 夜夜操天天艹 | 国产一区二区精品在线观看 | 日韩无 | 欧美国产91| 精品一区在线看 | 欧美性生活网 | 亚洲欧美中文字幕 | 国产一区二区电影 | 国产中文字幕在线 | 天天躁日日躁aaaa视频 | 日韩国产在线观看 | 欧美性精品 | 精品日韩 | 久久一区二区三区四区 | 日韩成年人视频在线 | 91麻豆精品一区二区三区 | 日韩不卡三区 | 精品视频免费 | 欧美久久国产精品 | 欧美福利影院 | 99福利视频导航 | 97精品视频在线观看 | www.日本国产| 久久国产精品精品国产色婷婷 | 国产亚洲精品精品国产亚洲综合 | 国产综合一区二区 | 国产精品 欧美精品 | 自拍 亚洲 欧美 老师 丝袜 | 亚洲人成在线播放 | 欧美日韩亚洲国产 | 久精品视频 | 亚洲成人精品一区 | 日韩视频在线播放 | av男人的天堂在线 | 91精品综合久久久久久五月天 | www.色.com| 国产三级国产精品 | 国产精品国产三级国产aⅴ原创 |