是否有理由将对象在使用后设置为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
有什么原因吗?
实际上它不是自动处理的。
问题在于,只要引用了例如oDU,它就不能被收集。这意味着如果你的持有对象没有被收集那么引用也不能被收集。好的风格是当你不再需要引用时清除它们。至少对于类/结构级变量是这样。
现在,在这个特殊情况下,它是完全不需要的。GC与此无关。
与此有关的是,所有这些变量都是方法的局部变量,因此它们无论如何都会在方法结束时超出作用域(并且在运行时更早,一旦它们超出作用域)。
如果它们是局部变量,没有,则没有意义。这可能是一个遗留的习惯。
如果它们是类级变量,则可能有意义。
编辑: catch (Exception ex)
{
throw ex;
}
然而,这是失礼的。这将削弱堆栈跟踪。如果你不想处理异常,不要使用catch块或使用throw关键字而不带变量,以保持堆栈跟踪的完整性。
catch (Exception ex)
{
throw;
}
这可能是为了防止内存泄漏和不必要的资源锁,如:
- 数据库连接文件
- 一般可锁定和一次性对象
这行不通
将对象(特别是连接和流)设置为null并不能清除或关闭它们,事实上,它在代码中完全没有用噪声。
using (IDisposable thingy = new FileStream("filepath/connection/whatever"){
//do something with thingy
}