为什么使用Dispose作为普通方法是不好的?

Sin*_*atr 1 c# dispose language-lawyer

试图搞清楚.有人告诉我

处置是不是只是一个方法-这是等同于其他语言的析构函数.

好.Msdn对此也非常响亮.

但是之后

class Test : IDisposable
{
    public string Property { get; set; } = "Test";
    public void Dispose() => Console.WriteLine("Disposed, very scary");
}

class Program
{
    static void Main(string[] args)
    {
        var test = new Test();
        test.Dispose();
        test.Property = "123";  // but it's disposed OMG! do not do this!
        test.Dispose();

        using (var another = new Test())
            for (int i = 0; i < 10; i++)
            {
                another.Dispose();
                GC.Collect(); // or what should I call to make it crash?
            }

        Console.ReadKey();
    }
}
Run Code Online (Sandbox Code Playgroud)

而且没有问题.

我的想法Dispose:

  • 这是一种正常的公共方法;
  • IDisposableusing自动调用一起使用非常有用Dispose,仅此而已;
  • 如果对象状态得到适当维护,那么在任何时候将任何代码放在内部处理是完全没问题的.

如果我错了,请纠正我.

PS:Downvote意味着"问题很糟糕/没有用/有问题".如果你只是不同意我的想法 - 发表评论或回答.对于那些我现在这么想的人(因为我错了?然后证明它)会有用

ang*_*son 8

Dispose只是一种方法,你可以像任何其他方法一样调用它.它总是通过IDisposable接口公开(是的,显然你可以在Dispose没有实现的情况下命名方法IDisposable,不要这样做!).

但是,手动调用它有时会产生代码味道,代码的气味可能会被使用using.通过"手动"这里我的意思Dispose是在另一个实现之外调用Dispose.

调用它两次也应该是安全的并记录在案:

如果多次调用对象的Dispose方法,则该对象必须忽略第一个之后的所有调用.如果多次调用Dispose方法,则该对象不得抛出异常.除了Dispose之外的实例方法可以在已经处置资源时抛出ObjectDisposedException.

(我的重点)

你应该打Dispose两次电话吗?没有!.这也是代码的代码味道,它不再能控制它所做的事情和它剩下的事情并最终做"只是为了确定".不要那样做!

因此,如果您正确编写代码,请确保您可以Dispose手动调用.