每次我实例化该类时我都有这个类我需要处理它,包括该类中的字段有没有办法做到这一点?这是我的课
internal class PlayerClass
{
public WindowsMediaPlayer _wplayer;
}
Run Code Online (Sandbox Code Playgroud)
使用后如何处理该类?曾试图在互联网上找到一种方法,但经过测试后都没有奏效。
我试过这个
internal class PlayerClass : IDisposable
{
public WindowsMediaPlayer _wplayer;
public void Dispose()
{
Dispose(true);
GC.SuppressFinalize(this);
}
/// <summary>
/// Is this instance disposed?
/// </summary>
protected bool Disposed { get; private set; }
/// <summary>
/// Dispose worker method. See http://coding.abel.nu/2012/01/disposable
/// </summary>
/// <param name="disposing">Are we disposing?
/// Otherwise we're finalizing.</param>
protected virtual void Dispose(bool disposing)
{
Disposed = true;
}
}
Run Code Online (Sandbox Code Playgroud)
我做错了吗?
看起来你IDisposable只是为了它的目的而实现,这对于托管代码来说是不必要的。垃圾收集器会自动清理你身后的垃圾。
您可能需要在帖子中澄清为什么要实施IDisposable.
但是我相信你的错误是Dispose()垃圾收集器不会自动调用它。如果您确实实现,IDisposable则必须确保使用您的类的代码在语句内实例化using()或手动调用.Dispose. 否则你的dispose方法将永远不会触发。
using(var player = new PlayerClass()){
// Do something with player
// player.Dispose() is called automatically when you exit this using statement.
}
Run Code Online (Sandbox Code Playgroud)
由于您依赖调用者来确保Dispose被调用,因此您可能还想查看 a SafeHandle(首选)或Finalize.
因为
IDisposable.Dispose当不再需要实例拥有的资源时,类型的使用者会调用该实现,因此您应该将托管对象包装在 a 中SafeHandle(推荐的替代方案),或者Object.Finalize在以下情况下重写以释放非托管资源:消费者忘记调用 Dispose。
使用语句 https://learn.microsoft.com/en-us/dotnet/csharp/language-reference/keywords/using-statement
| 归档时间: |
|
| 查看次数: |
16335 次 |
| 最近记录: |