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