C#对静态对象使用块使用

时间:2009-04-15 18:32:56

标签: c# using

我在C#程序的using块中添加了一些代码。我有点填充我的应用程序,以前是一个独立的现有代码体,所以我需要做一些搞乱使它适合。最终结果如下:

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();
        }
    }
}

好吧,这里的问题是:我现在是否已经削弱了使用块的效果和/或产生了任何可能对MainProgram类产生负面影响的特殊副作用?我相信Wrapper对象和它的内容将被Disposed并且执行将按预期继续,但是我需要注意的是我忽略了什么吗?

谢谢!

3 个答案:

答案 0 :(得分:6)

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

答案 1 :(得分:5)

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

然后,WrapperForMyOldApp中的Dispose()调用将进行清理。

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

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

答案 2 :(得分:1)

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

这不是一个糟糕的方法,但您需要知道封装的代码以了解Dispose()是否会做任何有用的事情。