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。有关创建图案的方法,请参见。