日韩性视频-久久久蜜桃-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#中的闭包和意想不到的坑的全部內容,希望文章能夠幫你解決所遇到的問題。

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

主站蜘蛛池模板: 成人国产视频在线观看 | 黄色网址在线免费观看 | 手机看片福利一区 | 日本中文在线播放 | heyzo久久 | 91精品国产91久久久久久 | 亚洲一区二区三区四区视频 | 久久久二区 | 成人免费播放视频 | 国产精品高潮呻吟 | 亚洲高清成人 | 97自拍偷拍| 美女网站黄页 | 四虎成人永久免费视频 | 亚洲高清视频网站 | 黄色的网站免费观看 | 精品国产av 无码一区二区三区 | 一级片视频播放 | 穿扒开跪着折磨屁股视频 | 精品人伦一区二区三区 | 亚洲一区图片 | 老色驴综合网 | 成人高潮片免费视频 | 华人色 | 亚欧在线免费观看 | 色哟哟免费在线观看 | 欧美性猛交久久久乱大交小说 | 久久影院午夜 | 国产又粗又猛又爽又黄又 | 精品黑人一区二区三区 | 亚洲欧洲精品一区二区三区 | 免费操人视频 | 动漫3d精品一区二区三区乱码 | 日本久久亚洲 | 中文字幕在线免费看线人 | 午夜影院免费体验区 | 亚洲国产免费 | 久久一级电影 | 黄色片不卡 | 久久视频一区 | av在线麻豆 | 久久丁香 | 999精品在线观看 | 日本一区二区三区四区在线观看 | 国产欧美日韩精品在线 | 久久澡| 精品久久久久久久久久久久 | 精品久久人人妻人人做人人 | 亚洲三区av | 天天爱综合 | 亚洲黄色一区二区 | 国产中文字幕一区二区 | 色香色香欲天天天影视综合网 | 亚洲人人人 | 欧美一区二区三区在线看 | 国产另类精品 | 国产精品美女久久久 | 狠狠婷| 青青草原国产 | 日韩专区第一页 | a级一级黄色片 | a在线观看视频 | 欧美精品久久久久久久多人混战 | 91午夜精品亚洲一区二区三区 | 日韩国产精品久久 | 新红楼梦2005锦江版高清在线观看 | 国产乱码精品一区二区三区五月婷 | 伊人影院av | 成人动漫中文字幕 | 奇米在线观看 | 女厕厕露p撒尿八个少妇 | 国产啊啊啊啊 | 久久久国产精品无码 | 欧日韩在线 | 91成人免费在线观看 | 国产aⅴ精品一区二区果冻 台湾性生生活1 | 久久澡 | 欧洲国产视频 | 狂野欧美性猛交免费视频 | 成人午夜在线观看视频 | 国产日韩欧美中文字幕 | 用我的手指扰乱你 | 波多野结衣av一区二区全免费观看 | 久久视频一区二区 | 老汉av | 超碰男人的天堂 | 丝袜美腿亚洲一区二区图片 | 日韩在线欧美 | 日韩综合精品 | 嫩草影院懂你的影院 | 少妇精品高潮欲妇又嫩中文字幕 | 国产亚洲久一区二区 | 真实乱视频国产免费观看 | 国产a精品 | 少妇被黑人到高潮喷出白浆 | 日日干夜夜撸 | 亚洲精品高潮久久久久久久 | 麻豆成人在线观看 | 无码精品人妻一区二区三区漫画 |