【问题标题】:When and where to instantiate and dispose a disposable property of a class?何时何地实例化和处置一个类的一次性属性?
【发布时间】:2014-10-29 07:03:37
【问题描述】:

我知道Font 类实现了 IDisposable 接口,应该显式处理或使用using 子句进行处理

我有一个类,我想为它设置一个 Font 属性

class Test 
{ 
    Font Font {set; get;}  
    public Test()
    {
        Font = new Font("Arial", 16, FontStyle.Bold);                   
    }
}

我关心的是当类的对象被删除时处理它,我应该在何时何地实例化和处理它?

【问题讨论】:

    标签: c# fonts idisposable


    【解决方案1】:

    在封装应该被释放的对象时,通常推荐自己实现IDisposable

    class Test : IDisposable
    { 
        public Font Font { get; set; }  
    
        public Test()
        {
            Font = new Font("Arial", 16, FontStyle.Bold);                   
        }
    
        public void Dispose()
        {
            Dispose(true);
        }
    
        protected virtual void Dispose(bool disposing)
        {
            if (disposing)
            {
                Font.Dispose();
            }
        }
    }
    

    这样,您就可以在您的类中使用Font 类,并且只有在您使用完Test 类后才将其释放:

    using (Test test = new Test())
    {
       // Do stuff with test.
    }
    

    【讨论】:

    • 谢谢,然后从类的外部实例化另一种字体我不需要使用“new Font(...)”的语句而是类的语句,对吧?
    • 按照它的建议,如果我在全局类成员的情况下忽略这种样式会发生什么,例如上面的 Font 示例?
    • 它将留给终结者来清理Font资源。
    【解决方案2】:
    class Test 
    { 
        Font Font {set; get;}  
        public Test()
        {
            using (var font = new Font("Arial", 16, FontStyle.Bold))
            {
                // do something with font here
            } // font is automatically disposed when going out of scope
    
        }
    }
    

    using 语句的全部意义在于在本地做某事,而不必显式处置对象。

    因此,它并不真正适用于您的情况,您希望在测试类的所有成员函数中以某种方式使用“使用”运算符

    【讨论】:

    • 这没有抓住重点。他将无法使用 Font 属性,因为一旦构造函数完成,它将被释放。
    • 是的,很明显,因为我一开始并没有给它分配任何东西:) 整个原始问题在它制定 atm 的方式上没有抓住重点:)
    • 问题的重点是如何使用全局 IDisposable 属性
    • @YuvalItzchakov:实际上,即使在DisposeFont 调用之后,它仍然可以用于某些事情。最值得注意的是,为典型的内置控件设置Font 属性将导致它创建一个新的Font,其属性与传入的Font 对象的属性匹配,而不考虑所讨论的实例是否已经处置。恕我直言,微软应该记录这种行为,因为几乎可以肯定存在大量生产代码——无论是否有意——依赖它,并且在许多情况下创建并立即处理......
    • ...a Font 其唯一目的是用作控件的模板,这比尝试准确管理在许多控件之间共享的字体的生命周期要容易(也许更好应该有一个工厂方法,它会创建一个Font 对象,该对象在语义上等同于已处置的对象,但不会费心实际创建无论如何都不会使用的 GDI 资源)。跨度>
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-06-01
    • 1970-01-01
    • 2020-09-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多