2014-03-12 78 views
1

我看到很多的代碼,其中所述對象被設置爲空的finally部分或在方法結束時,例如:爲什麼使用後應該將對象設置爲null是否有原因?

 [WebMethod] 
     [ScriptMethod(ResponseFormat = ResponseFormat.Json)] 
     public void buildUpdates(int batchId, string mkt) 
     { 
      aplUpdate oDU; 
      DataSet ds; 
      DataTable dtTbls; 
      DataTable dtData; 
      List<dbVer> resp; 

      try 
      { 
       oDU = new WEB_APL.APL.aplUpdate(MyWeb.Properties.Settings.Default.DBCon); 

       ds = new DataSet(); 
       ds.DataSetName = batchId.ToString(); 
       dtTbls = oDU.getDetails(true); 
       resp=GetDBVersions(); 

       foreach (DataRow dr in dtTbls.Rows) 
       { 
        .....    
       } 
       ds.WriteXml(HttpContext.Current.Server.MapPath("~") + "\\" + ds.DataSetName + ".xml", XmlWriteMode.WriteSchema); 

      } 
      catch (Exception ex) 
      { 
       throw ex; 
      } 
      finally 
      { 
       oDU = null; 
       ds=null; 
       rest=null; 
       dtTbls=null; 
       dtData=null; 
      } 
     } 

我認爲這是unnessesary因爲過期的對象將被自動處理.NET garbage collector

是否有理由重置爲null

+0

[嗎?您需要處置的對象,並將它們設置爲null(HTTP的可能重複://計算器。com/questions/2926869/do-you-need-to-dispose-of-objects-and-set-them-to-null)或[在.NET中使用後將對象設置爲Null/Nothing](http:// stackoverflow .com/questions/2785/setting-objects-null-null-nothing-in-net) –

回答

1

其實它不會自動處理。

問題是,只要例如oDU被引用,它就不能被收集。這意味着,基本上如果你的持有對象沒有收集,那麼引用不能被收集。 GOOD風格是爲了在你不再需要它們時清除引用。至少對於類/結構級變量。

現在,在這種特殊情況下,它是完全不需要的。 GC與此無關。這與所有這些變量對於方法來說都是局部的,所以它們無論如何都在方法結束時超出了範圍(並且在運行時早些時候,一旦它們超出了範圍)。

因此,它完全是多餘的。

+0

所以一旦它們超出範圍,它們會被GC清理,當它覺得這樣做? –

+0

是的。因爲它們根本沒有被引用,GC最終會收集它們。這裏的核心是「當感覺這樣做」。 – TomTom

1

如果它們是局部變量,,這是沒有意義的。這可能是一種傳統習慣。

如果他們是類級別的變量,它可能是有道理的。取決於使用。

編輯:

 catch (Exception ex) 
     { 
      throw ex; 
     } 

然而,這是一個虛假的-PAS。這會削弱堆棧跟蹤。如果您不想處理異常,請不要使用catch塊,也不要使用不帶變量的throw關鍵字,以便堆棧跟蹤保持不變。

 catch (Exception ex) 
     { 
      throw; 
     } 
+0

謝謝你注意到這個問題。 –

+0

嘿@nvoigt如果你喜歡做這樣的風格建議和類似的,你如何給[codereview.se]一個訪問?我相信你會喜歡它:) – Vogel612

1

這可能是爲了防止對事物如內存泄漏和不必要的資源鎖:

  • 數據庫連接
  • 文件
  • 一般可鎖定並一次性對象

這是行不通的
將對象(特別是連接和流)設置爲null不會乾淨地處置/關閉它們,實際上在代碼中它完全沒用噪聲

你應該使用using語句,類似於下面的例子:

using (IDisposable thingy = new FileStream("filepath/connection/whatever"){ 
    //do something with thingy 
} 
+2

只是這並不妨礙他們。這簡直是​​多餘的。使用塊確實會有所幫助,將其設置爲空是...死代碼。 – nvoigt

相關問題