Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/266.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 用';使用';供日后使用的声明_C#_Idisposable_Using - Fatal编程技术网

C# 用';使用';供日后使用的声明

C# 用';使用';供日后使用的声明,c#,idisposable,using,C#,Idisposable,Using,我们可以在构造函数中使用using语句来声明对象的实例以供以后使用吗。比如说 public class TestClass { private DataClassesDataContext _dataContext; public TestClass(string connString){ using (this._dataContext = DataClassesDataContext(connString)); } private bool s

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

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

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

因此,基本上您将创建一个
DataClassesDataContext
(我假设您错过了
new
关键字…),将引用存储在字段中,然后立即处理它。这不会很好地工作-您应该使用语句去掉
,但很可能使您的类实现
IDisposable
,以便在处置
TestClass
的实例时,处置数据上下文

using (this._dataContext =  DataClassesDataContext(connString));

try
{
    this._dataContext =  DataClassesDataContext(connString);
}
catch
{

}
finally
{
    if(this._dataContext!=null)
             ((IDisposable)this._dataContext).Dispose();
}
因此,您将在构造函数中释放_dataContext,它将不再可用。您应该实现
IDisposable
接口,并且您可以在需要的地方使用
语句,例如:

using (TestClass test = new TestClass("conn"))
{
   //your code
}
根据MSDN:

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

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

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

从这个角度来看,很明显datacontext不再在作用域中,因此不能被您希望的其他方法使用。要解决这个问题,您应该使类实现
IDisposeable

非常有趣的问题,我敢打赌,
\u dataContext
将在初始化结束时被处理,想一想通过这样做,您希望得到什么?现在向您的OP而不是向知道您在那里做什么的人解释一下,我必须使我的类“密封”才能工作。仍然不明白为什么,但谢谢。@Warz如果您的类未密封,则需要将dispose设置为虚拟,以防派生类也需要将成员设置为dispose。有关创建图案的方法,请参见。