使用'using'语句声明对象以用于以后的目的

时间:2013-07-01 14:03:40

标签: c# idisposable using

我们可以在构造函数中使用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
   }
}

4 个答案:

答案 0 :(得分:8)

您必须自己实施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();
   }
}

答案 1 :(得分:6)

目前尚不清楚您对using语句的期望。它所做的就是确保在块的末尾调用Dispose

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

答案 2 :(得分:1)

根据MSDN:

  

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

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

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

以这种方式看待它很明显,datacontext不再在范围内,因此不能被其他方法使用。要解决此问题,您应该使类实现IDisposeable

答案 3 :(得分:0)

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
}