如果我的类(在这种情况下负责数据库连接)实现了IDisposable
,那么在实例化我的类时,是否可以强制使用 using语句 ?或者如果没有这样做,可能会产生编译器警告?
例如:
MyDAL = new MyDal(); // Warns or errors
using (MyDAL = new MyDAL()) // Does not warn or error
答案 0 :(得分:3)
不,没有语言级支持。
但是,您可能会发现FxCop或ReSharper等工具可以发出警告。 (您需要弄清楚如何将其集成到您的工作流程中。)
答案 1 :(得分:3)
不是在编译时,但是你可以让终结器在调试模式下抛出异常 这应该告诉你在调试过程中对象没有正确处理。
答案 2 :(得分:2)
如果您确定唯一有效的用例在using
语句中,那么您需要自己控制它。
创建构造函数private
,然后使用static
方法接受任何必需的构造函数参数和lambda /委托,类似(假设没有构造函数参数):
public static void UseMyDal(Action<MyDal> actions){
using(var dal = new MyDal())
{
actions(dal);
}
}
(如果你感到慷慨,你也可以提供接受Func<MyDal,T>
的通用重载,以便调用者可以检索一个值:
public static T UseMyDal<T>(Func<MyDal,T> actions){
using(var dal = new MyDal())
{
return actions(dal);
}
}
答案 3 :(得分:1)
如上所述,除非您不允许外部代码创建对象,否则无法阻止创建不会被处置的对象,以及所有方法在返回之前创建对象处理它。如果创建对象的方法必须返回而这些对象是&#34; live&#34;,那么你可以做的最好的事情就是当代码知道对象应该已被处置时,代码会发出警报,但是还没有。虽然这可以在析构函数中完成,但更好的方法可能是让一次性对象使用&#34; cleanup guard&#34;当它们被创建时,当它们被处理时取消注册,然后让程序在清理所有内容时通知清理后卫。
这种方法的一个优点是,与终结器不同,清理防护装置将在明确定义的线程环境中运行,因此它可以在更好的位置发出警报。此外,如果您的主线程代码类似于:
void MainThreadProc(paramType param)
{
CleanupGuard.RunGuardedCode(RealMainThreadProc, param);
}
然后RunGuardedCode
可以创建清理监护人,将其与RealMainThreadProc
一起传递给param
,然后在RealMainThreadProc
返回后通知它。如果这是创建清理监护人的唯一公共方式,那么任何收到清理监护人的代码都可以确定它是在这样的区块内运行的。
答案 4 :(得分:-2)
是的,我们可以,请参阅示例。
class test : IDisposable
{
public void test()
{
using (test testobj = new test())
{
}
}
}