Remarque
L’accès à cette page nécessite une autorisation. Vous pouvez essayer de vous connecter ou de modifier des répertoires.
L’accès à cette page nécessite une autorisation. Vous pouvez essayer de modifier des répertoires.
Cet article fournit des remarques supplémentaires à la documentation de référence de cette API.
Le Common Language Runtime conserve le stockage de chaînes en conservant une table, appelée pool interne, qui contient une référence unique à chaque chaîne littérale unique déclarée ou créée par programme dans votre programme. Par conséquent, une instance d’une chaîne littérale avec une valeur particulière existe une seule fois dans le système. Par exemple, si vous affectez la même chaîne littérale à plusieurs variables, le runtime récupère la même référence à la chaîne littérale du pool interne et l’affecte à chaque variable.
La Intern méthode utilise le pool interne pour rechercher une chaîne égale à la valeur de son paramètre. str Si une telle chaîne existe, sa référence dans le pool interne est retournée. Si la chaîne n’existe pas, une référence à str est ajoutée dans le pool interne, puis cette référence est retournée. (En revanche, la IsInterned(String) méthode retourne une référence Null si la chaîne demandée n’existe pas dans le pool interne.)
Dans l’exemple suivant, la chaîne s1, qui a la valeur « MyTest », est déjà centralisée, car il s’agit d’un littéral dans le programme. La System.Text.StringBuilder classe génère un nouvel objet de chaîne qui a la même valeur que s1. Une référence à cette chaîne est affectée à s2. La Intern méthode recherche une chaîne qui a la même valeur que s2. Étant donné qu’une telle chaîne existe, la méthode retourne la même référence que celle affectée à s1. Cette référence est ensuite affectée à s3. Références s1 et s2 sont inégales car elles font référence à des objets différents ; références s1 et s3 sont égales car elles font référence à la même chaîne.
string s1 = "MyTest";
string s2 = new StringBuilder().Append("My").Append("Test").ToString();
string s3 = String.Intern(s2);
Console.WriteLine((Object)s2==(Object)s1); // Different references.
Console.WriteLine((Object)s3==(Object)s1); // The same reference.
let s1 = "MyTest"
let s2 = StringBuilder().Append("My").Append("Test").ToString()
let s3 = String.Intern s2
printfn $"{s2 :> obj = s1 :> obj}" // Different references.
printfn $"{s3 :> obj = s1 :> obj}" // The same reference.
Dim s1 As String = "MyTest"
Dim s2 As String = New StringBuilder().Append("My").Append("Test").ToString()
Dim s3 As String = String.Intern(s2)
Console.WriteLine(CObj(s2) Is CObj(s1)) ' Different references.
Console.WriteLine(CObj(s3) Is CObj(s1)) ' The same reference.
Considérations relatives aux performances
Si vous essayez de réduire la quantité totale de mémoire allouée par votre application, gardez à l’esprit que l’internement d’une chaîne a deux effets secondaires indésirables. Tout d’abord, la mémoire allouée pour les objets internes String n’est probablement pas libérée tant que le Common Language Runtime (CLR) n’est pas terminé. La raison est que la référence du CLR à l’objet interne String peut persister après l’arrêt de votre application, voire de votre domaine d’application. Deuxièmement, pour mettre une chaîne en mémoire interne, vous devez d’abord créer la chaîne. La mémoire utilisée par l'objet String doit toujours être allouée, même si elle sera finalement récupérée par le récupérateur de mémoire.
Le membre d'énumération CompilationRelaxations.NoStringInterning marque un assembly comme ne nécessitant pas la centralisation de littéraux de chaîne. Vous pouvez appliquer NoStringInterning à un assembly à l’aide de l’attribut CompilationRelaxationsAttribute . En outre, lorsque vous utilisez Ngen.exe (Générateur d’images natives) pour compiler un assembly à l’avance du runtime, les chaînes ne sont pas internes entre les modules.