Je souhaite que nous avons tendance « utilisable » en C#, lorsque le bloc de code d'utilisation construction serait passé à une fonction en tant que délégué:IUsable: le contrôle des ressources d'une meilleure façon que IDisposable
class Usable : IUsable
{
public void Use(Action action) // implements IUsable
{
// acquire resources
action();
// release resources
}
}
et dans le code utilisateur :
using (new Usable())
{
// this code block is converted to delegate and passed to Use method above
}
Plus:
- exécution contrôlée, les exceptions
- Le fait d'utiliser « utilisable » est visible dans la pile d'appel
Moins:
- Coût du délégué
Pensez-vous qu'il est possible et utile, et si elle doesn pas de problèmes du point de vue linguistique? Y a-t-il des pièges que vous pouvez voir?
EDIT: David Schmitt proposed les éléments suivants
using(new Usable(delegate() {
// actions here
}) {}
Il peut fonctionner dans le scénario de l'échantillon comme ça, mais en général vous avez des ressources déjà allouées et que vous voulez qu'il ressemble à ceci:
using (Repository.GlobalResource)
{
// actions here
}
Où GlobalResource (oui, je sais que les ressources globales sont mauvaises) implémente IUsable. Vous pouvez réécrire est aussi courte que
Repository.GlobalResource.Use(() =>
{
// actions here
});
Mais il semble un peu bizarre (et plus bizarre si vous implémentez l'interface explicitement), et cela est si souvent le cas dans diverses saveurs, que je pensais qu'il mérite d'être nouveau sucre syntaxique dans une langue.