亚洲激情专区-91九色丨porny丨老师-久久久久久久女国产乱让韩-国产精品午夜小视频观看

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

C語言中匿名方法有什么作用

發布時間:2021-12-07 10:26:28 來源:億速云 閱讀:306 作者:小新 欄目:編程語言

小編給大家分享一下C語言中匿名方法有什么作用,相信大部分人都還不怎么了解,因此分享這篇文章給大家參考一下,希望大家閱讀完這篇文章后大有收獲,下面讓我們一起去了解一下吧!

匿名方法的作用

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

private object m_mutex = new object();  private bool m_initialized = false;  private BigInstance m_instance = null;   public BigInstance Instance  {      get     {          if (!this.m_initialized)          {              lock (this.m_mutex)              {                  if (!this.m_initialized)                  {                      this.m_instance = new BigInstance();                      this.m_initialized = true;                  }              }          }           return this.m_instance;      }  }

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

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

public class Lazy<T>  {      public Lazy(Func<T> func)      {          this.m_initialized = false;          this.m_func = func;          this.m_mutex = new object();      }       private Func<T> m_func;       private bool m_initialized;      private object m_mutex;      private T m_value;       public T Value      {          get         {              if (!this.m_initialized)              {                  lock (this.m_mutex)                  {                      if (!this.m_initialized)                      {                          this.m_value = this.m_func();                          this.m_func = null;                          this.m_initialized = true;                      }                  }              }               return this.m_value;          }      }  }

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

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

還是太丑,上Lambda表達式!

private Lazy<BigInstance> m_lazyInstance =      new Lazy<BigInstance>(() => new BigInstance());  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已經“升級”為一個對象的域變量,它的生命周期延長了,延長至回調函數執行完畢。因此,一不注意可能就會產生一些莫名其妙的情況。

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

以上是“C語言中匿名方法有什么作用”這篇文章的所有內容,感謝各位的閱讀!相信大家都有了一定的了解,希望分享的內容對大家有所幫助,如果還想學習更多知識,歡迎關注億速云行業資訊頻道!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

鄂州市| 北海市| 虹口区| 历史| 浙江省| 峨眉山市| 巨鹿县| 临汾市| 漳浦县| 杭锦旗| 满城县| 类乌齐县| 中卫市| 潼南县| 双城市| 乐亭县| 商南县| 衡南县| 嫩江县| 竹山县| 青海省| 连山| 正宁县| 新巴尔虎左旗| 张家港市| 全椒县| 山东| 台南县| 巴青县| 肃北| 文化| 买车| 仪陇县| 胶州市| 奉化市| 南投市| 武宣县| 长治县| 边坝县| 鄂尔多斯市| 轮台县|