C# 是否有理由在使用后将对象设置为null?
我在C# 是否有理由在使用后将对象设置为null?,c#,null,garbage-collection,C#,Null,Garbage Collection,我在finally部分或方法末尾看到很多对象设置为null的代码,例如: [WebMethod] [ScriptMethod(ResponseFormat = ResponseFormat.Json)] public void buildUpdates(int batchId, string mkt) { aplUpdate oDU; DataSet ds; D
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;
}
}
[WebMethod]
[ScriptMethod(ResponseFormat=ResponseFormat.Json)]
公共void buildUpdates(int-batchId,string-mkt)
{
APLODU;
数据集ds;
数据表dtTbls;
数据表dtData;
分别列出;
尝试
{
oDU=newweb\u APL.APL.aplUpdate(MyWeb.Properties.Settings.Default.DBCon);
ds=新数据集();
ds.DataSetName=batchId.ToString();
dtTbls=oDU.getDetails(true);
resp=GetDBVersions();
foreach(dtTbls.Rows中的数据行dr)
{
.....
}
ds.WriteXml(HttpContext.Current.Server.MapPath(“~”+“\\”+ds.DataSetName+”.xml),XmlWriteMode.WriteSchema);
}
捕获(例外情况除外)
{
掷骰子;
}
最后
{
oDU=null;
ds=null;
rest=null;
dtTbls=null;
dtData=null;
}
}
我认为这是不必要的,因为过期的对象将由.NET垃圾收集器自动处理
是否有理由重置为null
如果它们是局部变量,否,则没有意义。这可能是一种传统习惯
如果它们是类级别的变量,则可能有意义。取决于用途
编辑:
catch (Exception ex)
{
throw ex;
}
然而,这是一种失礼。这将破坏堆栈跟踪。如果您不想处理异常,请不要使用catch块或使用不带变量的throw关键字,这样stacktrace就保持不变
catch (Exception ex)
{
throw;
}
如果它们是局部变量,否,则没有意义。这可能是一种传统习惯
如果它们是类级别的变量,则可能有意义。取决于用途
编辑:
catch (Exception ex)
{
throw ex;
}
然而,这是一种失礼。这将破坏堆栈跟踪。如果您不想处理异常,请不要使用catch块或使用不带变量的throw关键字,这样stacktrace就保持不变
catch (Exception ex)
{
throw;
}
实际上,它不是自动处理的
问题是,只要引用例如oDU,就无法收集它。这意味着,基本上如果你的持有对象没有被收集,那么引用就不能被收集。好的风格是在不再需要引用时清除引用。至少对于类/结构级变量
现在,在这种特殊情况下,它是完全不需要的。GC与此无关
与此相关的是,所有这些变量都是方法的局部变量,因此在方法结束时(以及在运行时早期,一旦它们超出范围),它们都会超出范围
因此,它完全是多余的。实际上,它不是自动处理的
问题是,只要引用例如oDU,就无法收集它。这意味着,基本上如果你的持有对象没有被收集,那么引用就不能被收集。好的风格是在不再需要引用时清除引用。至少对于类/结构级变量
现在,在这种特殊情况下,它是完全不需要的。GC与此无关
与此相关的是,所有这些变量都是方法的局部变量,因此在方法结束时(以及在运行时早期,一旦它们超出范围),它们都会超出范围
因此,它完全是冗余的。这可能是为了防止内存泄漏和不必要的资源锁定,例如:
- 数据库连接
- 档案
- 溪流
- 一般可上锁和一次性物品
这不起作用
将对象(尤其是连接和流)设置为null并不能干净地处理/关闭它们,事实上,在代码中这完全是无用的
您应该改为使用using语句,类似于以下示例:
using (IDisposable thingy = new FileStream("filepath/connection/whatever"){
//do something with thingy
}
这可能是为了防止内存泄漏和不必要的资源锁定,例如:
- 数据库连接
- 档案
- 溪流
- 一般可上锁和一次性物品
这不起作用
将对象(尤其是连接和流)设置为null并不能干净地处理/关闭它们,事实上,在代码中这完全是无用的
您应该改为使用using语句,类似于以下示例:
using (IDisposable thingy = new FileStream("filepath/connection/whatever"){
//do something with thingy
}
可能的重复或可能的重复,或只是它不能阻止它们。这完全是多余的。使用块确实会有帮助,将其设置为null是。。。死代码。只是它不能阻止它们。这完全是多余的。使用块确实会有帮助,将其设置为null是。。。死代码。所以一旦它们超出范围,GC会在感觉需要时清理它们?是的。由于它们根本没有被引用,GC最终将收集它们。这里的核心是“当它觉得这样做的时候”。所以一旦它们超出范围,GC会在它觉得这样做的时候清理它们?是的。由于它们根本没有被引用,GC最终将收集它们。这里的核心是“当你觉得这样做的时候”。感谢你注意到这个问题。嘿@nvoigt如果你喜欢做这样的风格建议和类似的事情,你去看看怎么样?我相信你会喜欢它:)谢谢你注意到扔ex。嘿@nvoigt如果你喜欢做这样的风格建议和类似的,你去看看怎么样?我相信你会喜欢的:)