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

您何时处理gdi+资源?

  •  9
  • Niki  · 技术社区  · 16 年前

    许多gdi+类实现IDisposable,但我不确定何时应该调用Dispose。很明显,我创建的实例 new 或静态方法 Graphics.CreateGraphics . 但是属性getter返回的对象呢?我经常这样写代码:

    var oldRgn = g.Clip;
    using (var rectRegion = new Region(rectangle))
    {
        g.Clip = rectRegion;
        // draw something
    }
    g.Clip = oldRgn;
    

    我应该处理吗 oldRgn 之后?我的内存分析器告诉我,如果没有的话,会有未解决的实例。查看Reflector中的实现,至少可以确认getter每次调用时都会创建一个新实例:

    // Graphics.Clip code from Reflector:
    public Region get_Clip()
    {
        Region wrapper = new Region();
        int status = SafeNativeMethods.Gdip.GdipGetClip(new HandleRef(this, this.NativeGraphics), new HandleRef(wrapper, wrapper.nativeRegion));
        if (status != 0)
        {
            throw SafeNativeMethods.Gdip.StatusException(status);
        }
        return wrapper;
    }
    

    我在msdn中找不到任何相关信息,文档中的样本似乎从未处理过任何内容。

    1 回复  |  直到 16 年前
        1
  •  2
  •   Kerido    16 年前

    一般来说,如果是 IDisposable ,您必须拨打 .Dispose 方法,当不需要对象时。

    另外,msdn图书馆说:

    修改返回的区域对象 由clip属性不影响 带图形的后续绘图 对象。要更改剪辑区域, 将clip属性值替换为 新区域对象。

    也就是说,你必须处理 oldRgn .