可以在我的方法的顶部实例化一个MemoryStream,为它做一堆东西,然后使用它吗?
例如:
public static byte[] TestCode()
{
MemoryStream m = new MemoryStream();
...
...
whole bunch of stuff in between
...
...
//finally
using(m)
{
return m.ToArray();
}
}
更新了代码
public static byte[] GetSamplePDF()
{
using (MemoryStream m = new MemoryStream())
{
Document document = new Document();
PdfWriter.GetInstance(document, m);
document.Open();
PopulateTheDocument(document);
document.Close();
return m.ToArray();
}
}
private static void PopulateTheDocument(Document document)
{
Table aTable = new Table(2, 2);
aTable.AddCell("0.0");
aTable.AddCell("0.1");
aTable.AddCell("1.0");
aTable.AddCell("1.1");
document.Add(aTable);
for (int i = 0; i < 20; i++)
{
document.Add(new Phrase("Hello World, Hello Sun, Hello Moon, Hello Stars, Hello Sea, Hello Land, Hello People. "));
}
}
我的观点是尝试重用构建字节码。换句话说,构建任何类型的文档,然后将其发送到TestCode()方法。
答案 0 :(得分:2)
从技术上讲,这是可能的,但这是毫无意义的。如果您真的想避免在该代码周围使用“using”语句,只需直接调用Dispose()
。
您应该将使用MemoryStream的整个工作放入using语句中。这保证了MemoryStream的Dispose方法将被调用,即使你在“一堆中间的东西”代码中收到异常。现在的方式,异常会阻止你的MemoryStream调用Dispose()
。
处理此问题的正确方法是:
public static byte[] TestCode()
{
MemoryStream m = new MemoryStream();
using(m)
{
// ...
// ...
// whole bunch of stuff in between
// ...
// ...
return m.ToArray();
}
}
或者,更常见的形式:
public static byte[] TestCode()
{
using(MemoryStream m = new MemoryStream())
{
// ...
// ...
// whole bunch of stuff in between
// ...
// ...
return m.ToArray();
}
}
答案 1 :(得分:1)
当看到这样的问题时,我常常想知道我们是否会更好地使用Java模型。 .NET程序员对那些狗狗IDisposable遭受了巨大的痛苦。在关于SO(等)的数千个问题之后,它仍然知之甚少。
这是内存流。当你使用内存时,没有什么需要处理的,垃圾收集器已经处理好了。它不是某种特殊的内存,因为该类有一个Dispose()方法,只有一种。另一种是由UnmanagedMemoryStream包装的。 MemoryStream从Stream继承了do-nothing Dispose()方法,这是一个令人遗憾的OOP责任。
由你决定肆无忌惮地调用无操作方法,这取决于你。或者你可以负责你的代码并拒绝调用你知道现在没有做任何有用的方法,也不会永远在你的职业生涯中做任何有用的事情。显然,我在第二阵营,我们的预期寿命必须更好。无论如何我希望。再说一遍,这篇文章可能会让你休息一天。