C# 7.0 – 丢弃和 IDisposable 输出参数

And*_*rew 2 c# dispose c#-7.0

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)

And*_*rew 5

我创建了一个测试应用程序来检查@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)

测试 2

正如我们所看到的,图像没有被处理。内存不是免费的。

所以 Discard 不会调用 Dispose(); 方法。

让我们再做几个测试:

建造:

var a = TestMethod(out _.Dispose());
Run Code Online (Sandbox Code Playgroud)

不管用。它告诉我们 _ 在当前上下文中不存在。

建设:

var a = TestMethod(out _);
_.Dispose();
Run Code Online (Sandbox Code Playgroud)

会做同样的结果。

所以....

Discards 不能正确使用 IDisposable 输出参数。您需要.Dispose()显式调用。

  • 进行测试并在此处写下您的结果。但即使这会起作用 - 无论是否丢弃,都会以相同的方式起作用。只是因为使用。 (2认同)