Nota
O acesso a esta página requer autorização. Pode tentar iniciar sessão ou alterar os diretórios.
O acesso a esta página requer autorização. Pode tentar alterar os diretórios.
Observação
Este artigo fornece observações complementares à documentação de referência para esta API.
O Common Language Runtime conserva o armazenamento de cadeia de caracteres mantendo uma tabela, chamada pool interno, que contém uma única referência a cada cadeia de caracteres literal exclusiva declarada ou criada programaticamente em seu programa. Consequentemente, uma instância de uma cadeia de caracteres literal com um valor específico só existe uma vez no sistema. Por exemplo, se você atribuir a mesma cadeia de caracteres literal a várias variáveis, o tempo de execução recuperará a mesma referência à cadeia de caracteres literal do pool de estagiários e a atribuirá a cada variável.
O Intern método usa o pool de estagiários para procurar uma cadeia de caracteres igual ao valor de seu parâmetro, str. Se essa cadeia de caracteres existir, sua referência no pool de estagiários será retornada. Se a cadeia de caracteres não existir, uma referência a str for adicionada ao pool de estagiários, essa referência será retornada. (Por outro lado, o IsInterned(String) método retorna uma referência nula se a cadeia de caracteres solicitada não existir no pool de estagiários.)
No exemplo a seguir, a string s1, que tem o valor "MyTest", já está internada, pois é um literal no programa. A System.Text.StringBuilder classe gera um novo objeto string que tem o mesmo valor que s1. Uma referência a essa cadeia de caracteres é atribuída a s2. O Intern método procura uma cadeia de caracteres que tenha o mesmo valor que s2. Como essa cadeia de caracteres existe, o método retorna a mesma referência atribuída ao s1. Essa referência é então atribuída a s3. Referências s1 e s2 comparam de forma desigual porque se referem a objetos diferentes; referências s1 e s3 comparam de forma igual porque se referem à mesma cadeia de caracteres.
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.
Considerações sobre desempenho
Se você estiver tentando reduzir a quantidade total de memória que seu aplicativo aloca, lembre-se de que a introdução de uma cadeia de caracteres tem dois efeitos colaterais indesejados. Primeiro, a memória alocada para objetos internados String provavelmente não será liberada até que o Common Language Runtime (CLR) seja encerrado. O motivo é que a referência do CLR ao objeto interned String pode persistir depois que seu aplicativo, ou até mesmo seu domínio de aplicativo, for encerrado. Em segundo lugar, para inserir uma cadeia de caracteres, deve primeiro criar a cadeia de caracteres. A memória usada pelo objeto String ainda deve ser alocada, mesmo que a memória eventualmente seja gerida pelo coletor de lixo.
O CompilationRelaxations.NoStringInterning membro de enumeração marca um assembly como não exigindo internação de literais de strings. Você pode aplicar NoStringInterning a um assembly usando o CompilationRelaxationsAttribute atributo. Além disso, quando usas Ngen.exe (Native Image Generator) para compilar um assembly antes do tempo de execução, as strings não estão internadas entre módulos.