第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號安全,請及時(shí)綁定郵箱和手機(jī)立即綁定
已解決430363個(gè)問題,去搜搜看,總會(huì)有你想問的

foreach標(biāo)識符和閉包

foreach標(biāo)識符和閉包

富國滬深 2019-07-02 17:29:02
在下面的兩個(gè)片段中,第一個(gè)是安全的,還是必須執(zhí)行第二個(gè)?安全地說,我的意思是每個(gè)線程是否保證從創(chuàng)建線程的同一個(gè)循環(huán)迭代中調(diào)用foo上的方法?或者必須將對新變量“l(fā)ocal”的引用復(fù)制到循環(huán)的每一次迭代中?var threads = new List<Thread>();foreach (Foo f in ListOfFoo){           Thread thread = new Thread(() => f.DoSomething());     threads.Add(thread);     thread.Start();}-var threads = new List<Thread>();foreach (Foo f in ListOfFoo){           Foo f2 = f;     Thread thread = new Thread(() => f2.DoSomething());     threads.Add(thread);     thread.Start();}最新情況:正如JonSkeet的答案所指出的,這與線程無關(guān)。foreach標(biāo)識符和閉包
查看完整描述

3 回答

?
慕桂英3389331

TA貢獻(xiàn)2036條經(jīng)驗(yàn) 獲得超8個(gè)贊

這是C#5中的所有更改,并對定義變量的位置進(jìn)行了更改(在編譯器的眼里)。從…C#5以后,它們是相同的.


在C#5之前

第二個(gè)是安全的,第一個(gè)是不安全的。

帶著foreach,變量被聲明。循環(huán)-即

Foo f;while(iterator.MoveNext()){
     f = iterator.Current;
    // do something with f}

這意味著只有一個(gè)f就閉包范圍而言,線程很可能會(huì)感到困惑-在某些實(shí)例上多次調(diào)用該方法,而對其他實(shí)例則完全不調(diào)用。您可以通過第二個(gè)變量聲明來修復(fù)這個(gè)問題。內(nèi)循環(huán):

foreach(Foo f in ...) {
    Foo tmp = f;
    // do something with tmp}

然后這里有一個(gè)單獨(dú)的tmp在每個(gè)關(guān)閉范圍內(nèi),因此不存在此問題的風(fēng)險(xiǎn)。

以下是這個(gè)問題的一個(gè)簡單證明:

    static void Main()
    {
        int[] data = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 };
        foreach (int i in data)
        {
            new Thread(() => Console.WriteLine(i)).Start();
        }
        Console.ReadLine();
    }

產(chǎn)出(隨機(jī)):

1
3
4
4
5
7
7
8
9
9

添加一個(gè)臨時(shí)變量,它可以工作:

        foreach (int i in data)
        {
            int j = i;
            new Thread(() => Console.WriteLine(j)).Start();
        }

(每個(gè)數(shù)字一次,但訂單當(dāng)然不能保證)


查看完整回答
反對 回復(fù) 2019-07-02
?
胡說叔叔

TA貢獻(xiàn)1804條經(jīng)驗(yàn) 獲得超8個(gè)贊

波普·卡特林和馬克·格雷維爾的答案是正確的。我只想添加一個(gè)鏈接到我關(guān)于閉包的文章(討論Java和C#)。只是覺得它可能會(huì)增加一點(diǎn)價(jià)值。

編輯:我認(rèn)為值得舉一個(gè)沒有線程不可預(yù)測性的例子。這里有一個(gè)簡短但完整的程序,展示了這兩種方法?!皦膭?dòng)作”列表打印10次,“好動(dòng)作”列表從0到9。

using System;using System.Collections.Generic;class Test{
    static void Main() 
    {
        List<Action> badActions = new List<Action>();
        List<Action> goodActions = new List<Action>();
        for (int i=0; i < 10; i++)
        {
            int copy = i;
            badActions.Add(() => Console.WriteLine(i));
            goodActions.Add(() => Console.WriteLine(copy));
        }
        Console.WriteLine("Bad actions:");
        foreach (Action action in badActions)
        {
            action();
        }
        Console.WriteLine("Good actions:");
        foreach (Action action in goodActions)
        {
            action();
        }
    }}


查看完整回答
反對 回復(fù) 2019-07-02
  • 3 回答
  • 0 關(guān)注
  • 871 瀏覽

添加回答

舉報(bào)

0/150
提交
取消
微信客服

購課補(bǔ)貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動(dòng)學(xué)習(xí)伙伴

公眾號

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號