如何编写一个If语句,其中包含一些可丢弃的对象

本文关键字:包含一 对象 何编写 语句 If 一个 | 更新日期: 2023-09-27 18:09:32

我有以下一段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并在其上调用dispose()方法来处理它。

现在MySystem属性的get方法在myInterface上被调用,MySystem是IExampleInterface类型,它进一步实现如下代码:

 class ExampleClass:IExampleClass,IDisposable
 {}

我不确定是否在myInterface上调用dispose()方法也会释放由MySystem创建的资源,或者我是否需要显式地调用dispose()方法。但是一切都发生在IF语句条件内,我不确定如何处理这种情况,并使我的代码处理掉所有可丢弃的对象,换句话说,我不确定在这种情况下的c#语法以及如何处理在这种情况下的处理概念。

如何编写一个If语句,其中包含一些可丢弃的对象

如果MySystem是一个IDisposable对象,那么你的类应该在dispose的实现中处置这个对象。

否则修复您的静态分析工具。

我会说你应该把这个处理放在知道你有一个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);
}

我不确定你所说的if语句是什么意思。如果你在方法/属性/构造函数(无论什么)中使用一次性实例,并且它们没有作为类的实例成员作用域,那么它们应该在使用后立即被处理掉。

如果你的类中有成员实现了IDisposable,那么你的类也应该实现IDisposable,并且应该在不再需要你的类的实例时调用Dispose(就像实现IDisposable的任何其他东西一样)。

在与实现IDisposable的实例交互时,始终使用try/finally或using block。

最后,请参阅微软的这篇文章,了解使用IDisposable的完整细节和最佳实践。

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;
   }
}
相关文章: