具有接口和内存泄漏的C#多重继承
我正在编写一个C#程序,其中有一个类继承了多个接口,如下所示具有接口和内存泄漏的C#多重继承,c#,.net,C#,.net,我正在编写一个C#程序,其中有一个类继承了多个接口,如下所示 class MyClass:IMyInterface,IExampleInterface,IDisposable { } 但同样地,IMyInterface或IExampleInterface都不单独继承IDisposable。但当我创建一个接口实例时,例如 IMyInterfacce myInterface = new MyClass(); 并分析我的代码(使用Coverity工具),我发现有一个资源泄漏,并且对象my
class MyClass:IMyInterface,IExampleInterface,IDisposable
{
}
但同样地,IMyInterface或IExampleInterface都不单独继承IDisposable。但当我创建一个接口实例时,例如
IMyInterfacce myInterface = new MyClass();
并分析我的代码(使用Coverity工具),我发现有一个资源泄漏,并且对象myInterface没有释放内存中由它持有的资源。
虽然我正在使用new MyClass()实例化MyClass实例,但同样地,IMyInterface并没有实现IDisposable,尽管MyClass实现了IDisposable
那么,就“myInterface”对象而言,到底为什么我会收到关于资源泄漏/内存泄漏的投诉呢
非常欢迎任何建议。当您创建一个类并将其分配给接口时,您仍然创建了该类类型的实例
IMyInterfacce myInterface = new MyClass();
仍然创建一个MyClass
对象,myInterface引用一个MyClass
对象。因此,myInterface
仍然引用需要处理的类的实例
完成后,您必须将其回滚并调用Dispose
:
((IDisposable)myInterface).Dispose();
// Or
((MyClass)myInterface).Dispose();
或者您可以将其包装在using语句中:
using (MyClass myClass = new MyClass()) {
MyInterface myInterface = myClass;
}
创建类并将其分配给接口时,仍然创建了该类类型的实例
IMyInterfacce myInterface = new MyClass();
仍然创建一个MyClass
对象,myInterface引用一个MyClass
对象。因此,myInterface
仍然引用需要处理的类的实例
完成后,您必须将其回滚并调用Dispose
:
((IDisposable)myInterface).Dispose();
// Or
((MyClass)myInterface).Dispose();
或者您可以将其包装在using语句中:
using (MyClass myClass = new MyClass()) {
MyInterface myInterface = myClass;
}
IMyInterface
只是一个接口,它没有实现,基本上是一个代码契约,所以它不能保存内存。无论在您的实现中是什么,都在执行它。如果MyClass
的任何接口都具有implIDisposable
,为什么要在MyClass中尝试impl它?如果imyinterface
不是implIDisposable
,但您使用imyinterface myInterface=new MyClass()代码>,您无法处理对象,您需要使用类型转换。@Ron您完全正确,IMyInterface没有实现,因此无法保存内存。但是当我实例化IMyInterface myInterface=newmyclass()时;这就是myInterface在内存中占用空间,并且在代码超出范围后不会释放它。@user2913184IDisposable
不会自动释放资源,它只在您显式调用Dispose
或在using
语句中使用时释放资源,它调用了Dispose
。我想为什么在我实例化IMyInterface时,MyClass上的implicisposable为处理myInterface对象提供了理由。IMyInterface
只是一个接口,它没有实现,它基本上是一个代码契约,所以它不能保存内存。无论在您的实现中是什么,都在执行它。如果MyClass
的任何接口都具有implIDisposable
,为什么要在MyClass中尝试impl它?如果imyinterface
不是implIDisposable
,但您使用imyinterface myInterface=new MyClass()代码>,您无法处理对象,您需要使用类型转换。@Ron您完全正确,IMyInterface没有实现,因此无法保存内存。但是当我实例化IMyInterface myInterface=newmyclass()时;这就是myInterface在内存中占用空间,并且在代码超出范围后不会释放它。@user2913184IDisposable
不会自动释放资源,它只在您显式调用Dispose
或在using
语句中使用时释放资源,调用Dispose
。我想为什么在我实例化IMyInterface时,MyClass上的implicisposable会导致处理myInterface对象。@shf301我想这绝对是我想要的。谢谢你,朋友。@user2913184如果你发现这个问题很有帮助,请将问题标记为已回答。@shf301我想这绝对是我要找的。谢谢你的朋友。@user2913184如果你觉得这很有帮助,请把问题标记为已回答。