Consultez le code suivant:Pourquoi un flux dispose-t-il lorsque son éditeur est éliminé?
using (var ms = new MemoryStream())
{
using(var writer = BinaryWriter(ms))
{
writer.Write(/*something*/);
writer.Flush();
}
Assert.That(ms.Length > 0); // Throws ObjectDisposedException
}
D'une part, un objet jetable devrait disposer des ressources de elle; Je comprends cela, mais d'un autre côté, l'objet n'a pas créé et ne possède pas cette ressource, il a été fourni -> le code appelant devrait en assumer la responsabilité ... non?
Je ne peux pas penser à d'autres situations comme celle-ci, mais est-ce un modèle cohérent dans le cadre pour toute classe recevant des objets jetables à disposer d'eux-mêmes?
Les objets ne doivent pas disposer de choses qu'ils ne possèdent pas *. Il est possible d'acquérir la propriété d'objets autrement qu'en les instanciant directement (le plus souvent en appelant une méthode usine). Étant donné que les méthodes d'usine ne renvoient généralement qu'un seul objet, il est nécessaire que toutes les ressources acquises par la méthode appartiennent à cet objet. Avoir un 'StreamWriter' s'approprier un flux transmis permet à une méthode d'usine de construire légitimement un flux et de renvoyer un' StreamWriter' qui l'encapsule. – supercat
@supercat hein no. Je suis d'accord avec vous sur "Les objets ne doivent pas disposer de choses qu'ils ne possèdent pas". C'est la bonne façon de le dire. Cependant, pas dans ce cas. En concevant la classe StreamWriter elle-même, vous n'avez aucune idée de la façon dont l'appelant gère le flux, et il ne devrait pas non plus le faire. Considérez les cas où un flux est utilisé dans plusieurs lecteurs. Ensuite, vous devez conditionner le StreamReader conditionnellement à l'aide d'instruction en fonction de si vous souhaitez le disposer? IDisposable devrait être warpped en utilisant l'instruction. Pas de questions posées. –
L'approche appropriée est pour le constructeur de 'StreamReader' /' StreamWriter' pour permettre à l'appelant de spécifier si la propriété est transférée (ce qu'ils font dans les versions ultérieures de .NET). Sinon, considérez comment on écrirait une méthode supposée lire de manière asynchrone une donnée audio récupérée à partir d'un StreamReader. Le code qui lit l'audio peut ne rien savoir sur le flux sous-jacent, et le code qui construit le 'StreamReader' peut n'avoir aucune idée quand le code de lecture est fait avec lui. Dans le cas courant où le flux a été ouvert uniquement dans le but de la lecture audio ... – supercat