Ho una situazione in cui incontrerò molte stringhe duplicate che rimarranno nella memoria per un lungo periodo di tempo. Voglio usare String.Intern
ma non voglio invadere alcuna potenziale risorsa applicativa dal momento che il mio progetto è una libreria. Come funziona?.NET crea un pool interno di stringhe per ogni assembly?
risposta
La tabella stagista per le stringhe è CLR-scoped:
In primo luogo, la memoria allocata per oggetti String internati non è probabile scatta solo se il Common Language Runtime (CLR) termina. Il motivo è che il riferimento CLR dell'oggetto String internato può rimanere dopo che l'applicazione, o anche il dominio dell'applicazione, termina.
Quindi non solo la tabella interna non è specifica per l'assemblaggio, ma può sopravvivere al vostro assemblaggio. La buona notizia è che le stringhe duplicate non saranno un problema poiché le stesse stringhe letterali esistono con lo stesso riferimento una volta internate. Quindi si raccomanda Intern
ing:
Il Common Language Runtime conserva stoccaggio stringa mantenendo un tavolo , denominata pool interno, che contiene un solo riferimento alle ogni stringa letterale unica dichiarata o creata a livello di codice in vostro programma. Di conseguenza, un'istanza di una stringa letterale con un valore particolare esiste solo una volta nel sistema.
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.
- 1. Pool di stringhe vs Pool costante
- 2. Quante stringhe sono in jvm stagni pool di stringhe
- 3. Firma di assembly .NET
- 4. Significato di Interno protetto in .Net
- 5. per ogni dir crea un file tar
- 6. Confronta 2 versioni di un assembly .NET?
- 7. Installazione di un assembly in GAC sia per mono/.NET
- 8. Esiste un numero massimo di assembly per un'app .NET.
- 9. Prestazioni di .NET ILMerged assembly
- 10. Come si crea un pool autorelease locale per risparmiare memoria?
- 11. .NET Assembly Dipendenze
- 12. .NET Module vs Assembly
- 13. Prestazioni cross-assembly .NET Hit
- 14. .NET Assembly Culture
- 15. Utilizzo memoria di ogni pool di applicazioni
- 16. Ambito conformità CLS per NET assembly
- 17. Come registrare un assembly .NET come COM?
- 18. Impossibile caricare Assembly .NET 4.0
- 19. IE crea un nuovo ambito per ogni tag di script?
- 20. Condivisione di pool di applicazioni .NET
- 21. Pool di oggetti per wrapper e stringhe Java
- 22. Qual è la migliore pratica in IIS? Un pool di applicazioni per ogni applicazione o un pool di applicazioni condivise?
- 23. Nascondi metodo pubblico utilizzato per testare un assembly .NET
- 24. Un pacchetto Java è l'equivalente di un assembly .Net?
- 25. di scrittura e lettura stringhe da/per file interno
- 26. Sicurezza plug-in .NET Assembly
- 27. Trova un offset di byte in un assembly .NET
- 28. Gli assembly .NET cambiano mai?
- 29. Crea notifica ogni giorno
- 30. Caricamento assembly WinRT da .NET
Meh, internati stringhe di riferimento sono contati. L'oggetto principale che contiene un riferimento è una tabella (simile a HashSet) di proprietà di un AppDomain. Lo scaricamento dell'appodominio svuota la tabella, diminuendo il conteggio dei riferimenti. La stragrande maggioranza, se non tutte, le stringhe dovrebbero scomparire. Non c'è pericolo di "invasione". –
Un po 'fuori tema ma durante la ricerca di varie informazioni sull'internamento delle stringhe ho trovato questo articolo del blog molto interessante: https://blog.benoitblanchon.fr/modify-intern-pool/. Vedi anche il codice sorgente associato. – AFract