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如果你喜欢做这样的风格建议和类似的,你去看看怎么样?我相信你会喜欢的:)