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

本文关键字:设置 null 有理由 对象 是否 | 更新日期: 2023-09-27 17:49:34

我看到很多代码在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有什么原因吗?

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

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

问题在于,只要引用了例如oDU,它就不能被收集。这意味着如果你的持有对象没有被收集那么引用也不能被收集。好的风格是当你不再需要引用时清除它们。至少对于类/结构级变量是这样。

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

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

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

如果它们是类级变量,则可能有意义。

编辑:

        catch (Exception ex)
        {
            throw ex;
        }

然而,这是失礼的。这将削弱堆栈跟踪。如果你不想处理异常,不要使用catch块或使用throw关键字而不带变量,以保持堆栈跟踪的完整性。

        catch (Exception ex)
        {
            throw;
        }

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

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

这行不通
将对象(特别是连接和流)设置为null并不能清除或关闭它们,事实上,它在代码中完全没有用噪声

你应该使用using语句,类似于下面的例子:
using (IDisposable thingy = new FileStream("filepath/connection/whatever"){
   //do something with thingy
}