J'ai un composant tiers qui manipule les fichiers PDF. Chaque fois que j'ai besoin d'effectuer des opérations, je récupère les documents PDF à partir d'un magasin de documents (base de données, SharePoint, système de fichiers, etc.). Pour rendre les choses un peu cohérentes, je passe les documents PDF autour de byte[]
.Mon code nettoie-t-il correctement sa liste <MemoryStream>?
Ce composant tiers attend un MemoryStream[]
(tableau MemoryStream
) en tant que paramètre de l'une des principales méthodes que j'ai besoin d'utiliser.
Je tente d'intégrer cette fonctionnalité dans mon propre composant afin que je puisse utiliser cette fonctionnalité pour un certain nombre de domaines dans mon application. Je suis venu avec essentiellement les suivantes:
public class PdfDocumentManipulator : IDisposable
{
List<MemoryStream> pdfDocumentStreams = new List<MemoryStream>();
public void AddFileToManipulate(byte[] pdfDocument)
{
using (MemoryStream stream = new MemoryStream(pdfDocument))
{
pdfDocumentStreams.Add(stream);
}
}
public byte[] ManipulatePdfDocuments()
{
byte[] outputBytes = null;
using (MemoryStream outputStream = new MemoryStream())
{
ThirdPartyComponent component = new ThirdPartyComponent();
component.Manipuate(this.pdfDocumentStreams.ToArray(), outputStream);
//move to begining
outputStream.Seek(0, SeekOrigin.Begin);
//convert the memory stream to a byte array
outputBytes = outputStream.ToArray();
}
return outputBytes;
}
#region IDisposable Members
public void Dispose()
{
for (int i = this.pdfDocumentStreams.Count - 1; i >= 0; i--)
{
MemoryStream stream = this.pdfDocumentStreams[i];
this.pdfDocumentStreams.RemoveAt(i);
stream.Dispose();
}
}
#endregion
}
Le code d'appel à mon "wrapper" ressemble à ceci:
byte[] manipulatedResult = null;
using (PdfDocumentManipulator manipulator = new PdfDocumentManipulator())
{
manipulator.AddFileToManipulate(file1bytes);
manipulator.AddFileToManipulate(file2bytes);
manipulatedResult = manipulator.Manipulate();
}
Quelques questions sur ce qui précède:
- Est-ce le
using
clause dans la méthodeAddFileToManipulate()
redondant et inutile? Est-ce que je nettoie les choses correctement dans la méthodeDispose()
de mon objet? Est-ce une utilisation «acceptable» deMemoryStream
? Je ne prévois pas beaucoup de fichiers dans la mémoire à la fois ... Probablement 1-10 pages au total PDF, chaque page environ 200KB. Application conçue pour fonctionner sur un serveur prenant en charge un site ASP.NET. - Des commentaires/suggestions?
Merci pour la révision du code :)
Plutôt que de compter en arrière et faire RemoveAt en Dispose, le code'd être plus simple si vous venez comptiez avant et appelé clairement à la fin. – Dave