日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > C# >内容正文

C#

c# 睡眠3秒_C#中的闭包和意想不到的坑

發布時間:2024/10/8 C# 114 豆豆
生活随笔 收集整理的這篇文章主要介紹了 c# 睡眠3秒_C#中的闭包和意想不到的坑 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

轉自:老胡寫代碼cnblogs.com/deatharthas/p/13166987.html

雖然閉包主要是函數式編程的玩意兒,而C#的最主要特征是面向對象,但是利用委托或lambda表達式,C#也可以寫出具有函數式編程風味的代碼。

同樣的,使用委托或者lambda表達式,也可以在C#中使用閉包。

根據WIKI的定義,閉包又稱語法閉包或函數閉包,是在函數式編程語言中實現語法綁定的一種技術。閉包在實現上是一個結構體,它存儲了一個函數(通常是其入口地址)和一個關聯的環境(相當于一個符號查找表)。閉包也可以延遲變量的生存周期。

看定義好像有點迷糊,讓我們看看下面的例子

class Program
{
static Action CreateGreeting(string message)
{
return () => { Console.WriteLine("Hello " + message); };
}
static void Main()
{
Action action = CreateGreeting("DeathArthas");
action();
}
}

這個例子非常簡單,用lambda表達式創建一個Action對象,之后再調用這個Action對象。

但是仔細觀察會發現,當Action對象被調用的時候,CreateGreeting方法已經返回了,作為它的實參的message應該已經被銷毀了,那么為什么我們在調用Action對象的時候,還是能夠得到正確的結果呢?

原來奧秘就在于,這里形成了閉包。雖然CreateGreeting已經返回了,但是它的局部變量被返回的lambda表達式所捕獲,延遲了其生命周期。怎么樣,這樣再回頭看閉包定義,是不是更清楚了一些?

閉包就是這么簡單,其實我們經常都在使用,只是有時候我們都不自知而已。比如大家肯定都寫過類似下面的代碼。

void AddControlClickLogger(Control control, string message)
{
control.Click += delegate
{
Console.WriteLine("Control clicked: {0}", message);
}
}

這里的代碼其實就用了閉包,因為我們可以肯定,在control被點擊的時候,這個message早就超過了它的聲明周期。合理使用閉包,可以確保我們寫出在空間和時間上面解耦的委托。

不過在使用閉包的時候,要注意一個陷阱。因為閉包會延遲局部變量的生命周期,在某些情況下程序產生的結果會和預想的不一樣。讓我們看看下面的例子。

class Program
{
static ListCreateActions()
{
var result = new List();for(int i = 0; i < 5; i++)
{
result.Add(() => Console.WriteLine(i));
}return result;
}static void Main()
{
var actions = CreateActions();for(int i = 0;i {
actions[i]();
}
}
}

這個例子也非常簡單,創建一個Action鏈表并依次執行它們。看看結果

相信很多人看到這個結果的表情是這樣的!!難道不應該是0,1,2,3,4嗎?出了什么問題?

刨根問底,這兒的問題還是出現在閉包的本質上面,作為“閉包延遲了變量的生命周期”這個硬幣的另外一面,是一個變量可能在不經意間被多個閉包所引用。

在這個例子里面,局部變量i同時被5個閉包引用,這5個閉包共享i,所以最后他們打印出來的值是一樣的,都是i最后退出循環時候的值5。

要想解決這個問題也很簡單,多聲明一個局部變量,讓各個閉包引用自己的局部變量就可以了。

//其他都保持與之前一致
static ListCreateActions()
{var result = new List();for (int i = 0; i < 5; i++)
{int temp = i; //添加局部變量
result.Add(() => Console.WriteLine(temp));
}return result;
}

這樣各個閉包引用不同的局部變量,剛剛的問題就解決了。

除此之外,還有一個修復的方法,在創建閉包的時候,使用foreach而不是for。至少在C# 7.0 的版本上面,這個問題已經被注意到了,使用foreach的時候編譯器會自動生成代碼繞過這個閉包陷阱。

//這樣fix也是可以的
static List CreateActions()
{var result = new List();foreach (var i in Enumerable.Range(0,5))
{
result.Add(() => Console.WriteLine(i));
}return result;
}

這就是在閉包在C#中的使用和其使用中的一個小陷阱,希望大家能通過老胡的文章了解到這個知識點并且在開發中少走彎路!

往期精彩回顧

【推薦】.NET Core開發實戰視頻課程?★★★

.NET Core實戰項目之CMS 第一章 入門篇-開篇及總體規劃

【.NET Core微服務實戰-統一身份認證】開篇及目錄索引

Redis基本使用及百億數據量中的使用技巧分享(附視頻地址及觀看指南)

.NET Core中的一個接口多種實現的依賴注入與動態選擇看這篇就夠了

10個小技巧助您寫出高性能的ASP.NET Core代碼

用abp vNext快速開發Quartz.NET定時任務管理界面

在ASP.NET Core中創建基于Quartz.NET托管服務輕松實現作業調度

現身說法:實際業務出發分析百億數據量下的多表查詢優化

關于C#異步編程你應該了解的幾點建議

C#異步編程看這篇就夠了

給我好看

您看此文用

??·?

秒,轉發只需1秒呦~

好看你就

點點

總結

以上是生活随笔為你收集整理的c# 睡眠3秒_C#中的闭包和意想不到的坑的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 国产夫妻在线视频 | 色呦呦在线观看视频 | 2019自拍偷拍 | 色中色综合| 亚洲综合在线第一页 | 精品人妻一区二区三区免费看 | 中文精品一区 | 色悠悠网 | 五月婷婷在线视频 | 三级在线看中文字幕完整版 | 在线中文字日产幕 | 91桃色视频在线观看 | www免费网站在线观看 | 国产少女免费观看高清 | 999国产精品视频免费 | 免费色网址 | 国产精品一区二区无码对白 | 成人免费视频一区二区三区 | 看黄网站在线观看 | 色综合天 | 久成人| 日本熟妇成熟毛茸茸 | 国产精品自拍第一页 | 免费国产91 | 成人国产一区二区三区精品麻豆 | 日韩欧美91 | 日本黄色一级视频 | 午夜影院久久 | 日韩二区三区四区 | 国产麻豆精品在线观看 | 亚洲一级免费毛片 | 性史性农村dvd毛片 日韩精品在线视频观看 | 伊人一区二区三区四区 | 天堂网av2014 | 自拍偷拍20p| 青青草国产一区 | 伊人久久久久久久久 | 在线免费av片 | 欧美极品jizzhd欧美 | 一区二区三区播放 | www99re| av资源网址 | 日韩v片 | 国产男女无套免费网站 | h视频在线看 | 蜜桃精品噜噜噜成人av | 天天操天天插天天射 | 性色av一区二区 | 老汉色av| 91亚洲一区 | 日韩少妇高潮抽搐 | 1000亚洲裸体人体 | 波多野吉衣av在线 | 老外毛片 | 日本va欧美va欧美va精品 | 日本欧美激情 | 在线看a网站| 狠狠搞狠狠干 | 在线免费观看一级片 | 久久密桃| 亚洲精品国产一区二 | 91蝌蚪在线观看 | 久久ww| 久久久精品影院 | 性做爰裸体按摩视频 | 51国产偷自视频区视频 | 亲嘴扒胸摸屁股激烈网站 | 天天色天天射综合网 | 四虎影院在线观看免费 | 久久综合精品视频 | 国产网红女主播精品视频 | 久久精品国产久精国产 | 7777精品久久久久久 | 国产99对白在线播放 | 欧美在线视频一区二区三区 | 亚洲少妇网站 | 日韩一区二区三区在线观看 | 狠狠干中文字幕 | 一级香蕉视频在线观看 | 午夜激情一区二区 | 伊人春色av | 欧美日韩精品在线观看 | 香蕉视频91 | 久久国产情侣 | 国产精品剧情 | 一级大毛片 | 男女啪动最猛动态图 | xxx老太太 | 永久黄网站色视频免费观看w | 日韩欧美小视频 | 91成人免费在线观看视频 | 黄色工厂在线观看 | 天海翼一区 | 欧美日韩国产精品一区二区三区 | 看污片网站 | 国产模特av私拍大尺度 | 亚洲图片 自拍偷拍 | 久久久久久久久久久久97 | 先锋影音av资源在线观看 |