繁体   English   中英

带有一次性成员的C#ValueTuple

[英]C# ValueTuple with disposable members

假设我有一个方法foo ,它返回一个ValueTuple ,其中一个成员是一次性的,例如(IDisposable, int)

确保返回的一次性物体在呼叫方面正确配置的最佳方法是什么?

我尝试了以下方法:

using (var (disposable, number) = foo())
{
    // do some stuff using disposable and number
}

但这不会编译:

'(IDisposable disposable,int number)':using语句中使用的类型必须可以隐式转换为'System.IDisposable'

我是否真的需要将我的代码包装在try-finally块中并将我的对象显式地放在finally块中,或者有更好的方法吗?

实际上我希望看​​到新的ValueTuples实现IDisposable接口并在所有可丢弃成员上调用Dispose() 这可能是微软有价值的功能要求吗?

只需将方法调用移到using语句之外,然后只使用一次性对象:

var (disposable, number) = foo();
using (disposable)
{
    // do some stuff using disposable and number
}

你的版本不起作用的原因仅仅是因为无论using结果的括号中的表达式是否需要是一次性的,但值元组本身不是一次性的。 所以你只需要拆分它。 幸运的是,在该表达式中构造对象不需要using语句,您只需将任何现有对象传递给它即可。


实际上我希望看​​到新的ValueTuples实现IDisposable接口并在所有可丢弃成员上调用Dispose() 这可能是微软有价值的功能要求吗?

按照这种逻辑, 所有收藏都必须这样做。 例如,处理一个列表应该处理它的所有成员,处理一个字典应该处理它的所有值(和键?!?!)。 当你有一个只使用简单列表的类型时,该对象也需要是一次性的。

所以基本上,你最终会传播它并最终得到很多突然丢弃的物体,尽管它们实际上并没有任何需要它的实际资源。

制作一次性物品不应该轻易做到。 通常,创建一次性对象的对象负责稍后正确地处理对象,它们拥有对象的生命周期。 但对于收藏品而言,情况往往并非如此。 集合通常只是:用于保留对象的集合,但是没有说明它们是否集合所有 - 大多数时候它们都是由同时创建集合的对象所拥有的,因此该对象应该然后在某些时候通过简单地循环遍历集合来处理对象。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM