IDisposable
模式中使用private void Dispose(bool)
。但是这似乎已经过时了(至少对于未密封的类),因为最新的建议模式(根据微软)是protected virtual void Dispose(bool)
。问题是,代码分析并没有报告
private void Dispose(bool)
违反了CA1063,即使它似乎直接违反了该模式。这是怎么回事?
private void Dispose(bool)
是否以某种方式被调用(或编译为类似于protected virtual Dispose(bool)
的内容)?如果这是Code Analysis的问题,并且是不正确的模式,那么是否有方法来检测这个问题?也许可以使用StyleCop?
编辑:经过考虑,是因为基类可以调用
base.Dispose()
,从而触发private void Dispose(bool)
吗?即使无法传递参数?编辑:示例
public class A : IDisposable
{
~A()
{
this.Dispose(false);
}
public void Dispose()
{
this.Dispose(true);
GC.SuppressFinalize(this);
}
private void Dispose(bool disposing) // Should be protected virtual void Dispose(bool)
{
Console.WriteLine("A");
}
}
public class B : A
{
protected virtual void Dispose(bool disposing) // Proper pattern.
{
Console.WriteLine("B");
}
}
public static class Program
{
static void Main(string[] args)
{
A a = new A();
a.Dispose(); // Prints "A"
B b = new B();
b.Dispose(); // Prints "A"!
}
}
如您所见,这使得使用dispose模式非常不方便。
您可以通过隐藏public void Dispose(void)
并在某处调用base.Dispose()
来解决这个问题。这时候,当调用B b = new B(); b.dispose();
时,它会“类似”于正确的dispose模式。但是,当调用A b = new B(); b.Dispose();
时,只会调用A
的Dispose
方法。
public class B : A
{
public void Dispose() // Causes CA error with or without "new".
{
this.Dispose(true);
GC.SuppressFinalize(this);
}
protected virtual void Dispose(bool disposing) // Proper pattern.
{
base.Dispose(); // Writes "A" (without quotes).
Console.WriteLine("B");
}
}
基本上,整个事情看起来很糟糕。我们知道CA是否接受private void Dispose(bool)
,是否有一种方法可以至少通过StyleCop发出警告?
编辑:我不认为我应该接受Alexandre的答案,因为相对于我的问题,它基本上归结为“可能是一个bug”,以及应该是一个注释。如果其他人有更具决定性的东西,我认为那将是一个更合适的答案。
base.Dispose()
将是模式的明显违反,因此我认为这并不能解释它。我同意你最初的想法,即代码分析应该报告你提出的情况。 - sstan