【问题标题】:Declare object with 'using' statement for later purposes使用 'using' 语句声明对象以供以后使用
【发布时间】:2013-07-01 22:21:09
【问题描述】:

我们是否可以在构造函数中使用using 语句来声明对象的实例以供以后使用。例如。

public class TestClass {

   private DataClassesDataContext _dataContext;

   public TestClass(string connString){
       using (this._dataContext =  DataClassesDataContext(connString));
    }

   private bool someMethod(){
       _dataContext.instanceMethod(); // i want to use instance methods wherever needed and define once
   }
}

【问题讨论】:

  • 非常有趣的问题,我敢打赌 _dataContext 将在初始化结束时被处理
  • 能够做到这一点,您希望获得什么?

标签: c# idisposable using


【解决方案1】:

您必须自己实现IDisposable,并通过您的Dispose 方法在数据上下文上调用Dispose。

public class TestClass : IDisposable {

   private DataClassesDataContext _dataContext;

   public TestClass(string connString){
       _dataContext = new DataClassesDataContext(connString);
    }

   private bool someMethod(){
       _dataContext.instanceMethod(); // i want to use instance methods wherever needed and define once
   }

   public void Dispose(){
       _dataContext.Dispose();
   }
}

【讨论】:

  • 我必须让我的班级“密封”才能正常工作。仍然不明白为什么,但谢谢。
  • @Warz 如果您的类没有密封,您需要将 dispose 设置为虚拟,以防派生类也需要设置成员。有关创建模式的方法,请参阅the MSDN page on Dispose。
【解决方案2】:

不清楚您希望using 语句在此处做什么。它所做的只是确保在块的末尾调用Dispose。

所以基本上你会创建一个DataClassesDataContext(我假设你错过了new 关键字...),在一个字段中存储一个引用,然后立即处理它。这不会很好 - 您应该摆脱 using 语句,但很可能让您的类实现 IDisposable 以便在处置 TestClass 的实例时,您处置数据上下文。

【讨论】:

    【解决方案3】:

    根据 MSDN:

    using 语句调用对象中的 Dispose 方法 正确的方法,并且(当您如前所示使用它时)它也会导致 一旦调用 Dispose,对象本身就会超出范围。

    using 语句基本上是 try/finally 的语法糖。

     try
      {
        _dataContext = new DataClassesDataContext(connString);
      }
      finally
      {
        if (_dataContext != null)
          ((IDisposable)dataContext).Dispose();
      }
    

    以这种方式查看它应该很明显 datacontext 不再在范围内,因此不能根据您的需要由其他方法使用。为了解决这个问题,你应该让类实现IDisposeable。

    【讨论】:

      【解决方案4】:
      using (this._dataContext =  DataClassesDataContext(connString));
      

      和

      一样
      try
      {
          this._dataContext =  DataClassesDataContext(connString);
      }
      catch
      {
      
      }
      finally
      {
          if(this._dataContext!=null)
                   ((IDisposable)this._dataContext).Dispose();
      }
      

      所以你会在你的构造函数中得到 _dataContext ,并且它将不再可用。您应该实现IDisposable 接口,您将能够在您想要的地方使用using 语句,如下所示:

      using (TestClass test = new TestClass("conn"))
      {
         //your code
      }
      

      【讨论】:

      • 现在向你的 OP 解释这一点,而不是向知道你在那里做什么的人解释
      猜你喜欢
      • 1970-01-01
      • 2013-06-08
      • 1970-01-01
      • 2011-07-06
      • 1970-01-01
      • 2020-03-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多