Discards 功能是否可以正确地与 IDisposable 对象一起使用?
它Dispose();在需要时调用吗?
我有一个代码:
Boolean existing = Mutex.TryOpenExisting(name: key, rights: MutexRights.ReadPermissions, result: out Mutex _);
Run Code Online (Sandbox Code Playgroud)
这里我只需要existing变量值。
如您所见,我试图在这里使用“丢弃”变量,但我不确定在这种情况下是否正确使用。
因为 Mutex obj 实现了 IDisposable。
那么在这种情况下哪种方式是正确的?这个:
Boolean existing = Mutex.TryOpenExisting(name: key, rights: MutexRights.ReadPermissions, result: out Mutex _);
Run Code Online (Sandbox Code Playgroud)
或这个:
Mutex mutex;
Boolean existing = Mutex.TryOpenExisting(name: key, rights: MutexRights.ReadPermissions, result: mutex);
mutex.Dispose();
Run Code Online (Sandbox Code Playgroud)
我创建了一个测试应用程序来检查@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;
}
Run Code Online (Sandbox Code Playgroud)
让我们尝试一个代码:
public Form1()
{
InitializeComponent();
Image img;
var a = TestMethod(out img);
img.Dispose();
}
Run Code Online (Sandbox Code Playgroud)
我们看到了一个预期的行为——图像被释放,内存被释放。
让我们尝试下一个代码:
public Form1()
{
InitializeComponent();
var a = TestMethod(out _);
}
Run Code Online (Sandbox Code Playgroud)
正如我们所看到的,图像没有被处理。内存不是免费的。
让我们再做几个测试:
建造:
var a = TestMethod(out _.Dispose());
Run Code Online (Sandbox Code Playgroud)
不管用。它告诉我们 _ 在当前上下文中不存在。
建设:
var a = TestMethod(out _);
_.Dispose();
Run Code Online (Sandbox Code Playgroud)
会做同样的结果。
所以....
.Dispose()显式调用。