欧美三区四区_av先锋影音资源站_亚洲第一论坛sis_影音先锋2020色资源网_亚洲精品社区_在线免费观看av网站_国产一区二区伦理_亚洲欧美视频一区二区_99视频精品全部免费在线_精精国产xxxx视频在线

解讀.NET中*延遲*特性的幾個(gè)陷阱_.Net教程

編輯Tag賺U幣
教程Tag:暫無(wú)Tag,歡迎添加,賺取U幣!

推薦:C#教程:Assembly類訪問(wèn)程序集信息
C#中通過(guò)Assembly類可以訪問(wèn)程序集信息. 1.允許訪問(wèn)給定程序集的元元素,包含可以加載和執(zhí)行程序集的方法; 2.加載程序集:使用靜態(tài)方法Assembly.Load(程序集名稱)或Assembly.LoadFrom(程序集完整路徑名); 3.屬性: FullName:程序集顯示名稱; 3.方法: Ge

.NET發(fā)展至今,其實(shí)各處都有“延遲(Lazy)”的痕跡,一個(gè)小小的“Laziness”給我們帶來(lái)了不少靈活性1。“延遲”的關(guān)鍵就在于“只在需要的時(shí)候處理數(shù)據(jù)”,老趙曾經(jīng)在多篇文章中提到了類似的概念,如《高階函數(shù)、委托與匿名方法》及《您善于使用匿名函數(shù)嗎?》。不過(guò)“延遲”本身也會(huì)給您帶來(lái)一些陷阱,某些陷阱您很有可能也曾經(jīng)遇到過(guò)。這篇文章便是總結(jié)了延遲特性的集中常見(jiàn)陷阱,并給出應(yīng)對(duì)方案。

重復(fù)運(yùn)算

問(wèn)題

“延遲”的本意是“減少計(jì)算”,但是如果您使用不當(dāng),很可能反而會(huì)造成“重復(fù)計(jì)算”。例如,我們首先構(gòu)建一個(gè)方法,它接受一個(gè)參數(shù)n,返回一個(gè)Func<int, bool>對(duì)象:

以下為引用的內(nèi)容:

static Func<int, bool> DivideBy(int n)
{
    return x =>
    {
        bool divisible = x % n == 0;
        Console.WriteLine(
            "{0} can be divisible by {1}? {2}",
            x, n, divisible ? "Yes" : "No");
        return divisible;
    };
}

返回的Func<int, bool>對(duì)象會(huì)根據(jù)傳入的參數(shù)x,返回一個(gè)表示x能否被n整除的布爾值。在這過(guò)程中,還會(huì)向控制臺(tái)輸出一句話,例如:“10 can be divisible by 3? No”。每當(dāng)看到這句話,則表明“經(jīng)過(guò)了一次判斷”。那么您是否知道,下面的代碼會(huì)輸出什么結(jié)果呢?

以下為引用的內(nèi)容:

List<int> values = new List<int>();
for (int i = 0; i < 10; i++) values.Add(i);

var divideByTwo = values.Where(DivideBy(2));
var divideByTwoAndThree = divideByTwo.Where(DivideBy(3));
var divideByTwoAndFive = divideByTwo.Where(DivideBy(5));

foreach (var i in divideByTwoAndThree) { }
foreach (var i in divideByTwoAndFive) { }

結(jié)果如下:

以下為引用的內(nèi)容:

0 can be divisible by 2? Yes
0 can be divisible by 3? Yes
1 can be divisible by 2? No
2 can be divisible by 2? Yes
2 can be divisible by 3? No
3 can be divisible by 2? No
4 can be divisible by 2? Yes
4 can be divisible by 3? No
5 can be divisible by 2? No
6 can be divisible by 2? Yes
6 can be divisible by 3? Yes
7 can be divisible by 2? No
8 can be divisible by 2? Yes
8 can be divisible by 3? No
9 can be divisible by 2? No
0 can be divisible by 2? Yes
0 can be divisible by 5? Yes
1 can be divisible by 2? No
2 can be divisible by 2? Yes
2 can be divisible by 5? No
3 can be divisible by 2? No
4 can be divisible by 2? Yes
4 can be divisible by 5? No
5 can be divisible by 2? No
6 can be divisible by 2? Yes
6 can be divisible by 5? No
7 can be divisible by 2? No
8 can be divisible by 2? Yes
8 can be divisible by 5? No
9 can be divisible by 2? No

您是否發(fā)現(xiàn),無(wú)論是在遍歷divideByTwoAndThree和divideByTwoAndFive序列時(shí),都會(huì)從原有的values序列里重新判斷每個(gè)元素是否能夠被2整除?這就是.NET 3.5中“Where”的延遲特性,如果您在這里沒(méi)有意識(shí)到這點(diǎn),就可能會(huì)產(chǎn)生重復(fù)計(jì)算,浪費(fèi)了計(jì)算能力。

解決方案

解決這個(gè)問(wèn)題的方法就是在合適的時(shí)候進(jìn)行“強(qiáng)制計(jì)算”。例如:

以下為引用的內(nèi)容:

var divideByTwo = values.Where(DivideBy(2)).ToList();
var divideByTwoAndThree = divideByTwo.Where(DivideBy(3));
var divideByTwoAndFive = divideByTwo.Where(DivideBy(5));

結(jié)果就變成了:

以下為引用的內(nèi)容:

0 can be divisible by 2? Yes
1 can be divisible by 2? No
2 can be divisible by 2? Yes
3 can be divisible by 2? No
4 can be divisible by 2? Yes
5 can be divisible by 2? No
6 can be divisible by 2? Yes
7 can be divisible by 2? No
8 can be divisible by 2? Yes
9 can be divisible by 2? No
0 can be divisible by 3? Yes
2 can be divisible by 3? No
4 can be divisible by 3? No
6 can be divisible by 3? Yes
8 can be divisible by 3? No
0 can be divisible by 5? Yes
2 can be divisible by 5? No
4 can be divisible by 5? No
6 can be divisible by 5? No
8 can be divisible by 5? No

此時(shí),在獲得divideByTwo序列時(shí),就會(huì)立即進(jìn)行計(jì)算,這樣在遍歷后兩者時(shí)就不會(huì)重復(fù)計(jì)算1,3,5等元素了。

異常陷阱

問(wèn)題

請(qǐng)問(wèn)您是否知道下面的代碼有什么問(wèn)題?

以下為引用的內(nèi)容:

public static IEnumerable<string> ToString(IEnumerable<int> source)
{
    if (source == null)
    {
        throw new ArgumentNullException("source");
    }

    foreach (int item in source)
    {
        yield return item.ToString();
    }
}

如果您沒(méi)有看出來(lái)的話,不如運(yùn)行一下這段代碼:

以下為引用的內(nèi)容:

static void Main(string[] args)
{
    IEnumerable<string> values;
    try
    {
        values = ToString(null);
    }
    catch (ArgumentNullException)
    {
        Console.WriteLine("Passed the null source");
        return;
    }

    foreach (var s in values) { }
}

請(qǐng)問(wèn),運(yùn)行上面的代碼是否會(huì)拋出異常?從代碼的意圖上看,在ToString方法的一開(kāi)始我們會(huì)檢查參數(shù)是否為null,然后拋出異常——這本應(yīng)被catch語(yǔ)句所捕獲。但是事實(shí)上,代碼直到foreach執(zhí)行時(shí)才真正拋出了異常。這種“延遲”執(zhí)行違反了我們的實(shí)現(xiàn)意圖。為什么會(huì)這樣呢?您可以使用.NET Reflector反編譯一下,查看一下yield語(yǔ)句的等價(jià)C#實(shí)現(xiàn)是什么樣的,一切就清楚了。

解決方案

對(duì)于這個(gè)問(wèn)題,一般我們可以使用一對(duì)public和private方法配合來(lái)使用:

以下為引用的內(nèi)容:

public static IEnumerable<string> ToString(IEnumerable<int> source)
{
    if (source == null)
    {
        throw new ArgumentNullException("source");
    }

    return ToStringInternal(source);
}

private static IEnumerable<string> ToStringInternal(IEnumerable<int> source)
{
    foreach (int item in source)
    {
        yield return item.ToString();
    }
}

不妨再去查看一下現(xiàn)在的C#代碼實(shí)現(xiàn)?

資源管理

問(wèn)題

由于是延遲執(zhí)行,一些原本最簡(jiǎn)單的代碼模式可能就破壞了。例如:

以下為引用的內(nèi)容:

static Func<string> ReadAllText(string file)
{
    using (Stream stream = File.OpenRead(file))
    {
        StreamReader reader = new StreamReader(stream);
        return reader.ReadToEnd;
    }
}

使用using來(lái)管理文件的打開(kāi)關(guān)閉是最容易不過(guò)的事情了,不過(guò)現(xiàn)在如果您通過(guò)ReadAllText(@"C:\abc.txt")方法獲得的Func<string>對(duì)象,在執(zhí)行時(shí)就會(huì)拋出ObjectDisposedException。這是因?yàn)樵疚覀円鈭D中的順序:

打開(kāi)文件

讀取內(nèi)容

關(guān)閉文件

因?yàn)橛?ldquo;延遲”特性,這個(gè)順序已經(jīng)變?yōu)椋?/p>

打開(kāi)文件

關(guān)閉文件

讀取內(nèi)容

這怎么能不出錯(cuò)?

解決方案

有朋友說(shuō),這個(gè)容易:

以下為引用的內(nèi)容:

static Func<string> ReadAllText(string file)
{
    using (Stream stream = File.OpenRead(file))
    {
        StreamReader reader = new StreamReader(stream);
        string text = reader.ReadToEnd();

        return () => text;
    }
}

的確沒(méi)有拋出異常了,但是這也喪失了“延遲”的特點(diǎn)了。我們必須讓它能夠在調(diào)用委托對(duì)象的時(shí)候,才去打開(kāi)文件:

以下為引用的內(nèi)容:

static Func<string> ReadAllText(string file)
{
    return () =>
    {
        using (Stream stream = File.OpenRead(file))
        {
            StreamReader reader = new StreamReader(stream);
            return reader.ReadToEnd();
        }
    };
}

值得一提的是,using完全可以配合yield語(yǔ)句使用。也就是說(shuō),您可以編寫(xiě)這樣的代碼:

以下為引用的內(nèi)容:

static IEnumerable<string> AllLines(string file)
{
    using (Stream stream = File.OpenRead(file))
    {
        StreamReader reader = new StreamReader(stream);
        while (!reader.EndOfStream)
        {
            yield return reader.ReadLine();
        }
    }
}

由此也可見(jiàn)C#編譯器是多么的強(qiáng)大,它幫我們解決了非常重要的問(wèn)題。

閉包共享

問(wèn)題

其實(shí)這個(gè)問(wèn)題也已經(jīng)被談過(guò)很多次了,在這里提一下主要是為了保持內(nèi)容的完整性。您認(rèn)為,以下代碼結(jié)果如何?

以下為引用的內(nèi)容:

List<Action> actions = new List<Action>();
for (int i = 0; i < 10; i++)
{
    actions.Add(() => Console.WriteLine(i));
}

foreach (var a in actions) a();

它打印出來(lái)的結(jié)果是10個(gè)10,具體原因在《警惕匿名方法造成的變量共享》一文中已經(jīng)有過(guò)描述,概括而來(lái)便是:各個(gè)action共享一個(gè)閉包,導(dǎo)致其中的“i”并不是獨(dú)立的。

解決方案

解決這個(gè)問(wèn)題的方法,只需讓不同閉包訪問(wèn)的值相互獨(dú)立即可。如:

以下為引用的內(nèi)容:

List<Action> actions = new List<Action>();
for (int i = 0; i < 10; i++)
{
    int  j = i; // 新增代碼
    actions.Add(() => Console.WriteLine(j));
}

foreach (var a in actions) a();

關(guān)于“延遲”特性,您還有什么看法呢?

分享:解讀Entity Framework的默認(rèn)值BUG
前幾天常使用.Net 3.5里的Entity Framework做個(gè)網(wǎng)站的時(shí)候,發(fā)現(xiàn)了一個(gè)問(wèn)題:添加記錄時(shí),對(duì)于DateTime型的數(shù)據(jù),無(wú)法使用數(shù)據(jù)庫(kù)的默認(rèn)值。 雖然不是什么嚴(yán)重的問(wèn)題,但牛脾氣上來(lái)了 ,就行解決這個(gè)問(wèn)題。 具體的情況是這樣的,我的數(shù)據(jù)庫(kù)有個(gè)Users表,三個(gè)

來(lái)源:模板無(wú)憂//所屬分類:.Net教程/更新時(shí)間:2009-07-11
相關(guān).Net教程
午夜欧美精品久久久久久久| 亚洲国产天堂久久国产91| 欧美网站在线观看| 最新日韩中文字幕| 国产精品国色综合久久| 91n.com在线观看| 韩国一区二区在线播放| 波多野结衣国产| 成人在线分类| 在线一区视频| 亚洲精品视频在线观看网站| 亚洲欧美国产制服动漫| 99影视tv| 在线免费黄色网| 波多野结衣啪啪| xxxx日韩| 国产成人精品免费在线| 欧美美女一区二区在线观看| 国内精品伊人久久| 国产香蕉一区二区三区| 国产精品久久久久久久av| 日韩一区二区三区不卡| 欧美国产另类| 欧美性69xxxx肥| 91免费的视频在线播放| 美女一区二区三区视频| www.97超碰| 综合视频在线| 又紧又大又爽精品一区二区| www.国产一区| 一级做a爰片久久| 黄大色黄女片18免费| 成人另类视频| 国产精品麻豆一区二区| 在线精品91av| 亚洲免费在线精品一区| 亚洲码无人客一区二区三区| 欧美xx视频| 日韩精品亚洲一区二区三区免费| 狠狠色狠狠色综合日日小说| 91精品91久久久久久| 全黄性性激高免费视频| 麻豆一区产品精品蜜桃的特点| 国产精品色婷婷在线观看| 91丨九色丨国产丨porny| 亚洲精品自拍第一页| 欧美亚州在线观看| 自拍偷拍视频亚洲| 久久精品66| 久久久亚洲精品一区二区三区| 精品在线小视频| 日本熟妇人妻xxxx| 青青国产在线观看| 国语对白精品一区二区| 五月婷婷欧美视频| 国产成人精品免费久久久久| 自拍偷拍一区二区三区四区| 国产日韩一级片| 亚洲激情二区| 91国内精品野花午夜精品| 国产精品久久久久久久久男| 亚洲制服中文字幕| 亚洲国产91视频| 国产精品香蕉一区二区三区| 亚洲国语精品自产拍在线观看| 黑人巨大国产9丨视频| 免费在线视频观看| 欧美性色综合| 91久久人澡人人添人人爽欧美| 国产精品免费区二区三区观看| 日本老熟俱乐部h0930| 国产亚洲成av人片在线观黄桃| 91香蕉视频mp4| 91干在线观看| 在哪里可以看毛片| 精品视频在线播放一区二区三区| 不卡一区二区中文字幕| 亚洲天堂av电影| 99久re热视频精品98| 国产精品欧美综合亚洲| 亚洲在线视频| 欧美成人精精品一区二区频| 日韩成人在线资源| 2021亚洲天堂| 亚洲精品美女91| 亚洲美女视频网站| 日韩大片一区二区| 自拍视频在线看| 国产精品一区一区| 久久久亚洲国产| 三级网站在线免费观看| 日韩欧美中字| 狠狠操狠狠色综合网| 日本不卡一区二区三区在线观看| 亚洲成人生活片| 手机亚洲手机国产手机日韩| 黄色成人在线播放| 成人综合网网址| 久久精品国产亚洲AV无码麻豆| 欧美日一区二区| 天天影视网天天综合色在线播放| 久久国产一区二区| 国产亚洲成人av| 91精品国产乱码久久久久久久| 91久久免费观看| 一级黄色免费在线观看| 一级一级黄色片| 国产精品亚洲综合久久| 欧美成人a∨高清免费观看| 热99这里只有精品| 亚洲精品国产av| 国产成人免费在线观看不卡| 欧美在线视频播放| 先锋资源av在线| 国产成人精品福利| 欧美午夜免费电影| 日韩福利一区二区三区| 国产白浆在线观看| 国产福利91精品| 热re99久久精品国产66热| 手机在线免费看片| 女同性一区二区三区人了人一 | 色一情一乱一乱一91av| 国产另类自拍| 一区二区三区亚洲视频| 欧美a级理论片| 在线电影av不卡网址| 日本wwww色| 乱中年女人伦av一区二区| 欧美另类久久久品| 久久综合久久色| 黄色精品视频| 国产精品久久久久久久久图文区 | 日韩av大全| 天天摸天天干天天操| a在线播放不卡| 欧美在线一区二区视频| 国内偷拍精品视频| 久久精品国产第一区二区三区| 伊人青青综合网站| 最近日本中文字幕| 精品福利久久久| 日韩精品在线播放| 欧美做受高潮中文字幕| 日本久久成人网| 在线观看亚洲一区| 在线不卡视频一区二区| 精品国产av一区二区三区| 国产精品免费看片| 翔田千里亚洲一二三区| 国产乱叫456在线| 国产精品超碰97尤物18| 99re视频在线播放| 国产精品一区二区黑人巨大 | 香蕉成人伊视频在线观看| 男人的天堂视频在线| 麻豆一区在线| 欧美大片在线观看一区二区| 你真棒插曲来救救我在线观看| 精品国产不卡一区二区| 欧美一级爆毛片| 无码播放一区二区三区| 九七影院97影院理论片久久 | 亚洲黄色在线网站| 全球成人免费直播| 精品国产污网站| 国产精品无码一本二本三本色| 亚洲精品三区| 在线不卡欧美精品一区二区三区| 久久99爱视频| 亚洲欧洲中文字幕| 欧美激情第一页xxx| 日本一级免费视频| 蜜桃久久久久久| 91精品成人久久| 久草手机在线视频| 国产99精品视频| 国产精品久久9| 日韩精品久久久久久久酒店| 美女免费视频一区二区| 91精品国产自产在线老师啪| 日本五十路女优| 久久99精品久久久| 57pao成人国产永久免费| 亚洲熟女毛茸茸| 久久精品毛片| 亚洲18私人小影院| 538任你躁在线精品视频网站| 国产精品88av| 欧美h视频在线| 亚洲高清视频网站| 欧美日韩性视频| 亚洲一二三不卡| 国产视频亚洲| 国产欧美一区二区三区久久人妖| 亚洲成人一级片| 在线观看一区二区视频| 日批免费观看视频| 日本不卡一区二区三区高清视频| 亚洲在线免费视频| 中国a一片一级一片| 一区二区三区高清不卡| 亚洲最大色综合成人av| baoyu135国产精品免费| 国产亚洲人成a一在线v站| 加勒比精品视频| 九九国产精品视频| 精品久久久久亚洲| 噜噜噜久久,亚洲精品国产品| 中文字幕在线观看一区| 男人添女人荫蒂免费视频| 欧美一区三区| 91av在线网站| 国产日韩欧美中文字幕| 91高清视频在线| 熟妇高潮一区二区| 亚洲黄网站黄| 91网站在线看| 日韩一区精品| 日韩精品视频免费专区在线播放| 艳妇乳肉豪妇荡乳xxx| 美女视频免费一区| 久久久99爱| 视频精品国内| 亚洲国产精品99| 污污污www精品国产网站| 美日韩一级片在线观看| 麻豆成人在线播放| 欧美日韩直播| 欧美激情一区二区三区久久久| 欧美日韩精品亚洲精品| 中文字幕乱码一区二区免费| 亚洲丰满在线| 国产伦一区二区三区| 一本一道久久a久久精品逆3p| 欧美日韩在线国产| 亚洲视频小说图片| 菠萝蜜视频在线观看入口| 国产精品网在线观看| 久久精品国产成人| 欧美日韩大片在线观看| 国产精品电影院| 国产又大又黄又粗的视频| 美女精品在线观看| 久久综合毛片| 日本成人7777| 欧美一性一乱一交一视频| 天堂网在线播放| 亚洲成人av在线| 亚洲精品在线观看av| 一级特黄大欧美久久久| 三级网站免费看| 久久精品一区| 欧美日韩高清在线一区| 五月国产精品| 久久黄色av网站| 一级全黄少妇性色生活片| 欧美日韩一区不卡| 久久久久亚洲av成人网人人软件| 国产麻豆精品theporn| 中文字幕一区二区三区有限公司| 欧美激情成人| 成人av在线网址| 日韩在线一区二区三区四区| 亚洲精品在线电影| 欧美三日本三级少妇99| 欧美视频在线观看 亚洲欧| 蜜桃传媒一区二区亚洲av| 麻豆成人久久精品二区三区小说| 午夜视频久久久| 天天做天天爱天天爽综合网| 91国产精品电影| 亚洲永久av| 日韩免费福利电影在线观看| 亚洲国产美女视频| 亚洲国产精品麻豆| 亚洲欧美日韩一级| 麻豆91精品91久久久的内涵| 综合操久久久| 亚洲国产裸拍裸体视频在线观看乱了中文 | 91大神在线观看线路一区| 日韩精品一区在线观看| 国产亚洲欧美精品久久久www | 美女黄色成人网| 一本一道久久a久久精品综合| 综合久久亚洲| 久久99精品久久久水蜜桃| 欧美偷拍自拍| 超碰国产精品久久国产精品99| 婷婷亚洲成人| 成人在线视频网| 日韩欧美影院| 91久久在线视频| 欧亚精品一区| 成人午夜激情免费视频| 好吊妞视频这里有精品 | 97免费高清电视剧观看| 88xx成人网| 久久99国产综合精品女同| 国产精品成人无码| 日韩午夜在线影院| 丁香六月婷婷综合| 在线播放视频一区| 成人性生活免费看| 国产精品久久久久三级| 男人网站在线观看| 国产精品久久毛片av大全日韩| 欧美做受高潮中文字幕| 国产精品久久久久一区| 亚洲黄色免费在线观看| 中文字幕在线观看不卡| 国产一卡二卡三卡四卡| 国产精品蜜臀av| 免费中文字幕av| 亚洲精品成人少妇| 久久久久亚洲AV成人无在| 亚洲成av人综合在线观看| 国产jizz18女人高潮| 中文字幕一区二区三区在线观看| 少妇搡bbbb搡bbb搡打电话| 国产精品久久久久久久久果冻传媒| 中国xxxx性xxxx产国| 亚洲女厕所小便bbb| 手机看片日韩av| 黑人精品xxx一区一二区| 国产盗摄一区二区三区在线| 欧美午夜精品免费| 亚洲欧美在线观看视频| 日韩欧美一二区| 国产精品永久久久久久久久久| 亚洲欧美国内爽妇网| 欧美亚洲精品在线观看| 欧美精品在线观看| 高潮一区二区三区乱码| 按摩亚洲人久久| 欧美成人xxxx| 国产精品免费小视频| 精品美女视频| 欧美一级片免费观看| 亚洲一区二区三区免费在线观看 | 蜜臀av免费观看| 国产片一区二区| 中文字幕第一页在线视频| 国产欧美一区二区精品性| 日韩乱码人妻无码中文字幕久久| 欧美日韩中文字幕在线视频| 日本学生初尝黑人巨免费视频| 亚洲成人中文字幕| 黄片毛片在线看| 国产69精品久久久久99| 国产精品tv| 国内精品久久久久久久果冻传媒| 久久av中文| 91色精品视频在线| 亚洲高清影视| 警花观音坐莲激情销魂小说| 国产资源在线一区| 国产综合av在线| 91亚洲男人天堂| 女同激情久久av久久| hitomi一区二区三区精品| 国产一卡二卡三卡四卡| 精品成人国产在线观看男人呻吟| 日韩免费观看一区二区| 日韩电影网在线| 欧美二三四区| 国产在线观看91精品一区| 2023国产精品久久久精品双| 无码人妻aⅴ一区二区三区日本| 国产精品一区二区久久精品爱涩| 日本中文字幕精品| 中文字幕欧美国产| 成人在线观看免费高清| 欧美精品粉嫩高潮一区二区| 99精品免费观看| 久久久久久12| 神马久久一区二区三区| 亚洲免费视频一区| 国产91精品一区二区麻豆亚洲| 天天躁日日躁狠狠躁av麻豆男男| 欧美日在线观看| 91麻豆国产在线| 久久乐国产精品| 日本a级不卡| 99在线免费视频观看| 国产亚洲一区字幕| 国产激情视频网站| 日本高清成人免费播放| 国产一区二区麻豆| 午夜精品久久久99热福利| av一区二区在线播放| 99亚洲国产精品| 久久女同性恋中文字幕| 日本一级大毛片a一| 色国产综合视频| a级片在线播放| 国产91精品最新在线播放| 欧美精品国产白浆久久久久| 日韩免费av电影| 高清不卡一区二区在线|