我有以下一段C#代码
iSomeObject.MyPoint(SomeConstants.cpU, 2,
myInterface.MySystem.MyCustomType == OtherConstants.cpProjected ? Constants.cpU : Constants.cpT,
1, ref t1, ref t2, ref t3);当我运行我的专有分析工具时,它显示myInterface.MySystem导致了资源泄漏。
class MyClass:MyInterface,IDisposable
{}
MyInterface myInterface = new MyClass();我显式地通过将实例myInstance转换回IDisposable并对其调用Dipose()方法来处理它。
现在,在myInterface ( MySystem )上调用MySystem属性的get方法,它的类型为IExampleInterface,其进一步实现如以下代码所示:
class ExampleClass:IExampleClass,IDisposable
{}我不确定在myInterface上调用Dipose()方法是否也会释放由MySystem创建的资源,或者我是否需要显式地对其调用Dispose()方法。但是所有的事情都发生在IF语句条件中,我不确定如何处理这种情况,让我的代码处理掉所有的可处置对象,换句话说,我不确定在这种情况下的C#语法,以及在这种情况下如何处理处置概念。
任何建议都将不胜感激。
发布于 2015-08-25 04:33:12
如果MySystem是一个IDisposable对象,那么您的类应该在它的Dispose实现中处理该对象。
否则,修复您的静态分析工具。
发布于 2015-08-25 04:49:40
我会说你应该把处理放在知道你有一个MyClass的代码层。
using(var iSomeObject = new MyClass(...)) {
// do something
iSomeObject.MyPoint(SomeConstants.cpU, 2,
myInterface.MySystem.MyCustomType == OtherConstants.cpProjected ? Constants.cpU : Constants.cpT,
1, ref t1, ref t2, ref t3);
}发布于 2015-08-25 04:50:07
我不确定你说的if是什么意思。如果您在方法/属性/构造函数(无论什么)中使用可处置实例,并且它们的作用域不是该类的实例成员,那么它们应该在使用后立即被销毁。
如果类中有实现IDisposable的成员,那么您的类也应该实现IDisposable,一旦不再需要类的实例,就应该调用Dispose (就像实现IDisposable的任何其他实例一样)。
此外,在与实现IDisposable的实例交互时,请始终使用try/finally或using块。
最后,有关使用IDisposable的完整细节和最佳实践,请参阅微软的this write up 。
public interface IExampleInterface { void DoSomething();}
public class ExampleClass : IExampleInterface, IDisposable {
private bool _switch = true;
public void DoSomething() {
// lets use something disposable
if(_switch) { // is this what you mean by in an if statement??
var stream = new System.IO.MemoryStream();
try {
// do something with stream
} finally {
stream.Dispose(); // call dispose!
}
}
}
private System.IO.FileStream fs; // class level field
public void Dispose(){
// dispose of class fields here that implement IDisposable
if(fs != null)
fs.Dispose();
fs = null;
}
}https://stackoverflow.com/questions/32191131
复制相似问题