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

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

C#在預(yù)見中重用變量有什么原因嗎?

C#在預(yù)見中重用變量有什么原因嗎?

慕桂英3389331 2019-06-09 15:42:14
C#在預(yù)見中重用變量有什么原因嗎?在C#中使用lambda表達(dá)式或匿名方法時(shí),我們必須警惕訪問修改后的閉包陷阱。例如:foreach (var s in strings){    query = query.Where(i => i.Prop == s); // access to modified closure    ...}由于修改了閉包,上述代碼將導(dǎo)致所有Where的最后一個(gè)值為基礎(chǔ)的查詢中的子句。s.如所解釋這里,這是因?yàn)閟中聲明的變量foreach上面的循環(huán)在編譯器中是這樣翻譯的:string s;while (enumerator.MoveNext()){    s = enumerator.Current;    ...}而不是這樣:while (enumerator.MoveNext()){    string s;    s = enumerator.Current;    ...}如前所述這里,在循環(huán)之外聲明變量沒有任何性能優(yōu)勢,在正常情況下,我能想到這樣做的唯一原因是如果您計(jì)劃在循環(huán)范圍之外使用該變量:string s;while (enumerator.MoveNext()){    s = enumerator.Current;    ...}var finalString = s;中定義的變量。foreach循環(huán)不能在循環(huán)之外使用:foreach(string s in strings){}var finalString = s; // won't work: you're outside the scope.因此,編譯器聲明變量的方式使它非常容易出錯(cuò),而錯(cuò)誤通常很難找到和調(diào)試,同時(shí)也不會(huì)產(chǎn)生任何可感知的好處。你有什么可以用的嗎?foreach循環(huán)是這樣的,如果它們是用內(nèi)部作用域變量編譯的,或者這只是在匿名方法和lambda表達(dá)式可用或通用之前所做的任意選擇,而且從那時(shí)起就沒有修改過?
查看完整描述

3 回答

?
婷婷同學(xué)_

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

你要問的是埃里克·利珀特在他的博客文章中詳細(xì)介紹了他的問題。關(guān)閉被認(rèn)為有害的循環(huán)變量還有它的續(xù)集。

對我來說,最有說服力的論點(diǎn)是,在每次迭代中使用新變量將不符合for(;;)樣式循環(huán)。你想要一個(gè)新的int i在每一次迭代中for (int i = 0; i < 10; i++)?

這種行為最常見的問題是對迭代變量進(jìn)行閉包,并且有一個(gè)簡單的解決方法:

foreach (var s in strings){
    var s_for_closure = s;
    query = query.Where(i => i.Prop == s_for_closure); // access to modified closure

我在博客上發(fā)表了關(guān)于這個(gè)問題的文章:C#中Foreach變量的閉包.


查看完整回答
反對 回復(fù) 2019-06-09
?
躍然一笑

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

被這樣咬過之后,我習(xí)慣于將本地定義的變量包含在最內(nèi)部的范圍中,用于轉(zhuǎn)移到任何閉包。在你的例子中:

foreach (var s in strings){
    query = query.Where(i => i.Prop == s); // access to modified closure

我知道:

foreach (var s in strings){
    string search = s;
    query = query.Where(i => i.Prop == search); // New definition ensures unique per iteration.

一旦你有了這個(gè)習(xí)慣,你就可以在非常罕見的情況,您實(shí)際上打算綁定到外部作用域。老實(shí)說,我從來沒有這樣做過。


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

添加回答

舉報(bào)

0/150
提交
取消
微信客服

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

幫助反饋 APP下載

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

公眾號

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