Observação
O acesso a essa página exige autorização. Você pode tentar entrar ou alterar diretórios.
O acesso a essa página exige autorização. Você pode tentar alterar os diretórios.
Este artigo fornece comentários complementares à documentação de referência para esta API.
O CLR (Common Language Runtime) conserva o armazenamento de cadeias de caracteres, mantendo uma tabela chamada pool interno, que contém uma única referência a cada literal de cadeia de caracteres único 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 runtime 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 pesquisar 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 será adicionada ao pool interno, então essa referência será retornada. (Por outro lado, o IsInterned(String) método retornará uma referência nula se a cadeia de caracteres solicitada não existir no pool de estagiários.)
No exemplo a seguir, a cadeia de caracteres s1, que tem um valor de "MyTest", já está interna porque é um literal no programa. A System.Text.StringBuilder classe gera um novo objeto de cadeia de caracteres que tem o mesmo valor que s1. Uma referência a essa cadeia de caracteres é atribuída a s2. O Intern método pesquisa uma cadeia de caracteres que tem o mesmo valor que s2. Como essa cadeia de caracteres existe, o método retorna a mesma referência atribuída a s1. Essa referência é 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 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 alocada pelo aplicativo, tenha em mente que a internação de uma cadeia de caracteres terá dois efeitos colaterais indesejados. Primeiro, a memória alocada para objetos internos String provavelmente não será liberada até que o CLR (Common Language Runtime) seja encerrado. O motivo é que a referência do CLR ao objeto interno String pode persistir após o término do aplicativo ou até mesmo do domínio do aplicativo. Em segundo lugar, para internar uma cadeia de caracteres, primeiro você deve criá-la. A memória usada pelo objeto String ainda deve ser alocada, mesmo que a memória eventualmente seja coletada pelo coletor de lixo.
O membro de enumeração CompilationRelaxations.NoStringInterning marca um assembly como não exigindo internação literal de cadeia de caracteres. Você pode aplicar NoStringInterning a um assembly usando o CompilationRelaxationsAttribute atributo. Além disso, quando você usa Ngen.exe (Gerador de Imagem Nativa) para compilar um assembly antes do runtime, as cadeias de caracteres não são internadas entre módulos.