使用非托管资源时,将它们传递给其他对象的最佳做法是什么?我知道它应该是创建非托管资源以处理它的类的责任,但是如果我将它传递给构造函数,该资源是否会持续存在,然后将它放在一个私有字段中以在对象的整个生命周期中使用。
例如,考虑以下场景:
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 种方法中的参数,这似乎很痛苦。