我可以使用'语句用于我的IDisposable类的实例

本文关键字:IDisposable 我的 实例 用于 语句 可以使 我可以 | 更新日期: 2023-09-27 18:12:02

如果我的类(在这种情况下,负责数据库连接)实现了IDisposable,是否有一种方法可以在实例化我的类时强制使用using语句 ?或者如果没有这样做,可能会产生一个编译器警告?

,

MyDAL = new MyDal(); // Warns or errors
using (MyDAL = new MyDAL()) // Does not warn or error

我可以使用'语句用于我的IDisposable类的实例

不,没有语言级别支持。

然而,你可能会发现像FxCop或ReSharper这样的工具可以警告它。(您需要弄清楚如何将其集成到您的工作流程中。)

不能在编译时抛出,但可以让终结器在调试模式下抛出异常。
这应该告诉您在调试期间对象没有被正确处理。

如果您确定唯一有效的用例是在using语句中,那么您需要自己控制它。

让你的构造函数(s) private,然后有static方法(s)接受任何所需的构造函数参数和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);
   }
}

如前所述,没有办法防止创建不会被处理的对象,除非您不允许外部代码创建对象,并且所有创建对象的方法在返回之前都将其处理掉。如果创建对象的方法必须在这些对象处于"活动"状态时返回,那么你能做的最好的事情就是让代码在知道对象应该被处理但却没有被处理时发出警报。虽然这可以在析构函数中完成,但一种更好的方法可能是让可丢弃对象在创建时将自己注册到"清理保护"中,并在处置它们时取消注册,然后让程序在需要清除所有内容时通知清理保护。

这种方法的一个优点是,与终结器不同,清理保护将在定义良好的线程上下文中运行,因此它将处于更好的位置来发出警报。此外,如果你的主线程代码是这样的:

void MainThreadProc(paramType param)
{
  CleanupGuard.RunGuardedCode(RealMainThreadProc, param);
}

,则RunGuardedCode可以创建清理守护,并将其与param一起传递给RealMainThreadProc,然后在RealMainThreadProc返回后通知它。如果这是创建清理守护的唯一公共方式,那么任何接收到清理守护的代码都可以确保它在这样的块中运行。

是的,我们可以,请看例子。

class test : IDisposable
{
    public void test()
    {
        using (test testobj = new test())
        {
        }
    }
}