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.

Était-ce utile?

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
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top