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