Pour afficher l’article en anglais, activez la case d’option Anglais. Vous pouvez aussi afficher la version anglaise dans une fenêtre contextuelle en faisant glisser le pointeur de la souris sur le texte.
Traduction
Anglais
Cette documentation est archivée et n’est pas conservée.

String.Intern, méthode

Récupère la référence du système au String spécifié.

Espace de noms :  System
Assembly :  mscorlib (dans mscorlib.dll)

public static string Intern(
	string str
)

Paramètres

str
Type : System.String
Chaîne à rechercher dans le pool interne.

Valeur de retour

Type : System.String
Référence du système à str si elle est dans le pool interne ; sinon, nouvelle référence à une chaîne ayant la valeur str.

ExceptionCondition
ArgumentNullException

str est null.

Le Common Language Runtime gère le stockage des chaînes à l'aide d'une table, appelée pool interne, qui contient une référence à chaque chaîne littérale unique déclarée ou créée par programme dans votre application. Par conséquent le système ne comporte qu'une seule occurrence de l'instance d'une chaîne littérale dotée d'une valeur spécifique.

Par exemple, si vous assignez 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 à partir du pool interne, puis l'assigne à chaque variable.

La méthode Intern utilise le pool interne pour rechercher une chaîne égale à la valeur de str. Si cette chaîne existe, la méthode retourne sa référence dans le pool interne. Dans le cas contraire, une référence à str est ajoutée dans le pool interne et cette référence est retournée.

Dans l'exemple suivant, la chaîne s1, dont la valeur est "MyTest", est déjà dans le pool interne, car il s'agit d'un littéral dans le programme. La classe System.Text.StringBuilder génère un nouvel objet chaîne ayant la même valeur que s1. Une référence à cette chaîne est assignée à s2. La méthode Intern recherche une chaîne ayant la même valeur que s2. Comme cette chaîne existe, la méthode retourne la même référence que celle assignée à s1. Cette référence est ensuite assignée à s3. Les références s1 et s2 ne sont pas considérées comme égales, car elles référencent des objets différents ; les références s1 et s3 sont considérées égales, car elles référencent 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.


Comparez cette méthode à la méthode IsInterned.

Considérations de version

Dans le .NET Framework version 3.5 Service Pack 1, la méthode Intern reprend son comportement dans le .NET Framework version 1.0 et le .NET Framework version 1.1 par rapport à l'internement de la chaîne vide. Dans l'exemple suivant, une référence Empty est assignée à la variable str1 et une référence Empty est assignée à la variable str2 qui est retournée par l'appel à la méthode Intern après la conversion d'un objet StringBuilder dont la valeur est Empty pour une chaîne. Les références contenues dans str1 et str2 sont ensuite comparées pour déterminer leur égalité éventuelle.


		string str1 = String.Empty;
		string str2 = String.Empty;

		StringBuilder sb = new StringBuilder().Append(String.Empty);
		str2 = String.Intern(sb.ToString());	
		
		if((object)str1==(object)str2)
			Console.WriteLine("The strings are equal.");
		else
			Console.WriteLine("The strings are not equal.");


In the .NET Framework 1.0, .NET Framework 1.1, et .NET Framework 3.5 SP1, str1 et str2 sont égaux. Dans le .NET Framework version 2.0 Service Pack 1 et .NET Framework version 3.0, str1 et str2 ne sont pas égaux.

Considérations sur les performances

Si vous essayez de réduire la quantité de mémoire totale que votre application alloue, n'oubliez pas que l'internement d'une chaîne possède deux conséquences indésirables. En premier lieu, la mémoire allouée pour les objets String internés n'est pas susceptible d'être libérée tant que le CLR (Common Language Runtime) n'est pas terminé. La raison en est que la référence du CLR à l'objet String interné peut persister après que votre application ou votre domaine d'application s'est terminé. Ensuite, pour interner une chaîne, vous devez d'abord la créer. La mémoire utilisée par l'objet String doit encore être allouée, même si la mémoire doit finalement être récupérée par le garbage collector.

Le .NET Framework version 2.0 introduit le membre d'énumération CompilationRelaxations.NoStringInterning. Le membre NoStringInterning marque un assembly comme ne nécessitant pas d'internement de littéral de chaîne. Vous pouvez appliquer NoStringInterning à un assembly à l'aide de l'attribut CompilationRelaxationsAttribute. De même, lorsque vous vous servez de l'outil Ngen.exe (Native Image Generator) pour compiler un assembly avant l'exécution, les chaînes ne sont pas internées sur tous les modules.

L'exemple suivant utilise trois chaînes égales en valeur pour déterminer si une chaîne créée récemment et une chaîne internée sont égales.


// Sample for String.Intern(String)
using System;
using System.Text;

class Sample {
    public static void Main() {
    String s1 = "MyTest";
    String s2 = new StringBuilder().Append("My").Append("Test").ToString(); 
    String s3 = String.Intern(s2); 
    Console.WriteLine("s1 == '{0}'", s1);
    Console.WriteLine("s2 == '{0}'", s2);
    Console.WriteLine("s3 == '{0}'", s3);
    Console.WriteLine("Is s2 the same reference as s1?: {0}", (Object)s2==(Object)s1); 
    Console.WriteLine("Is s3 the same reference as s1?: {0}", (Object)s3==(Object)s1);
    }
}
/*
This example produces the following results:
s1 == 'MyTest'
s2 == 'MyTest'
s3 == 'MyTest'
Is s2 the same reference as s1?: False
Is s3 the same reference as s1?: True
*/


.NET Framework

Pris en charge dans : 4, 3.5, 3.0, 2.0, 1.1, 1.0

.NET Framework Client Profile

Pris en charge dans : 4, 3.5 SP1

Windows 7, Windows Vista SP1 ou ultérieur, Windows XP SP3, Windows XP SP2 Édition x64, Windows Server 2008 (installation minimale non prise en charge), Windows Server 2008 R2 (installation minimale prise en charge avec SP1 ou version ultérieure), Windows Server 2003 SP2

Le .NET Framework ne prend pas en charge toutes les versions de chaque plateforme. Pour obtenir la liste des versions prises en charge, consultez Configuration requise du .NET Framework.
Afficher: