同桌上课用手指进去了好爽_欧美丰满熟妇xxⅹⅹ性大i_成人av天天日天天拍拍_猛男gay帅男gay男男同志_欧美va天堂在线观看_人妻无码av中文系列三里桃花_亚欧免费无码在线观看_久久久精品国产亚洲av水_日韩在线免费看污污污_2021无码专区人妻系列日韩

首頁 優(yōu)化推廣 .NET中*延遲*特性的幾個陷阱

.NET中*延遲*特性的幾個陷阱

來源: | 時間:2012/12/25 21:17:21 |

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

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

  重復(fù)運算

  問題

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

 


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

 


   List values = new List();
  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é)果如下:

 


      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),無論是在遍歷divideByTwoAndThree和divideByTwoAndFive序列時,都會從原有的values序列里重新判斷每個元素是否能夠被2整除?這就是.NET 3.5中“Where”的延遲特性,如果您在這里沒有意識到這點,就可能會產(chǎn)生重復(fù)計算,浪費了計算能力。

  解決方案

  解決這個問題的方法就是在合適的時候進行“強制計算”。例如:

 


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

 

  結(jié)果就變成了:

 


  0 can be 

服務(wù)熱線

153 8323 9821

功能和特性

價格和優(yōu)惠

網(wǎng)站和維護

推廣和優(yōu)化

微信服務(wù)號

<button id="c0w00"></button><input id="c0w00"><acronym id="c0w00"></acronym></input><tfoot id="c0w00"></tfoot>
  • <source id="c0w00"></source>
      • <sup id="c0w00"><tr id="c0w00"></tr></sup>
        <center id="c0w00"></center>