Search code examples
c#.netidisposable

How to create a dispose pattern for out parameters (Message IDE0068)


Consider code like this:

System.Data.DataTable dt = new DataTable();

Code like this will likely give a message in the error list in Visual Studio: IDE0068 Use recommended dispose pattern to ensure that object created by '...' is disposed on all paths: using statement/declaration or try/finally. So wrapping it in a using block will ensure the dt instance is disposed of.

But what about this case:

SomeFunction(out DataTable dt);

How to dispose dt in this case? Wrapping it in a using block does not seem to be accepted:

using (DataTable dt = new DataTable()) {
/*dt needs to be initialised above otherwise this line won't compile*/
  SomeFunction(out DataTable dt);
  /* Above line: cannot use dt as ref or out variable because it is a 'using variable'*/
}

Can using be used at all here or do I need to call something like dt?.Dispose(); at the end of the block?


Solution

  • I'm pretty sure the using block accepts an expression, not just a declaration, so you can wrap it immediately after you get it.

    SomeFunction(out var dt);
    using (dt)
    {
        // Your logic here...
    }