0

我正在将一些代码添加到usingC# 程序的块中。我正在填充我的应用程序,该应用程序以前是一个独立的现有代码体,所以我需要做一些混乱以使其正确适应。它最终的样子如下:

public class WrapperForMyOldApp
{

    public static ItemThatINeed item1;
    public static ItemThatINeed item2;

    public WrapperForMyOldApp () 
    {
        item1 = new ItemThatINeed();
        item2 = new ItemThatINeed();
    }

    public static go()
    {
        // some stuff that i need to do with items 1 and 2
    }
}

public class MainProgram 
{
    .
    .
    .

    public void MethodThatNeedsToMakeUseOfMyApp ()
    {
        ....
        using (WrapperForMyOldApp oldAPp = new WrapperForMyOldApp())
        {
            WrapperForMyOldApp.go();
        }
    }
}

好的,所以这里的问题是:我现在是否削弱了 using 块的效果和/或创建了任何可能对 MainProgram 类产生不利影响的特殊副作用?我相信 Wrapper 对象及其内容将被 Disposed 并且执行将按预期继续,但是我需要注意什么我忽略了?

谢谢!

4

3 回答 3

6

您的包装类是否实现了 IDisposable 而您只是没有显示它?如果它不是一次性的,那么您根本不需要 using 语句。

于 2009-04-15T18:37:53.413 回答
5

为了使其工作,您需要让 WrapperForMyOldApp 实现 IDisposable。

WrapperForMyOldApp 中的 Dispose() 调用将执行您的清理工作。

但是,静态对象通常用于生命周期超出单个对象的对象。通常,对于这种类型的使用,您可以使 ItemThatINeed 实例非静态,在 WrapperForMyOldApp 构造函数中生成它们,然后在 WrapperForMyOldApp.Dispose() 中清理它们。

使用静态对象,您可能会创建一个噩梦 - 您正在构建对象,然后说您要执行清理(在 using 块的末尾),因此您的 Dispose() 方法将清理静态对象。但是,如果它们再次被使用,会发生什么?如果在 2 个线程中创建两个 WrapperForMyOldApp 实例,正确的行为是什么?如果您想要确定性清理,我会考虑这些问题。

于 2009-04-15T18:38:47.157 回答
1

好吧,如果WrapperForMyOldAppimplements IDisposable,并且您的Dispose()实现可以确保摆脱任何资源,那么它应该可以工作......但可能会有其他副作用。代码可以更改全局(静态)状态,例如文化等。它可以产生线程。各种各样的事情。

这不是一个坏方法,但您需要知道您封装的代码是做什么的,才能知道是否Dispose()会做任何有用的事情。

于 2009-04-15T18:39:42.817 回答