我正在编写一种重置日志系统的方法。我需要获取 CsvFileLogWriter (自定义类)的实例并将其传递给 reset 方法。CsvFileLogWriter 是一次性的,所以我收到一个 CA2000 警告告诉我:
Warning 2 CA2000 : Microsoft.Reliability : In method 'Logger.InitializeCsvLogger
(string)', call System.IDisposable.Dispose on object 'tempWriter'
before all references to it are out of scope.
我已按照与 CA2000 相关的说明进行操作,最终得到以下方法。但是,我仍然收到 CA2000 警告。
public static void InitializeCsvLogger(string path)
{
ILogWriter tempWriter = null;
try
{
tempWriter = new CsvFileLogWriter(path);
ResetWriter(tempWriter);
tempWriter = null;
}
finally
{
if (tempWriter != null)
tempWriter.Dispose();
}
}
有人可以发现我的错误吗?
编辑
我不希望处理tempWriter引用的 writer - 这不是临时对象,只是临时引用。我只在 try 块中出现故障时才处理它(因此tempWriter永远不会设置为 null 并且 finally 块中的 if 语句会清除资源。)除非发生此故障,否则我不希望tempWriter处理 -在由ResetWriter(tempWriter)在属性中设置后,对象本身必须保持使用状态。这是根据 CA2000 规则 - 请参阅http://msdn.microsoft.com/en-us/library/ms182289.aspx?queryresult=true
为了澄清起见,这是ResetWriter所做的 - Writer是一个静态属性。该方法处理旧写入器并设置新写入器。
private static void ResetWriter(ILogWriter newWriter)
{
if (Writer != null)
Writer.Dispose();
Writer = newWriter;
}
编辑
我认为正如SLaks所说,这是一个误报。如果我获取 ResetWriter 的内容并将它们代替对 ResetWriter 的调用(本质上是反转提取方法重构),CA2000 就会消失。
或者换句话说,以下内容不会发出 CA2000 警告:
public static void InitializeCsvLogger(string path)
{
ILogWriter tempWriter = null;
try
{
tempWriter = new CsvFileLogWriter(path);
if (Writer != null)
Writer.Dispose();
Writer = tempWriter;
tempWriter = null;
}
finally
{
if (tempWriter != null)
tempWriter.Dispose();
}
}