我有以下方法:
public byte[] HtmlToDoc(string hmtl, string userId)
{
byte[] data;
var auditor = new ServiceAuditor
{
User = userId
};
try
{
using (var tx = new ServerText())
{
tx.Create();
tx.Load(Server.HtmlDecode(hmtl), StringStreamType.HTMLFormat);
tx.Save(out data, BinaryStreamType.MSWord);
}
}
catch (Exception e)
{
auditor.Errormessage = e.Message + "/n " + e.StackTrace;
data = new byte[0];
}
finally
{
auditor.Save();
auditor.Dispose();
}
return data;
}
我在编译期间收到以下警告:
警告CA2000:Microsoft.Reliability:在方法中 ' DocCreator.HtmlToDoc(字符串,字符串)',对象'新的ServiceAuditor()' 并未沿所有异常路径放置。呼叫 System.IDisposable.Dispose on object' new ServiceAuditor()'毕竟 对它的引用超出了范围。
奇怪的是,即使我正在处理这个物体,我也不明白它为什么会抱怨。 你能指出问题在哪里吗?
答案 0 :(得分:4)
你遇到的问题是这一行:
auditor.Save();
如果抛出异常,则不会运行负责处理auditor
对象的下一行。因此,您可以将Save
调用包装在另一个try
/ catch
中,但实际上您应该依赖using
语句为您执行此操作,因为它隐式调用{ {1}}方法,例如:
Dispose
答案 1 :(得分:0)
感谢@DavidG的回复,肯定在提到的行中有一个错误点,但导致警告的是对象的初始化:
//Add using statement here and wrap it around the rest of the code
using(var auditor = new ServiceAuditor { User = userId })
{
try
{ ...
应该是:
using(var auditor = new ServiceAuditor())
{
auditor.User = userId;
try
{ ...
找到了此问题的参考
初始化一次性物品的成员不应该在 使用声明的构造函数。