Comment éviter que la chaîne ne soit internée

Ma compréhension (ce qui peut être faux) est que dans c # lorsque vous créez une chaîne, elle est internée dans “pool interne”. Cela conserve une référence aux chaînes afin que plusieurs chaînes identiques puissent partager la mémoire d’exploitation.

Cependant, je traite un grand nombre de chaînes qui sont probablement uniques et je dois les supprimer complètement de la mémoire une fois que chacune d’elles est terminée. peut simplement supprimer toutes les données de chaîne de la mémoire. Comment puis-je empêcher la chaîne d’être internée dans ce cache, ou comment puis-je l’effacer / ou en supprimer une chaîne afin qu’elle soit supprimée de la mémoire en fonctionnement?

Si vous devez supprimer les chaînes de la mémoire pour des raisons de sécurité, utilisez SecureSsortingng .

Sinon, s’il n’y a aucune référence à la chaîne, le CPG la nettoiera quand même (elle ne sera plus internée), vous n’avez donc pas à vous soucier de l’internation.

Et bien sûr, seuls les littéraux de chaîne sont internés en premier lieu (ou si vous appelez Ssortingng.Intern () comme noté ci-dessus par Petr et autres).

Appliquez l’atsortingbut CompilationRelaxations à l’ensemble de l’assemblage (la seule solution possible consiste à interdire l’internalisation au niveau de l’assemblage) comme suit:

 [assembly: CompilationRelaxations(CompilationRelaxations.NoSsortingngInterning)] 

Plus d’informations sur CompilationRelaxations

METTRE À JOUR:

La documentation indique que l’atsortingbut:

Marque un assemblage comme ne nécessitant pas un interning littéral de chaîne .

En d’autres termes, cela n’empêche pas le compilateur d’effectuer l’internalisation des chaînes, fournissant simplement un indice indiquant que cela n’est pas nécessaire. La documentation est un peu rare dans ce domaine, mais cela semble également être la conclusion de ce post sur le forum MSDN .

De cette question SO sur cet atsortingbut

Avant d’essayer d’empêcher l’internalisation, je suggérerais d’utiliser Ssortingng.IsInterned () pour déterminer si les chaînes qui vous intéressent sont réellement internées. Si cette fonction renvoie la valeur null, votre chaîne n’est pas internée.

Autant que je sache, les chaînes générées de manière dynamic au moment de l’exécution ne sont pas du tout internées, car elles n’apporteraient aucun avantage en termes de performances.

Vous dites aux choses:

  • Vous traitez beaucoup de chaînes, vous parlez donc de valeurs d’exécution.
  • Vous souhaitez supprimer les chaînes de la mémoire une fois que vous avez terminé de les traiter.

Par défaut, les valeurs d’exécution ne sont PAS internées. Vous recevez une chaîne d’un fichier ou créez une chaîne vous-même, ils ont tous une instance distincte. Vous pouvez les interner via Ssortingng.Intern. L’internalisation de chaînes prend plus de temps, mais consum moins de mémoire. Voir: http://msdn.microsoft.com/en-us/library/system.ssortingng.intern.aspx

Les chaînes d’exécution sont automatiquement supprimées par le GC si aucune référence n’y est faite. Un interné aura plus de références, mais à la fin de votre processus, je suppose que toutes les références sont supprimées. Le mécanisme d’interning ne conserve pas une référence HARD, mais une référence FAIBLE. Une référence faible est ignorée par le GC, de sorte que l’instance de chaîne peut toujours être supprimée. Voir: http://msdn.microsoft.com/en-us/library/system.weakreference.aspx

Alors … pour résumer. Par défaut, vos chaînes d’exécution ne sont pas internées. Et s’ils sont internés, ils sont quand même retirés par le GC une fois votre travail terminé.