Pourquoi l'utilisation est-elle meilleure que d'utiliser?
-
15-11-2019 - |
Question
Selon la dernière phrase sur Cette page MSDN use
doit être préféré using
. Je l'ai entendu ailleurs (Cette réponse, par exemple). Pourquoi est-ce? je réalise use
a été ajouté plus tard. Mais quelle est la différence? À la surface, using
semble plus utile car vous pouvez contrôler quand Dispose()
est appelé, et vous pouvez ignorer explicitement la valeur liée (par exemple, (fun _ -> ...)
) si besoin.
La solution
Je pense que la raison de préférer use
est juste que la syntaxe est plus simple. De nombreuses autres constructions linguistiques pourraient être exprimées en fonction (par exemple try .. with
, for
, while
, ...). Si les concepteurs de langues ont ajouté une syntaxe plus simple, pourquoi ne pas l'utiliser ...
Comme je l'ai écrit dans le Réponse antérieure que vous avez référencé, vous pouvez contrôler avec précision la portée même lorsque vous utilisez use
. (Et de cette façon, vous pouvez l'utiliser même dans les constructeurs de Expressions d'objets déclarations de classe.) Mais la plupart du temps, le comportement automatique est très bien (ce qui rend la construction plus simple que using
en C #).
Si vous utiliserez use
ou using
Dans les situations où vous devez contrôler explicitement la portée est une question de goût personnel. Si vous n'aimez pas la portée explicite de use
(Ce qui a l'air un peu bizarre, je l'admets, mais fonctionne bien pour moi), vous pouvez utiliser using
.
ÉDITER: Dans une déclaration de classe, vous ne pouvez pas par exemple écrire:
type Foo() =
use a = new Whatever()
// ...
Parce que la portée de a
serait (éventuellement) toute la durée de vie de l'instance. (Bien que je pense que cela pourrait être utile et cela pourrait ajouter une implémentation automatique de IDisposable
à votre type). Si tu utilises using
, vous n'avez pas ce genre de problème.
Autres conseils
Vous pouvez contrôler lorsque la disposition est appelée avec use
De plus, simplement en utilisant des contrats de portée habituels (comme parens ou begin
-end
), par exemple
let F() =
let x = 4
(
use file = System.IO.File.Open("foo.xml", System.IO.FileMode.Append)
let z = 4
printfn "file still open here"
)
printfn "file was already closed/disposed"
Mais je pense que c'est rarement utile. Je pense qu'il est également rare de ne pas vouloir nommer / utiliser le IDisposable
objet. use
est plus pratique syntaxiquement, et 95% du temps fait ce dont vous avez besoin, donc je pense que c'est pourquoi il est préféré.
Personnellement, je préfère use
à using
pour la même raison que je préfère
let a = some_expr
some_stuff_with_a
à
(fun a -> some_stuff_with_a) some_expr
Avec la forme de liaison, vous pouvez généralement éviter un ensemble de parenthèses, et l'association entre l'identifiant et la valeur à laquelle il est lié est plus proche dans l'espace et plus facile à voir.
Un exemple contre use
est mieux alors using
:
using
est mieux que use
comme using
peut être écrit en une seule ligne pendant use
ne peux pas.
Exemple,
xx
est une fonction renvoyant une valeur par une fonction fct à partir d'une ressource qui est ouverte par yy
Utilisation du paramètre donné p
.
let xx p = using (yy(p)) (fun resource-> fct resource) // <-- this is OK
let xx p = (use resource = yy(p); fct resource) // <-- this is Not OK