【问题标题】:C# 7.0 – Discards and IDisposable out argumentC# 7.0 – Discards 和 IDisposable out 参数
【发布时间】:2018-12-15 17:58:50
【问题描述】:

Discards 功能是否适用于 IDisposable 对象?

需要时是否调用Dispose();


我有一个代码:

Boolean existing = Mutex.TryOpenExisting(name: key, rights: MutexRights.ReadPermissions, result: out Mutex _);

这里我只需要existing变量值。

如您所见,我在这里尝试使用“丢弃”变量,但我不确定在这种情况下这是否正确。

因为 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();

【问题讨论】:

  • 嗯,_.Dispose(); 没有错,只是在door on the right 后面复习了。
  • 稍后我会尝试_.Dispose(); 代码,谢谢:)
  • 试一试,然后将_重构为mutex

标签: c# dispose c#-7.0


【解决方案1】:

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

我们看到了预期的行为——图像已被释放,内存已释放。

让我们试试下一个代码:

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

如我们所见,图像未处理。内存不是空闲的。

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

让我们再尝试几个测试:

构造:

var a = TestMethod(out _.Dispose());

不会工作。说明 _ 在当前上下文中不存在。

构造:

var a = TestMethod(out _);
_.Dispose();

会做同样的结果。

所以....

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

【讨论】:

  • 使用 (_ = ZipFile.Open(filename, ZipArchiveMode.Update)) { } 如果存档不存在则创建存档?
  • 进行测试并在此处写下您的结果。但即使这会起作用 - 这将通过与丢弃或不丢弃相同的方式起作用。只是因为使用。
  • 是的,它确实被丢弃了,或者您可以省略丢弃并获得相同的结果。我提出了一个问题,结果证明是重复的。 stackoverflow.com/q/67274824/2229933
【解决方案2】:

据我所知,

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

【讨论】:

  • 我做了检查。你是绝对正确的。它不会处理对象。非常感谢!
猜你喜欢
  • 2014-05-04
  • 2020-12-20
  • 2023-04-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-07-26
相关资源
最近更新 更多