【问题标题】:C# Using block usage with static objectsC# 对静态对象使用块
【发布时间】:2009-04-15 18:32:56
【问题描述】:

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

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

谢谢!

【问题讨论】:

    标签: c# using


    【解决方案1】:

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

    【讨论】:

      【解决方案2】:

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

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

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

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

      【讨论】:

        【解决方案3】:

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

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2014-06-03
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多