使用前生成和处理?

时间:2015-07-15 09:17:51

标签: c# dispose

今天我的intstructor,我在实习生,说我应该使用

    HImage hi = null;

    HOperatorSet.GenEmptyObject(out hi);
    hi.Dispose();

    hi = f.GrabImageAsync(-1.0);

而不是

    HImage hi = null;

    hi = f.GrabImageAsync(-1.0);

使用函数的原型如下

    void HOperatorSet.GenEmptyObj(out HObject emptyObject);
    HImage HFramegrabber.GrabImageAsync(double maxDelay);

我尊重我的讲师,但在调用hi = f.GrabImageAsync(-1.0);之前,我没有看到任何有意义的解释来创建和处理对象,因为该函数返回该对象的实例,因此不需要首先生成和处理对象,最起码,我是这么想的。

所以任何人都可以澄清它是否真的需要。提前谢谢。

2 个答案:

答案 0 :(得分:2)

我同意你的看法。通常,创建和立即处理变量没有用处。

从代码中可以看出,HOperatorSet.GenEmptyObject并未与您的f变量进行互动,因此调用该方法没有任何意义。

此外,将HImage hi设置为null没有意义,因为这可能是默认设置,并使用out参数设置。

所以我的赌注是:

HImage hi = f.GrabImageAsync(-1.0);

答案 1 :(得分:0)

WinForms中有一些类有多个目的,其中一些需要资源,而另一些则不需要。我最熟悉的是FontFont实例封装了字体设置的组合以及GDI字体资源的GDI句柄。大多数WinForms控件的Font属性设置器将使控件从传入的字体对象复制设置,并存储传入的Font引用的副本,以便它可以由调用属性getter,但不会导致控件实际使用传入的字体进行绘制。由于即使在处置完成后也可以从Font对象读取设置,因此在设置控件'Font属性时,实际上可以创建和处理Font个对象。在某些情况下,它可能是一种合理的最小邪恶方法:

  1. 如果创建并放弃Font个对象而不进行处置,那通常不会导致过多的GDI资源消耗,但这种一厢情愿的想法并不代表良好的设计。

  2. 在设置新值之前,在控件的旧值Dispose上调用Font的策略将要求每个控件拥有自己独立的Font对象,然后封装控件永远不会使用的资源。一个优点是,读取控件的Font属性的代码将能够直接使用该Font对象进行绘制。

  3. 让控件保持对已经放置的字体对象的引用将使多个控件可以安全地共享相同的字体对象,并且将比其他任何方法消耗更少的GDI资源。一个限制是,任何读取控件的Font属性并希望使用该字体绘制的代码都必须使用它来构造一个新的Font对象用于此目的(并且可能在使用后处理它) )。

  4. 恕我直言,在创建时立即处理Font个对象的事实是一个有用的模式,这表明框架应该包含单独的类型,用于描述字体(控件的目的) Font属性)并封装GDI字体对象(Font参数对字符串绘制方法的目的)。如果后一种类型包括Dispose而前一种类型没有,那么对于如何使用每种类型都毫无疑问。但是,由于存在Font类型,以及将其用于那些不相交的目的的代码,因此急切配置模式可能是一种合理的最小化方法。

    由于我不熟悉所涉及的类型,我不确定这种方法是否代表了教师示例中的内容。可能是GenEmptyObject返回的对象实际上并没有分配任何资源,并且它的Dispose方法什么也不做(并且声明可以安全地放弃特定对象可能比调用{{1}更好。过早地)但是如果对象获得了预期用途不需要的资源,那么早期处理可能是合适的如果被评论