是否有理由在使用后将对象设置为null?

时间:2014-03-12 08:34:55

标签: c# null garbage-collection

我看到很多代码在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;
            }
        }

我认为这是无关紧要的,因为过期的对象将由.NET garbage collector自动处理。

是否有理由重置为null

3 个答案:

答案 0 :(得分:2)

实际上它不是自动处理的。

问题在于,只要引用oDU,就无法收集它。这意味着基本上如果没有收集您的保留对象,则无法收集引用。 GOOD风格是在你不再需要它们时清除引用。至少对于类/结构级变量。

现在,在这种特殊情况下,完全不需要它。 GC与此无关。

与此有关的是所有这些变量都是方法的本地变量,因此它们在方法结束时无论如何都会超出范围(并且在运行时更早,一旦它们超出范围)。

因此它完全是多余的。

答案 1 :(得分:1)

如果它们是局部变量,,则没有意义。这可能是一种遗留习惯。

如果它们是类级变量,则可能有意义。取决于使用。

修改

        catch (Exception ex)
        {
            throw ex;
        }
然而,这是一个失礼。这将削弱堆栈跟踪。如果您不想处理异常,请不要使用catch块或使用不带变量的throw关键字,以便堆栈跟踪保持不变。

        catch (Exception ex)
        {
            throw;
        }

答案 2 :(得分:1)

这可能是为了防止内存泄漏和不需要的资源锁定,例如:

  • 数据库连接
  • 文件
  • 一般可锁定和一次性物品

这不起作用
将对象(尤其是连接和流)设置为null并不会干净地处理/关闭它们,实际上它在您的代码中完全没用噪声

您应该使用using语句,类似于以下示例:

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