2014-03-12 46 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

相关问题