首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何编写包含一些可任意处理对象的If语句

如何编写包含一些可任意处理对象的If语句
EN

Stack Overflow用户
提问于 2015-08-25 04:24:43
回答 3查看 122关注 0票数 0

我有以下一段C#代码

代码语言:javascript
复制
  iSomeObject.MyPoint(SomeConstants.cpU, 2,
                          myInterface.MySystem.MyCustomType == OtherConstants.cpProjected ? Constants.cpU : Constants.cpT,
                          1, ref t1, ref t2, ref t3);

当我运行我的专有分析工具时,它显示myInterface.MySystem导致了资源泄漏。

代码语言:javascript
复制
 class MyClass:MyInterface,IDisposable
 {}
  MyInterface myInterface = new MyClass();

我显式地通过将实例myInstance转换回IDisposable并对其调用Dipose()方法来处理它。

现在,在myInterface ( MySystem )上调用MySystem属性的get方法,它的类型为IExampleInterface,其进一步实现如以下代码所示:

代码语言:javascript
复制
 class ExampleClass:IExampleClass,IDisposable
 {}

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

任何建议都将不胜感激。

EN

回答 3

Stack Overflow用户

发布于 2015-08-25 04:33:12

如果MySystem是一个IDisposable对象,那么您的类应该在它的Dispose实现中处理该对象。

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

票数 0
EN

Stack Overflow用户

发布于 2015-08-25 04:49:40

我会说你应该把处理放在知道你有一个MyClass的代码层。

代码语言:javascript
复制
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);
}
票数 0
EN

Stack Overflow用户

发布于 2015-08-25 04:50:07

我不确定你说的if是什么意思。如果您在方法/属性/构造函数(无论什么)中使用可处置实例,并且它们的作用域不是该类的实例成员,那么它们应该在使用后立即被销毁。

如果类中有实现IDisposable的成员,那么您的类也应该实现IDisposable,一旦不再需要类的实例,就应该调用Dispose (就像实现IDisposable的任何其他实例一样)。

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

最后,有关使用IDisposable的完整细节和最佳实践,请参阅微软的this write up

代码语言:javascript
复制
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;
   }
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/32191131

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档