C# FxCop CA2202-行为不一致?

C# FxCop CA2202-行为不一致?,c#,.net,fxcop,C#,.net,Fxcop,为什么第二个嵌套的“使用”(与my Foo、Bar类一起)不会生成CA2202“多次不处理对象”警告。 IO类型的相同嵌套“使用”会生成CA2202问题 谢谢大家-任何帮助都将不胜感激 using System; using System.IO; namespace ConsoleApplication1 { public class Foo : IDisposable { public void Dispose() {

为什么第二个嵌套的“使用”(与my Foo、Bar类一起)不会生成CA2202“多次不处理对象”警告。 IO类型的相同嵌套“使用”会生成CA2202问题

谢谢大家-任何帮助都将不胜感激

using System;
using System.IO;

namespace ConsoleApplication1
{

    public class Foo : IDisposable
    {

        public void Dispose()
        {
            this.Dispose(true);
            GC.SuppressFinalize(this);
        }

        protected virtual void Dispose(bool isUserCall)
        {
            if (isUserCall)
            {

            }
            else
            {

            }
        }
    }

    public class Bar : IDisposable
    {
        private Foo _foo;

        public Bar(Foo foo)
        {
            _foo = foo;
        }

        public void Dispose()
        {
            this.Dispose(true);
            GC.SuppressFinalize(this);
        }

        protected virtual void Dispose(bool isUserCall)
        {
            if (isUserCall)
            {
                // call Foo::Dispose as StreamWriter dispose the FileStream
                _foo.Dispose();
            }
        }
    }



    class Program
    {
        static void Main(string[] args)
        {
            // generate FxCop CA2202 with .NET types
            using (Stream stream = new FileStream("file.txt", FileMode.OpenOrCreate))
            {
                using (StreamWriter writer = new StreamWriter(stream))
                {
                    // Use the writer object...
                }
            }

            // not generate the issue with my types... why ?
            using (Foo f = new Foo())
            {
                using (Bar b = new Bar(f))
                {

                }
            }
        }
    }
}

那么,它在哪里处理同一个物体两次呢?一个使用语句是disposing
Foo f
,另一个是
Bar b
,我认为您应该在粘贴代码之前描述您的问题。。。会使你的Q更具可读性。嗨,在Bar::Dispose(bool)的实现中…你的程序在哪里?你对Foo和Bar的使用是100%正确的-这就是事情应该的方式,你实例化一个对象,Foo或Bar,然后你处理它。一个是否“嵌套”在另一个内部并不重要。涉及FileStream和StreamWriter的案例实际上是由于Microsoft的一个有问题的设计决策:他们说,处理StreamWriter也会处理它所基于的流对象。在我看来,这实际上是一个设计错误。更多信息请点击此处: