有時我需要在一個函數中使用幾個一次性對象。最常見的情況是有StreamReader和StreamWriter,但有時甚至比這更多。擺脫嵌套使用(...)語句
嵌套使用語句快速加起來,看起來很醜。 爲了彌補這一點,我創建了一個小類,收集IDisposable對象,並在處置它們時處置它們。
public class MultiDispose : HashSet<IDisposable>, IDisposable
{
public MultiDispose(params IDisposable[] objectsToDispose)
{
foreach (IDisposable d in objectsToDispose)
{
this.Add(d);
}
}
public T Add<T>(T obj) where T : IDisposable
{
base.Add(obj);
return obj;
}
public void DisposeObject(IDisposable obj)
{
obj.Dispose();
base.Remove(obj);
}
#region IDisposable Members
public void Dispose()
{
foreach (IDisposable d in this)
{
d.Dispose();
}
}
#endregion
}
所以我的代碼現在看起來像這樣:
using (MultiDispose md = new MultiDispose())
{
StreamReader rdr = md.Add(new StreamReader(args[0]));
StreamWriter wrt = md.Add(new StreamWriter(args[1]));
WhateverElseNeedsDisposing w = md.Add(new WhateverElseNeedsDisposing());
// code
}
有什麼不對這種方法可能會導致在路上的問題? 我離開了繼承自HashSet的Remove函數,以便該類更加靈活。 當然,濫用這個功能可能會導致物體沒有被正確處理,但是還有很多其他的方法可以在沒有這個課程的情況下在腳下拍攝自己。
-1:問題太主觀 – Simon 2010-05-16 19:08:54
海事組織 - 在許多層面上只是一個壞主意。我希望你在這裏找到指導,爲了你自己和你可能工作的任何團隊成員。請參閱Skeet的回答。 – 2010-05-16 19:26:13
@Simon:別傻了。我們在這裏一直都有關於命名,資本化和縮進的問題。相比之下,這是相當可觀的。 – 2010-05-16 19:42:00