代码之家  ›  专栏  ›  技术社区  ›  IAbstract

使用`Using(…)`有效地无用和/或低效?

  •  4
  • IAbstract  · 技术社区  · 16 年前

    下面的代码是否呈现 using(...)

    class Program
    {
        static Dictionary<string , DisposableClass> Disposables
        {
            get
            {
                if (disposables == null)
                    disposables = new Dictionary<string , DisposableClass>();
    
                return disposables;
            }
        }
    
        static Dictionary<string , DisposableClass> disposables;
    
        static void Main(string[] args)
        {
            DisposableClass disposable;
            using (disposable = new DisposableClass())
            {
                //  do some work
                disposable.Name = "SuperDisposable";
                Disposables["uniqueID" + Disposables.Count] = disposable;
            }
    
            Console.WriteLine("Output: " + Disposables["uniqueID0"].Name);
    
            Console.ReadLine();
        }
    }
    
    class DisposableClass : IDisposable
    {
        internal string Name
        {
            get { return myName; }
            set { myName = value; }
        }
    
        private string myName;
    
        public void Dispose( )
        {
            //throw new NotImplementedException();
        }
    }
    

    我对 使用(…) 功能是立即强制处置 DisposableClass . 然而,在代码块中,我们将该类添加到字典集合中。我的理解是类本身就是一种引用类型。所以我的实验就是要看看以这种方式添加到集合中的一次性对象会发生什么。

    在这种情况下 可处置类

    编辑:用输出修改代码以证明对象没有死,这可能是一些答案所暗示的。

    第二次编辑:当我读了更多的代码后,我总结到:

        public void Dispose( )
        {
            Dispose(true);
            GC.SuppressFinalize(this);
        }
    
        private void Dispose(bool dispose)
        {
            if (!isDisposed)
            {
                if (dispose)
                {
                    // clean up managed objects
                }
    
                //  clean up unmanaged objects
                isDisposed = true;
            }
        }
    
        ~DisposableClass( )
        { Dispose(false); }
    

    单步执行代码(在 private void Dispose(bool dispose) false 如果传递给方法,则必须在这里正确地处理资源。不管怎样,类仍然是活动的,但是您肯定是在为异常设置自己。答案让我更加好奇。。。

    4 回复  |  直到 16 年前
        1
  •  11
  •   Will Vousden    16 年前

    处置一个物体并不会破坏它;它只是告诉它清理它使用的任何非托管资源,因为它们不再需要。在您的示例中,您正在创建一个一次性对象,分配给一个字典,然后只是告诉它删除一些资源。

    using 语句是指当您想初始化一个资源,对它做些什么,然后销毁它并忘记它;例如:

    using (var stream = new FileStream("some-file.txt"))
    using (var reader = new StreamReader(stream))
    {
        Console.Write(reader.ReadToEnd());
    }
    

    如果您想在使用完对象后保留它,就不应该处理它,因此 使用

        2
  •  2
  •   John Saunders    16 年前

    你不应该使用 using

        3
  •  2
  •   Nick Gravelyn    16 年前

        4
  •  1
  •   Paul Turner    16 年前

    这个 IDisposable 接口表示类型管理某种资源。这个 Dispose

    在您的示例中,dictionary仍然包含对一次性类的引用,但是该实例将在 using 块随后对实例调用方法的尝试现在可能会引发 ObjectDisposedException InvalidOperationException ,表示实例不再处于“工作”状态。

    处置 可识别的