C# 代码分析警告,即使我遵循MSDN指南CA2000:在失去作用域之前处理对象

C# 代码分析警告,即使我遵循MSDN指南CA2000:在失去作用域之前处理对象,c#,code-analysis,C#,Code Analysis,有人能告诉我为什么下面的代码示例抛出了CA2000:在失去作用域之前处理对象代码分析警告和可能的修复 public static EncapsulatingDisposableObject ReturnMyDisposableObject(){ DisposableObject TempBuffer = null; try { TempBuffer = new DisposableObject();

有人能告诉我为什么下面的代码示例抛出了
CA2000
:在失去作用域之前处理对象代码分析警告和可能的修复

    public static EncapsulatingDisposableObject ReturnMyDisposableObject(){
        DisposableObject TempBuffer = null;
        try
        {
            TempBuffer = new DisposableObject();
            EncapsulatingDisposableObject SB = null;
            EncapsulatingDisposableObject TmpSB = null;
            try
            {
                TmpSB = new EncapsulatingDisposableObject(TempBuffer);
                TempBuffer = null;
                SB = TmpSB;
                TmpSB = null;
                return SB;
            }
            finally
            {
                if (TmpSB != null)
                {
                    TmpSB.Dispose();
                }
            }              

        }

        finally
        {
            if (TempBuffer != null)
            {
                TempBuffer.Dispose();
            }


        }
}
CA2000
在方法“
封装DisposableObject
ReturnMyDisposableObject()”
中,在对象“
TempBuffer
”上调用
System.IDisposable.Dispose
,然后在对象的所有引用都超出范围之前对其进行处理

对任何可能感兴趣的人来说,问题在于
封装DisposableObject
构造函数,这很简单

    EncapsulatingDisposableObject(DisposableObject obj)
{
   _disposableField = obj;
}

这会导致编译器抱怨传递给它的参数没有正确处理。

您是否尝试过DisposableObject TempBuffer=null;在try?Better中,您可以使用
using
块在内部调用
Dispose()
。实际上,如果您总是在finally块之外为对象置零,它将永远不会调用Dispose?我不能使用using块,因为
TempBuffer
已分配给
封装DisposableObject
类中的一个字段。我想不出任何其他地方可以将null分配给TempBuffer,因为它在调用
封装DisposableObject
的构造函数之前不能为null。基本上
封装DisposableObject
有一个类型为
DisposableObject
的字段,该字段在构造函数中初始化。