使用`using(...)`有效无用和/或低效?

IAb*_*act 4 c# idisposable using

以下代码是否使using(...)函数/目的无关紧要?
它会导致GC性能不足吗?

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();
    }
}
Run Code Online (Sandbox Code Playgroud)

输出:SuperDisposable

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

在这种情况下DisposableClass仍然很活跃.类是一种引用类型 - 因此我的假设变成了集合不仅仅是引用这种类型,而是将类作为值保存.但是,这也没有意义.

那真正发生了什么?

编辑:修改了带输出的代码,以证明对象没有死,正如一些答案所暗示的那样.

第2次编辑:由于我已经完成了更多代码,因此:

    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); }
Run Code Online (Sandbox Code Playgroud)

单步执行代码(有一个断点private void Dispose(bool dispose)),false传递给方法的地方,必须在这里妥善处理资源.无论如何,班级仍然活着,但你肯定是在为异常做好准备.答案让我更好奇......

Wil*_*den 11

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

using语句的正确场景是,当您想要初始化资源,对其执行某些操作,然后销毁它并忘记它时; 例如:

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

如果要在使用后保留对象,则不应将其丢弃,因此using不应使用语句.