Note
L’accès à cette page nécessite une autorisation. Vous pouvez essayer de vous connecter ou de changer d’annuaire.
L’accès à cette page nécessite une autorisation. Vous pouvez essayer de changer d’annuaire.
Cette rubrique décrit le mot clé use et la using fonction, qui peuvent contrôler l’initialisation et la mise en production des ressources.
Ressources
La ressource de terme est utilisée de plusieurs façons. Oui, les ressources peuvent être des données qu’une application utilise, telles que des chaînes, des graphiques et des éléments similaires, mais dans ce contexte, les ressources font référence à des ressources logicielles ou de système d’exploitation, telles que des contextes d’appareil graphique, des handles de fichiers, des connexions réseau et de base de données, des objets d’accès concurrentiel tels que des handles d’attente, etc. L’utilisation de ces ressources par les applications implique l’acquisition de la ressource à partir du système d’exploitation ou d’un autre fournisseur de ressources, suivie de la publication ultérieure de la ressource dans le pool afin qu’elle puisse être fournie à une autre application. Des problèmes se produisent lorsque les applications ne libèrent pas les ressources dans le pool commun.
Gestion des ressources
Pour gérer efficacement et de manière responsable les ressources d’une application, vous devez libérer rapidement et de manière prévisible les ressources. Le .NET Framework vous aide à le faire en fournissant l’interface System.IDisposable . Un type qui implémente System.IDisposable a la System.IDisposable.Dispose méthode, qui libère correctement les ressources. Les applications bien écrites garantissent qu’elles System.IDisposable.Dispose sont appelées rapidement lorsqu’un objet qui contient une ressource limitée n’est plus nécessaire. Heureusement, la plupart des langages .NET prennent en charge cette opération plus facilement et F# n’est pas une exception. Il existe deux constructions de langage utiles qui prennent en charge le modèle de suppression : la use liaison et la using fonction.
utiliser la liaison
Le use mot clé a un formulaire qui ressemble à celui de la let liaison :
utiliserl’expressionde valeur =
Il fournit la même fonctionnalité qu’une let liaison, mais ajoute un appel à Dispose la valeur lorsque la valeur sort de l’étendue. Notez que le compilateur insère une vérification null sur la valeur, de sorte que si la valeur est null, l’appel à n’est Dispose pas tenté.
L’exemple suivant montre comment fermer automatiquement un fichier à l’aide du use mot clé.
open System.IO
let writetofile filename obj =
use file1 = File.CreateText(filename)
file1.WriteLine("{0}", obj.ToString() )
// file1.Dispose() is called implicitly here.
writetofile "abc.txt" "Humpty Dumpty sat on a wall."
Plusieurs instances de use sont supprimées dans l’ordre inverse dans lequel elles sont déclarées. C’est-à-dire que le premier use sera le dernier sorti.
Remarque
Vous pouvez utiliser use dans les expressions de calcul, auquel cas une version personnalisée de l’expression use est utilisée. Pour plus d’informations, consultez Séquences, expressions asynchrones, expressions de tâche et expressions de calcul.
utilisation de la fonction
La using fonction a la forme suivante :
using (expression1) function-or-lambda
Dans une using expression, expression1 crée l’objet qui doit être supprimé. Le résultat de l’expression1 (l’objet qui doit être supprimé) devient un argument, une valeur, une fonction-ou-lambda, qui est soit une fonction qui attend un seul argument restant d’un type qui correspond à la valeur produite par expression1, soit une expression lambda qui attend un argument de ce type. À la fin de l’exécution de la fonction, le runtime appelle Dispose et libère les ressources (sauf si la valeur est null, auquel cas l’appel à Dispose n’est pas tenté).
L’exemple suivant illustre l’expression using avec une expression lambda.
open System.IO
let writetofile2 filename obj =
using (System.IO.File.CreateText(filename)) ( fun file1 ->
file1.WriteLine("{0}", obj.ToString() )
)
writetofile2 "abc2.txt" "The quick sly fox jumps over the lazy brown dog."
L’exemple suivant montre l’expression using avec une fonction.
let printToFile (file1 : System.IO.StreamWriter) =
file1.WriteLine("Test output");
using (System.IO.File.CreateText("test.txt")) printToFile
Notez que la fonction peut être une fonction qui a déjà appliqué certains arguments. L’exemple de code suivant illustre ceci. Il crée un fichier qui contient la chaîne XYZ.
let printToFile2 obj (file1 : System.IO.StreamWriter) =
file1.WriteLine(obj.ToString())
using (System.IO.File.CreateText("test.txt")) (printToFile2 "XYZ")
La using fonction et la use liaison sont presque équivalentes pour accomplir la même chose. Le using mot clé fournit plus de contrôle sur le moment Dispose où il est appelé. Lorsque vous utilisez using, Dispose est appelé à la fin de la fonction ou de l’expression lambda ; lorsque vous utilisez le use mot clé, Dispose est appelé à la fin du bloc de code conteneur. En règle générale, vous devez préférer utiliser use plutôt que la using fonction.