我在一个类似单例的类中有以下代码:
private readonly Lazy<IWindsorContainer> LazyContainer =
new Lazy<IWindsorContainer>(() => new WindsorContainer().Install(new WindsorInstaller()));鉴于WindsorContainer确实需要发布,我会在主机中晚些时候发布,所以很自然地,我想抑制有关IDisposable可能未发布的淘气Microsoft.Reliability警告。问题是它是在lambda中创建的,看起来SuppressMessage对它没有任何影响,我绝对不希望它在整个类上发生。
我通过在构造函数上隐藏属性来解决这个问题。但仍然对此不太满意。
是我错过了什么,还是SuppressMessage没有跟上c#的发展?
发布于 2012-11-23 20:22:22
我认为它正在考虑这样一种可能性,即调用Install()失败,然后容器(尚未分配给任何变量)不会被释放。您可以在那里添加try/catch,使表达式更加冗长,但符合如下规则(未经过测试,但您应该明白了):
private readonly Lazy<IWindsorContainer> LazyContainer =
new Lazy<IWindsorContainer>(() => {
var container = new WindsorContainer();
try { container.Install(new WindsorInstaller())); }
catch { using(container) {} throw; }
return container; });发布于 2012-11-26 18:14:57
正如fsimonazzi正确指出的那样,这是关于调用新的WindsorContainer().Install(新的WindsorInstaller()),它在将IDisposable保存到成员变量之前使用它(因此不能保证它会被保存到成员变量)。
对于我自己来说,我决定将其重构为以下内容:
class Program : IDisposable
{
private Disposo _disposo = new Disposo();
//private Disposo _disposo = new Disposo().Yeah(); // this will cause warning
public Program()
{
_disposo.Yeah(); // this will not
}
public void Dispose()
{
if (_disposo != null)
{
_disposo.Dispose();
_disposo = null;
}
}
static void Main(string[] args)
{
using (var p = new Program()) { }
}
}
class Disposo : IDisposable
{
public void Dispose() { }
public Disposo Yeah() { return this; }
}在某个地方
private static readonly Lazy<Program> LazyInstance = new Lazy<Program>();道德吗?尽管声称"CA2000:在所有对它的引用之前处置对象都超出了范围“。是被破坏的,可以忽略和抑制,但情况并不总是这样。
https://stackoverflow.com/questions/13528730
复制相似问题