代码之家  ›  专栏  ›  技术社区  ›  mbeckish

如何正确使用实现IDisposable的静态属性?

  •  4
  • mbeckish  · 技术社区  · 17 年前

    举个例子:

    using (Brushes.Black)
    {
    ...
    }
    

    不是个好主意,因为它是静态的。下次你的应用程序使用brush.black时,你会遇到问题,因为它已经被处理掉了。

    现在,如果您只使用brush.black,那么不处理它可能是可以的,因为您只剩下一个未管理的资源(希望!)躺着。

    但是,总的来说,你应该避免使用大量的静态IDisposables,还是我遗漏了一些东西?

    2 回复  |  直到 14 年前
        1
  •  3
  •   Guffa    17 年前

    通常只使用它们,让框架类担心如何处理它们。

    它们就在那里,这样您就可以使用它们,而不必每次都创建和处理它们。每一个都是在您第一次使用它时创建的,并缓存在哈希表中。框架类负责在应用程序关闭时正确地处理它们。

    没有多少静态的IDisposables需要你去担心。如果你使用了大量的画笔,你可能会用一个循环中的颜色来创建它们(当然,你也要负责处理它们)。

        2
  •  2
  •   Dario    17 年前

    举个例子:

    使用(brush.black)…}

    不是个好主意,因为它是 静态的。下次应用程序转到 用刷子。黑色的,你会 问题,因为 处理。

    它不仅仅是一个静态字段,属性还主动运行代码,以便在需要时创建新的实例。看看对应的代码( 反射器 ):

    public static Brush Black
    {
        get
        {
            Brush brush = (Brush) SafeNativeMethods.Gdip.ThreadData[BlackKey];
            if (brush == null)
            {
                brush = new SolidBrush(Color.Black);
                SafeNativeMethods.Gdip.ThreadData[BlackKey] = brush;
            }
            return brush;
        }
    }
    
    推荐文章