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()