C#将同一个一次性资源包装在多个using块中

C#将同一个一次性资源包装在多个using块中,c#,using,C#,Using,我只是浏览了一些重构代码,并困惑地发现类似于以下内容 public class FooDisposable : IDisposable { } using (var foo = new FooDisposable()) { EagerToDisposeMethod(foo); //Do something else with foo } void EagerToDisposeMethod(FooDisposable fooDisposable) { using (fo

我只是浏览了一些重构代码,并困惑地发现类似于以下内容

public class FooDisposable : IDisposable { }

using (var foo = new FooDisposable())
{
    EagerToDisposeMethod(foo);
    //Do something else with foo
}

void EagerToDisposeMethod(FooDisposable fooDisposable)
{
    using (fooDisposable)
    {
        //...
    }
}

想知道什么时候可以处理

还有,为什么这不能至少是一个编译器警告,“试图处理未在当前作用域中创建的内容”


在c#中,使用block是否可以意识到环境对同一资源的使用(如TransactionScope等)?

处理当前范围中未创建的内容通常是正确的,即使在这种特殊情况下,该对象仍在其他地方使用。它并不总是错误的(事实上,它经常是错误的),因此它作为警告没有意义。“想知道在什么时候它可以准备好进行处置?”
foodisable.Dispose()
将在每次控制流存在
时使用
块调用,因此,在您的示例中,它将被调用两次。它将在
急切地Dispose方法中处理,并且在之后使用时可能会导致问题。至于编译器没有警告您,这是一个发现这个特定问题的复杂性问题。但是,有一些静态代码检查器可能会捕捉到这一点,或者如果它们没有捕捉到,您可以编写自定义规则。这取决于对象的所有权。作为一个通用方法,我想说上面的代码是一个bug,但是如果
渴望dispose方法
方法实际上拥有传递给它的对象的所有权,那么它就可以了。但是,在这种情况下,我认为外部代码中有一个bug。很少像问题中那样有目的地编写代码,因为您知道对象总是在两个不同的地方被处置。@NasmiSabeer一个对象拥有传递给它的可支配资源的所有权,调用方放弃所有权并停止使用它,这种情况很常见。通常在这种情况下,传入的可支配资源被“消耗”,不再可用,例如某种类型的数据流。