アンマネージ リソースを使用する場合、それらを他のオブジェクトに渡すためのベスト プラクティスは何ですか? アンマネージ リソースを作成して破棄するのはクラスの責任であることは理解していますが、リソースをコンストラクタに渡した場合、リソースは永続化されます。コンストラクタは、オブジェクトの存続期間全体で使用するためにプライベート フィールドに配置します。
たとえば、次のシナリオを考えてみましょう。
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();
}
}
この状況で、ベスト プラクティスはどれですか。後で使用するためにプライベート変数に渡す方が確かに簡単に記述できますが、これによりリソースの破棄に問題が発生しますか? この例ではメソッドが 1 つしかないため、後者の方が優れているように見えますが、リソースを使用するメソッドが 10 ~ 15 個あり、リソースを必要とする他のクラスが呼び出されると、非常に面倒になる可能性があります。
過去にメモリ リークの問題が発生しましたが、それがアンマネージ リソースの処理方法であるかどうかはわかりません。アンマネージド リソースを引数で渡すように変更したのですが、50 個ほどのメソッドで引数になってしまい、面倒でした。