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í)起就沒有修改過?
C#在預(yù)見中重用變量有什么原因嗎?
慕桂英3389331
2019-06-09 15:42:14