有没有办法在没有实例化using
的情况下编写IDisposable
语句?
例如,如果我需要做类似的事情:
using (MyThing thing)
{
if (_config == null)
{
thing = new MyThing();
}
else
{
thing = new MyThing(_config);
}
// do some stuff
} // end of 'using'
此类案件是否有可接受的模式?或者我是否会再次明确处理IDisposable
?
答案 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
}
}
}