String.Intern(String) String.Intern(String) String.Intern(String) String.Intern(String) Method

Definição

Recupera a referência do sistema para o String especificado.Retrieves the system's reference to the specified String.

public:
 static System::String ^ Intern(System::String ^ str);
public static string Intern (string str);
static member Intern : string -> string
Public Shared Function Intern (str As String) As String

Parâmetros

str
String String String String

Uma cadeia de caracteres para pesquisar no pool interno.A string to search for in the intern pool.

Retornos

A referência do sistema para str, se interno; caso contrário, uma nova referência para uma cadeia de caracteres com o valor de str.The system's reference to str, if it is interned; otherwise, a new reference to a string with the value of str.

Exceções

Exemplos

O exemplo a seguir usa três cadeias de caracteres que são iguais em valor para determinar se uma cadeia de caracteres recém-criada e uma cadeia do InterNIC são iguais.The following example uses three strings that are equal in value to determine whether a newly created string and an interned string are equal.

// Sample for String::Intern(String)
using namespace System;
using namespace System::Text;
int main()
{
   String^ s1 = "MyTest";
   String^ s2 = (gcnew 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}", s2 == s1 );
   Console::WriteLine( "Is s3 the same reference as s1?: {0}", s3 == 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
*/
// 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
*/
' Sample for String.Intern(String)
Imports System
Imports System.Text

Class Sample
   
   Public Shared Sub Main()
      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("s1 = '{0}'", s1)
      Console.WriteLine("s2 = '{0}'", s2)
      Console.WriteLine("s3 = '{0}'", s3)
      Console.WriteLine("Is s2 the same reference as s1?: {0}", s2 Is s1)
      Console.WriteLine("Is s3 the same reference as s1?: {0}", s3 Is s1)
   End Sub 'Main
End Class 'Sample
'
's1 = 'MyTest'
's2 = 'MyTest'
's3 = 'MyTest'
'Is s2 the same reference as s1?: False
'Is s3 the same reference as s1?: True
'

Comentários

O Common Language Runtime conserva o armazenamento de cadeia de caracteres mantendo uma tabela, chamada de pool do estagiário, que contém uma única referência a cada cadeia de caracteres literal exclusiva declarada ou criada programaticamente em seu programa.The common language runtime conserves string storage by maintaining a table, called the intern pool, that contains a single reference to each unique literal string declared or created programmatically in your program. Consequentemente, uma instância de uma cadeia de caracteres literal com um valor específico só existe uma vez no sistema.Consequently, an instance of a literal string with a particular value only exists once in the system.

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 para a cadeia de caracteres literal do pool do estagiário e a atribuirá a cada variável.For example, if you assign the same literal string to several variables, the runtime retrieves the same reference to the literal string from the intern pool and assigns it to each variable.

O Intern método usa o pool do estagiário para procurar uma cadeia de caracteres igual ao valor strde.The Intern method uses the intern pool to search for a string equal to the value of str. Se essa cadeia de caracteres existir, sua referência no pool do estagiário será retornada.If such a string exists, its reference in the intern pool is returned. Se a cadeia de caracteres não existir, uma referência str a será adicionada ao pool do estagiário e essa referência será retornada.If the string does not exist, a reference to str is added to the intern pool, then that reference is returned.

No exemplo a seguir, a cadeia de caracteres S1, que tem um valor de "myTest", já está no InterNIC porque é um literal no programa.In the following example, the string s1, which has a value of "MyTest", is already interned because it is a literal in the program. A System.Text.StringBuilder classe gera um novo objeto de cadeia de caracteres que tem o mesmo valor de S1.The System.Text.StringBuilder class generates a new string object that has the same value as s1. Uma referência a essa cadeia de caracteres é atribuída a S2.A reference to that string is assigned to s2. O Intern método procura uma cadeia de caracteres que tenha o mesmo valor de S2.The Intern method searches for a string that has the same value as s2. Como essa cadeia de caracteres existe, o método retorna a mesma referência atribuída a S1.Because such a string exists, the method returns the same reference that is assigned to s1. Essa referência é atribuída ao S3.That reference is then assigned to s3. Faz referência a S1 e S2 Compare iniguals porque eles se referem a objetos diferentes; faz referência ao S1 e S3 Compare EQUAL porque eles se referem à mesma cadeia de caracteres.References s1 and s2 compare unequal because they refer to different objects; references s1 and s3 compare equal because they refer to the same string.

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.
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.

Compare esse método com o IsInterned método.Compare this method to the IsInterned method.

Considerações da versãoVersion Considerations

No, o Intern método reverte para seu comportamento no .NET Framework 1,0 e 1,1 com relação à internação da cadeia de caracteres vazia. .NET Framework 3.5 Service Pack 1.NET Framework 3.5 Service Pack 1In the .NET Framework 3.5 Service Pack 1.NET Framework 3.5 Service Pack 1, the Intern method reverts to its behavior in the .NET Framework 1.0 and 1.1 with regard to interning the empty string. No exemplo a seguir, a variável str1 é atribuída a uma referência Emptya, e a str2 variável é atribuída à referência Empty que é retornada chamando o método Intern após a conversão de um StringBuilderobjeto cujo valor é Empty para uma cadeia de caracteres.In the following example, the variable str1 is assigned a reference to Empty, and the variable str2 is assigned the reference to Empty that is returned by calling the Intern method after converting a StringBuilder object whose value is Empty to a string. Em seguida, as referências str1 contidas em e str2 são comparadas para igualdade.Then the references contained in str1 and str2 are compared for equality.

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.");
Dim str1 As String = String.Empty
Dim str2 As String = String.Empty

Dim sb As StringBuilder = New StringBuilder().Append(String.Empty)
str2 = String.Intern(sb.ToString())	

If CObj(str1) Is CObj(str2) Then
	Console.WriteLine("The strings are equal.")
Else
	Console.WriteLine("The strings are not equal.")
End If	

.NET Framework 1.0.NET Framework 1.0No, .NET Framework 1.1.NET Framework 1.1, e .NET Framework 3,5 SP1.NET Framework 3.5 SP1 estr2são iguais. str1In the .NET Framework 1.0.NET Framework 1.0, .NET Framework 1.1.NET Framework 1.1, and .NET Framework 3,5 SP1.NET Framework 3.5 SP1, str1 and str2 are equal. .NET Framework 2.0 Service Pack 1.NET Framework 2.0 Service Pack 1 No e.NET Framework 3.0.NET Framework 3.0e não sãoiguais.str2 str1In the .NET Framework 2.0 Service Pack 1.NET Framework 2.0 Service Pack 1 and .NET Framework 3.0.NET Framework 3.0, str1 and str2 are not equal.

Considerações sobre desempenhoPerformance Considerations

Se você estiver tentando reduzir a quantidade total de memória alocada pelo seu aplicativo, tenha em mente que o InterNIC de uma cadeia de caracteres tem dois efeitos colaterais indesejados.If you are trying to reduce the total amount of memory your application allocates, keep in mind that interning a string has two unwanted side effects. Primeiro, a memória alocada para String objetos internos não é provavelmente liberada até que o Common Language Runtime (CLR) seja encerrado.First, the memory allocated for interned String objects is not likely to be released until the common language runtime (CLR) terminates. O motivo é que a referência do CLR ao String objeto do InterNIC pode persistir depois que seu aplicativo, ou até mesmo o domínio do aplicativo, for encerrado.The reason is that the CLR's reference to the interned String object can persist after your application, or even your application domain, terminates. Segundo, para estagiário uma cadeia de caracteres, você deve primeiro criar a cadeia de caracteres.Second, to intern a string, you must first create the string. A memória usada pelo String objeto ainda deve ser alocada, mesmo que a memória eventualmente seja coletada pelo lixo.The memory used by the String object must still be allocated, even though the memory will eventually be garbage collected.

O .NET Framework versão 2,0 apresenta o CompilationRelaxations.NoStringInterning membro de enumeração.The .NET Framework version 2.0 introduces the CompilationRelaxations.NoStringInterning enumeration member. O NoStringInterning membro marca um assembly como não exigindo internos de cadeia de caracteres literal.The NoStringInterning member marks an assembly as not requiring string-literal interning. Você pode aplicar NoStringInterning a um assembly usando o CompilationRelaxationsAttribute atributo.You can apply NoStringInterning to an assembly using the CompilationRelaxationsAttribute attribute. Além disso, quando você usa o NGen. exe (Native Image Generator) para compilar um assembly com antecedência do tempo de execução, as cadeias de caracteres não são incluídas nos módulos.Also, when you use the Ngen.exe (Native Image Generator) to compile an assembly in advance of run time, strings are not interned across modules.

Aplica-se a

Veja também