3

我们是否可以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

4 回答 4

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();
   }
}
于 2013-07-01T14:05:38.343 回答
6

目前尚不清楚您希望该using声明在这里做什么。它所做的只是确保Dispose在块的末尾调用它。

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

于 2013-07-01T14:05:52.267 回答
1

根据 MSDN:

using 语句以正确的方式调用对象的 Dispose 方法,并且(当您如前所示使用它时)它还会导致对象本身在调用 Dispose 时立即超出范围。

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

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

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

于 2013-07-01T14:13:53.283 回答
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
}
于 2013-07-01T14:07:31.710 回答