我已经看到了这样的代码块,并且无法理解为什么在这种情况下需要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;
}
}
答案 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));
}
对我来说,这似乎更清晰,更直接。我们在做什么?加载文档,提取事件,将其标题添加到列表中。所以就这样做。