C# 7.0 – 丢弃和 IDisposable 输出参数
C# 7.0 – Discards and IDisposable out argument
Discards 功能是否能正确处理 IDisposable 对象?
它会在需要时调用 Dispose();
吗?
我有一个代码:
Boolean existing = Mutex.TryOpenExisting(name: key, rights: MutexRights.ReadPermissions, result: out Mutex _);
这里我只需要existing
变量值。
如您所见,我在这里尝试使用 "discard" 变量,但我不确定在这种情况下这是否正确。
因为 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();
据我了解,
Boolean existing = Mutex.TryOpenExisting(name: key, rights: MutexRights.ReadPermissions, result: out Mutex _);
将丢弃调用生成的 Mutex
。丢弃它并不意味着将调用某些方法,例如 Dispose()
。
您需要显式调用 .Dispose()
。
我会继续使用
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\Desktop00x2000pixels.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()
。
Discards 功能是否能正确处理 IDisposable 对象?
它会在需要时调用 Dispose();
吗?
我有一个代码:
Boolean existing = Mutex.TryOpenExisting(name: key, rights: MutexRights.ReadPermissions, result: out Mutex _);
这里我只需要existing
变量值。
如您所见,我在这里尝试使用 "discard" 变量,但我不确定在这种情况下这是否正确。
因为 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();
据我了解,
Boolean existing = Mutex.TryOpenExisting(name: key, rights: MutexRights.ReadPermissions, result: out Mutex _);
将丢弃调用生成的 Mutex
。丢弃它并不意味着将调用某些方法,例如 Dispose()
。
您需要显式调用 .Dispose()
。
我会继续使用
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\Desktop00x2000pixels.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();
会得到同样的结果。
所以....