2

使用非托管资源时,将它们传递给其他对象的最佳做法是什么?我知道它应该是创建非托管资源以处理它的类的责任,但是如果我将它传递给构造函数,该资源是否会持续存在,然后将它放在一个私有字段中以在对象的整个生命周期中使用。

例如,考虑以下场景:

public class Source
{
     public static void Main(string[] args)
     {
          using (MyUnmanagedResource r = new MyUnmanagedResource())
          {
               Helper helper = new Helper(r);
               helper.M1();

               Helper helper2 = new Helper();
               helper2.M2(r);
          }
     }
}
public class Helper
{
     private MyUnmanagedResource resource;

     public Helper(){}
     public Helper(MyUnmanagedResource r)
     {
       resource = r;
     }

     public void M1()
     {
        Changer c = new Changer(resource);
        c.M1();

     }
     public void M2(MyUnmanagedResource re)
     {
        Changer c = new Changer();
        c.M2(re);
     }
}
public class Changer
{
     private MyUnmanagedResource resource;

     public Changer(){}
     public Changer(MyUnmanagedResource r)
     {
       resource = r;
     }

     public void M1()
     {
        resource.DoThing();
     }
     public void M2(MyUnmanagedResource re)
     {
        re.DoThing2();
     }
}

在这种情况下,最佳做法是什么?将它传递给私有变量以供以后使用当然更容易编写,但这会导致资源处理问题吗?在这个例子中只有一个方法,后者看起来更好,但是当你有 10-15 个方法使用资源时,并且调用的其他类也需要资源时,它会变得非常混乱。

我过去曾遇到过内存泄漏问题,我不确定这是否是我处理非托管资源的方式。我将非托管资源更改为通过参数传递,但这导致它成为大约 50 种方法中的参数,这似乎很痛苦。

4

0 回答 0