Je considère cela comme un abus de l'utilisation de déclaration. Je suis conscient que je suis en minorité sur cette position.
Je considère être un abus pour trois raisons.
D'abord, parce que j'attends de cette "aide" est utilisé pour l'utilisation d'une ressource et d' en disposer lorsque vous avez terminé avec elle. Changement de programme de l'etat n'est pas l'utilisation d'une ressource et de le changer en arrière n'est pas l'élimination quoi que ce soit. Par conséquent, "l'aide" à muter et à la restauration de l'état est un abus; le code est trompeur pour le lecteur occasionnel.
Deuxièmement, parce que je m'attends à "l'aide" à être utilisé par politesse, non par nécessité. La raison pour laquelle vous utilisez "l'aide" de disposer d'un fichier lorsque vous en avez terminé avec ce n'est pas parce qu'il est nécessaire de le faire, mais parce qu'il est poli -- quelqu'un d'autre pourrait être en attente pour utiliser ce fichier, donc dire que "fait" le moralement correct chose à faire. Je pense que je devrais être en mesure de refactoriser une "aide" de sorte que l'utilisation des ressources est maintenu plus longtemps, et vendus plus tard, et que le seul effet de faire légèrement gêner les autres processus. Une "aide" bloc qui a sémantique des répercussions sur le programme de l'état est abusif car il cache un rôle important, la nécessaire mutation de programme, dans une construction qui ressemble comme il est là pour des raisons de commodité et de politesse, non par nécessité.
Et la troisième, de votre programme les actions sont déterminées par son état; le besoin de soin dans la manipulation de l'etat est précisément la raison pour laquelle nous allons avoir cette conversation en premier lieu. Considérons la manière dont nous pourrions analyser votre programme d'origine.
Étiez-vous de porter cette question à un examen de code dans mon bureau, la première question que je voudrais poser est: "est-il vraiment correct pour verrouiller le frobble si une exception est levée?" C'est flagrant à partir de votre programme, cette chose de façon agressive re-verrouille le frobble, quoi qu'il arrive. Est ce que le droit? Une exception a été levée. Le programme est dans un état inconnu. Nous ne savons pas si Foo, du Violon ou de la Barre jeté, pourquoi ils ont jeté, ou ce que les mutations qu'ils ont effectué à d'autres qui n'ont pas été nettoyés. Pouvez-vous vous convaincre moi que dans cette terrible situation, c'est toujours la bonne chose à faire pour re-verrouiller?
C'est peut-être, peut-être qu'il ne l'est pas. Mon point est qu'avec le code tel qu'il a été écrit à l'origine, le code examinateur sait poser la question. Avec le code qui utilise "l'aide", je ne sais pas à poser la question; je suppose que les "aide" bloc alloue une ressource, qu'il utilise pour un peu, et poliment dispose quand c'est fait, non pas que l' accolade de fermeture de l ' "utilisation" bloc de mutation de mon programme, dans un cadre exceptionnel cirumstance quand arbitrairement un grand nombre de programmes de l'état cohérence conditions ont été violés.
L'utilisation de "l'aide" bloc d'avoir une sémantique de l'effet de ce fragment d'un programme:
}
extrêmement significatif. Quand je regarde cette seule accolade fermante je n'ai pas tout de suite penser "que le corset a des effets secondaires qui ont des répercussions profondes sur l'état global de mon programme". Mais quand vous l'abus de "l'aide" comme ça, tout à coup, il n'.
La deuxième chose que je voudrais demander si j'ai vu votre code d'origine est "ce qui se passe si une exception est levée après le Déverrouillage, mais avant de l'essayer est entré?" Si vous utilisez un non-optimisée de l'assemblée, le compilateur peut avoir inséré un no-op instruction avant de l'essayer, et il est possible pour un abandon de thread exception à arriver sur la non-op. C'est rare, mais ça arrive dans la vraie vie, en particulier sur des serveurs web. Dans ce cas, le code de déverrouillage qui se passe, mais le verrou n'arrive jamais, parce que l'exception a été levée avant le coup d'essayer. Il est tout à fait possible que ce code est vulnérable à ce problème, et devraient en fait être écrite
bool needsLock = false;
try
{
// must be carefully written so that needsLock is set
// if and only if the unlock happened:
this.Frobble.AtomicUnlock(ref needsLock);
blah blah blah
}
finally
{
if (needsLock) this.Frobble.Lock();
}
Encore une fois, peut-être qu'il n'a, peut-être qu'il ne le fait pas, mais je sais que de poser la question. Avec l'aide de la version, il est sensible à le même problème: un abandon de thread exception peut être levée après l'Frobble est verrouillé, mais avant de l'essayer protégé région associée avec l'aide de est entré. Mais avec l'aide de la version, je suppose que c'est un "et alors?" de la situation. C'est dommage si cela arrive, mais je suppose que les "aide" n'est là que pour être poli, de ne pas muter d'une importance vitale programme de l'état. Je suppose que si certains terrible abandon de thread exception se produit exactement au mauvais moment, puis, oh bien, le garbage collector nettoyer que la ressource est finalement par l'exécution de l'outil de finalisation.