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:
IDisposable与using自动调用一起使用非常有用Dispose,仅此而已;如果我错了,请纠正我.
PS:Downvote意味着"问题很糟糕/没有用/有问题".如果你只是不同意我的想法 - 发表评论或回答.对于那些我现在这么想的人(因为我错了?然后证明它)会有用
Dispose只是一种方法,你可以像任何其他方法一样调用它.它总是通过IDisposable接口公开(是的,显然你可以在Dispose没有实现的情况下命名方法IDisposable,不要这样做!).
但是,手动调用它有时会产生代码味道,代码的气味可能会被使用using.通过"手动"这里我的意思Dispose是在另一个实现之外调用Dispose.
调用它两次也应该是安全的并记录在案:
如果多次调用对象的Dispose方法,则该对象必须忽略第一个之后的所有调用.如果多次调用Dispose方法,则该对象不得抛出异常.除了Dispose之外的实例方法可以在已经处置资源时抛出ObjectDisposedException.
(我的重点)
你应该打Dispose两次电话吗?没有!.这也是代码的代码味道,它不再能控制它所做的事情和它剩下的事情并最终做"只是为了确定".不要那样做!
因此,如果您正确编写代码,请确保您可以Dispose手动调用.