如何创建一次性类

bRa*_*dOn 5 c#

每次我实例化该类时我都有这个类我需要处理它,包括该类中的字段有没有办法做到这一点?这是我的课

    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)

我做错了吗?

Tim*_*out 5

看起来你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。

来源:IDisposable界面

使用语句 https://learn.microsoft.com/en-us/dotnet/csharp/language-reference/keywords/using-statement