2017-05-31 42 views
0

我试图XmlNodeReader对象返回到另一个函数,但得到CA2000警告回到一次性对象和获取CA2000警告

XmlNodeReader obj =new XmlNodeReader(section); 
return ser.method(obj); 

如果我使用下面的代码,将它正常工作?警告被抑制,但不确定它是否会影响逻辑。

XmlNodeReader tempObj =new XmlNodeReader(section); 
XmlNodeReader retObj=null; 
retObj = tempObj; 
tempObj.Dispose(); 
return ser.method(retObj); 
+0

嗯,我们不知道是什么'ser.method'做,但不得传递处理方法似乎对我来说是个坏主意。 –

+0

CA2000有时会给你误报,但是*通常是*表示某些看起来很奇怪的东西,所以它并不全是坏的。您需要确定构造对象的代码的区域是否也拥有它,或者您是否将所有权交给了接收该对象的所有者。一旦你决定你可以研究如何摆脱警告。 –

+0

请注意,在某些情况下,如果您创建的是“工厂方法”,则可以通过简单地命名该方法来摆脱警告,请尝试“Get”与“Create”作为方法名称的前缀,请参阅如果有任何帮助。 –

回答

2

嗯,我们不知道做什么ser.method,但经过一个释放的对象为method似乎是一个坏主意给我。基本上,你的“修复”是不好的。

有三种可能性在这里(也可能是其他人,但这些是主要的):

  • ser.method其参数本身的处置。 (这可能是一个坏主意,但它可能会做到。)在这种情况下,您的原始代码没问题。
  • ser.method不出售其参数,但它返回的东西,依赖于仍然没有被设置
  • ser.method不出售其参数的读者,并且返回的东西,不需要读者保持开放

我希望最后的这些情况下,在这种情况下,你应该更改您的代码:

using (XmlNodeReader reader = new XmlNodeReader(section)) 
{ 
    return ser.method(reader); 
} 
+0

嗨,乔恩。 ser.method是System.XML的Deserialize(XmlReader xmlReader)方法。 – user3386619

+0

@ user3386619:那么为什么没有用原来的问题说,所以我们不必猜?理想情况下,在提问时提供[mcve]。 –

+0

抱歉在发布时不遵守规则。从现在开始我会记住这一点。感谢您的回答。 :-) – user3386619