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

标签 c# dispose c#-7.0

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

enter image description here

我们看到了预期的行为——图像被处理并且内存被释放。

让我们尝试下一个代码:

public Form1()
{
    InitializeComponent();
    var a = TestMethod(out _);
}

test 2

如我们所见,图像未被处置。内存不是免费的。

因此 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/

相关文章:

c# - 从文本文件读取到数据库表的有效方法

c# - gridview 上的复选框事件?

c# - 仅针对托管资源的最小 IDisposable implimenation

ios - 如果我无法从另一个线程调用 UIKit,如何在 Dispose 中进行清理?

java - 关闭 1 个 jframe,其中多个 jframe 处于 Activity 状态,无法正常工作

c# - 在 C#7 中,如何将 "roll my own"类任务类型与异步一起使用?

c# - 如何在 .NET Core 中使用 Angular 4 在同一提交中发布表单数据和文件

c# - 在 devexpress 上的 gridview 内循环

c# - 如何在 LINQ 查询中空检查 c# 7 元组?

c# - 为什么我不能引用返回静态只读字段?