局部变量是否需要在方法中被取消/处理?

时间:2017-09-27 17:14:38

标签: c# dispose

我已经看到了这样的代码块,并且无法理解为什么在这种情况下需要finally阻止。你能告诉我当地的变量是否需要在方法中被取消/处理?

private void ParseNewsXMLAndPopulateNewsList(string xmlToParse)
{
    string title = null;
    XmlDocument rawXmlDoc = new XmlDocument();

    try
    {
        rawXmlDoc.LoadXml(xmlToParse);
        foreach (XmlNode currentEvent in rawXmlDoc.SelectNodes(@"//event"))
        {
            title = string.IsNullOrEmpty(currentEvent.SelectSingleNode("title").InnerText) ? "" : currentEvent.SelectSingleNode("title").InnerText;
            _SmthGlobalObject.Add(title); 
        }

    }
    catch (Exception e)    {    throw e;    }
    finally
    {
        title = null;
        rawXmlDoc = null;
    }
}

2 个答案:

答案 0 :(得分:2)

在这样的代码中,您不需要将变量显式设置为null。如果对象实现了IDisposable,则应该绝对调用Dispose方法,否则可以允许它们超出范围。如果代码处于长时间运行的过程中,它们将长时间保留在范围内并且是资源密集型的,我可能会给你其他建议,但这将是例外,而不是规则。

答案 1 :(得分:2)

  

我见过这样的代码块,并且无法理解为什么在这种情况下需要finally块。

你无法理解它,因为不需要finally块。它应该删除。

  

在方法中对局部变量进行归零/处理吗?

置空?没有。处理? 即可。持有不属于该方法之外的代码的一次性本地的本地人应尽快处置。通常你会使用using语句来做到这一点。

你没问过的问题:

  

这种方法还有什么问题吗?

是。捕获然后再次抛出是最糟糕的做法,因为这样做会改变异常的堆栈跟踪。这种做法使开发人员更难以追踪异常的原因,因为跟踪将在ParseNewsXMLAndPopulateNewsList中被截断,并且不包括有关抛出的方法的实际跟踪的信息。

如果你必须抓住并重新抛出,最佳做法是

try { whatever } 
catch (Exception ex) 
{ 
  // something here -- log the exception, say
  throw;
}

裸“抛出”意味着“无需修改即可重新抛出当前异常”。

  

还有别的吗?

我不喜欢无缘无故地重写已调试的工作代码。但我确实注意到这种方法可能会更短,更短。你有十个陈述,其中三个会做得很好:

private void ParseNewsXMLAndPopulateNewsList(string xmlToParse)
{
  XmlDocument rawXmlDoc = new XmlDocument();
  rawXmlDoc.LoadXml(xmlToParse);
  _SmthGlobalObject.AddRange(
    rawXmlDoc
      .SelectNodes(@"//event")
      .Select(e => e.SelectSingleNode("title").InnerText));
}

对我来说,这似乎更清晰,更直接。我们在做什么?加载文档,提取事件,将其标题添加到列表中。所以就这样做。