使用c#using语句延迟实例化

时间:2011-01-10 12:44:56

标签: c# idisposable using instantiation

有没有办法在没有实例化using的情况下编写IDisposable语句?

例如,如果我需要做类似的事情:

using (MyThing thing)
{
    if (_config == null)
    {
         thing = new MyThing();
    }
    else
    {
         thing = new MyThing(_config);
    }

    // do some stuff

} // end of 'using'

此类案件是否有可接受的模式?或者我是否会再次明确处理IDisposable

4 个答案:

答案 0 :(得分:4)

嗯,在你的例子中,你立即实例化一次性对象 - 只是根据条件。例如,您可以使用:

using (MyThing thing = _config == null ? new MyThing() : new MyThing(_config))
{
    ...
}

更一般地说,你可以使用一种方法:

using (MyThing thing = CreateThing(_config))
{
}

如果实例化的时间根据各种条件而改变,那么棘手的一点就是。使用using语句确实难以处理,但建议您应该尝试重构代码以避免该要求。它并非总是可能,但值得尝试。

另一个替代方法是将“thing”封装在一个包装器中,该包装器将适当地懒惰地创建真正的一次性对象,并委托给它进行处理以及您可以对该类型执行的任何其他操作。像这样的代表团在某些情况下会很痛苦,但可能是合适的 - 取决于你真正想做的事情。

答案 1 :(得分:2)

using (MyThing thing = _config == null ? new MyThing() : new MyThing(_config))
{
   // ....

}

答案 2 :(得分:1)

你可以这样做:

if (_config == null)
{
     thing = new MyThing();
}
else
{
     thing = new MyThing(_config);
}

using (thing)
{

    // do some stuff
}

答案 3 :(得分:1)

我认为最理智的解决方案是将配置内容的决定转移到MyThing构造函数中。这样你就可以像这样简化类的使用:

using (MyThing thing = new MyThing(_config))
{

} 

class MyThing {
  public MyThing() {
    //default constructor
  }

  public MyThing(Config config) :this() {
    if (config == null)
    {
         //do nothing, default constructor did all the work already
    }
    else
    {
         //do additional stuff with config
    }
  }
}