Discards 功能是否能正确处理 IDisposable 对象?
是否在需要时调用 Dispose();
?
我有一个代码:
Boolean existing = Mutex.TryOpenExisting(name: key, rights: MutexRights.ReadPermissions, result: out Mutex _);
这里我只需要现有的
变量值。
如您所见,我在这里尝试使用“丢弃”变量,但我不确定在这种情况下这种用法是否正确。
因为 Mutex obj 实现了 IDisposable。
那么在这种情况下哪种方式是正确的呢?这个:
Boolean existing = Mutex.TryOpenExisting(name: key, rights: MutexRights.ReadPermissions, result: out Mutex _);
或者这个:
Mutex mutex;
Boolean existing = Mutex.TryOpenExisting(name: key, rights: MutexRights.ReadPermissions, result: mutex);
mutex.Dispose();
最佳答案
我创建了一个测试应用程序来检查@CamilioTerevinto 的回答。
一个带有方法的简单 winforms 应用程序:
public bool TestMethod(out Image bmp)
{
Thread.Sleep(3000);
bmp = Bitmap.FromFile(@"C:\Users\UKS\Desktop\2000x2000pixels.bmp");
Thread.Sleep(1000);
return true;
}
让我们试试代码:
public Form1()
{
InitializeComponent();
Image img;
var a = TestMethod(out img);
img.Dispose();
}
我们看到了预期的行为——图像被处理并且内存被释放。
让我们尝试下一个代码:
public Form1()
{
InitializeComponent();
var a = TestMethod(out _);
}
如我们所见,图像未被处置。内存不是免费的。
因此 Discard 不会调用 Dispose();方法。
让我们尝试更多测试:
构造:
var a = TestMethod(out _.Dispose());
不会工作。这表明 _ 在当前上下文中不存在。
构造:
var a = TestMethod(out _);
_.Dispose();
会做同样的结果。
所以....
Discards 无法正确处理 IDisposable out 参数。您需要显式调用 .Dispose()
。
关于C# 7.0 – 丢弃和 IDisposable 输出参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53795827/