我在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并且执行将按预期继续,但是我需要注意的是我忽略了什么吗?
谢谢!
答案 0 :(得分:6)
你的包装器类是否实现了IDisposable并且你只是没有显示它?如果它不是一次性的,那么根本不需要使用using语句。
答案 1 :(得分:5)
为了使其正常工作,您需要让WrapperForMyOldApp实现IDisposable。
然后,WrapperForMyOldApp中的Dispose()调用将进行清理。
但是,静态对象通常用于具有超出单个对象的生命周期的对象。通常,对于这种类型的用法,您将使ItemThatINeed实例非静态,在WrapperForMyOldApp构造函数中生成它们,然后在WrapperForMyOldApp.Dispose()中清除它们。
使用静态对象,你可能会创建一个噩梦 - 你正在构建对象,然后说你要执行清理(在使用块的末尾),所以你Dispose()方法将是清理静态对象。但是,如果再次使用它们会发生什么?如果在2个线程中创建两个WrapperForMyOldApp实例,那么正确的行为是什么?如果你想要确定性的清理,我会考虑这些问题。
答案 2 :(得分:1)
好吧,如果WrapperForMyOldApp
实现IDisposable
,并且您的Dispose()
实现可以确保删除任何资源,那么它应该可以工作......但是可能会有其他副作用。代码可能会改变全局(静态)状态,例如文化等。它可能会产生线程。各种各样的事情。
这不是一个糟糕的方法,但您需要知道封装的代码以了解Dispose()
是否会做任何有用的事情。