String.Copy(String) String.Copy(String) String.Copy(String) String.Copy(String) Method

Definición

Advertencia

Esta API está ya obsoleta.

Crea una nueva instancia de String con el mismo valor que una String especificada.Creates a new instance of String with the same value as a specified String.

public:
 static System::String ^ Copy(System::String ^ str);
[System.Obsolete("This API should not be used to create mutable strings. See https://go.microsoft.com/fwlink/?linkid=2084035 for alternatives.")]
public static string Copy (string str);
static member Copy : string -> string
Public Shared Function Copy (str As String) As String

Parámetros

str
String String String String

Cadena que se va a copiar.The string to copy.

Devoluciones

Nueva cadena con el mismo valor que str.A new string with the same value as str.

Excepciones

Comentarios

El Copy método devuelve un String objeto que tiene el mismo valor que la cadena original, pero representa una referencia de objeto diferente.The Copy method returns a String object that has the same value as the original string but represents a different object reference. Difiere de una operación de asignación que asigna una referencia de cadena existente a una variable de objeto adicionales.It differs from an assignment operation, which assigns an existing string reference to an additional object variable.

Importante

A partir de .NET Core 3.0, este método está obsoleto.Starting with .NET Core 3.0, this method is obsolete. Sin embargo, no se recomienda su uso en cualquier implementación de. NET.However, we do not recommend its use in any .NET implementation. En concreto, debido a cambios en el internamiento de cadenas en .NET Core 3.0, en algunos casos el Copy método no creará una nueva cadena, pero simplemente devolverá una referencia a una cadena de método Intern existente.In particular, because of changes in string interning in .NET Core 3.0, in some cases the Copy method will not create a new string but will simply return a reference to an existing interned string.

Dependiendo de por qué desea llamar a la Copy método, hay una serie de alternativas:Depending on Why you want to call the Copy method, there are a number of alternatives:

  • Si desea que una instancia de una cadena diferente a usar en una operación que modifique la cadena, utilice la instancia de la cadena original.If you want a different string instance to use in an operation that modifies the string, use the original string instance. Dado que las cadenas son inmutables, la operación de cadena crea una nueva instancia de cadena y la cadena original se ve afectado.Because strings are immutable, the string operation creates a new string instance, and the original string remains unaffected. En este caso, no debe asignar la nueva referencia de cadena a la variable de cadena original.In this case, you should not assign the new string reference to the original string variable. Esto se muestra en el ejemplo siguiente.The following example provides an illustration.

    var original = "This is a sentence. This is a second sentence.";
    var sentence1 = original.Substring(0, original.IndexOf(".") + 1);
    Console.WriteLine(original);
    Console.WriteLine(sentence1);
    // The example displays the following output:
    //    This is a sentence. This is a second sentence.
    //    This is a sentence.            
    
    Dim original = "This is a sentence. This is a second sentence."
    Dim sentence1 = original.Substring(0, original.IndexOf(".") + 1)
    Console.WriteLine(original)
    Console.WriteLine(sentence1)
    ' The example displays the following output:
    '    This is a sentence. This is a second sentence.
    '    This is a sentence.            
    

    En este caso, una llamada a la Copy método para crear una nueva cadena antes de llamar a la Substring método innecesariamente crea una nueva instancia de cadena.In this case, calling the Copy method to create a new string before calling the Substring method unnecessarily creates a new string instance.

  • Si desea crear un búfer mutable con el mismo contenido que la cadena original, llame a la String.ToCharArray o StringBuilder.StringBuilder(String) constructor.If you want to create a mutable buffer with the same contents as the original string, call the String.ToCharArray or StringBuilder.StringBuilder(String) constructor. Por ejemplo:For example:

    private static void UseMutableBuffer()
    {
        var original = "This is a sentence. This is a second sentence.";
        var chars = original.ToCharArray();
        var span = new Span<char>(chars);
        var slice = span.Slice(span.IndexOf('.'), 3);
        slice = MergeSentence(slice);
        Console.WriteLine($"Original string: {original}");
        Console.WriteLine($"Modified string: {span.ToString()}");
    
        static Span<char> MergeSentence(Span<char> span)
        {
            if (span.Length == 0) return Span<char>.Empty;
    
            span[0] = ';';
            span[2] = Char.ToLower(span[2]);
            return span;
        }
    }
    // The example displays the following output:
    //    Original string: This is a sentence. This is a second sentence.
    //    Modified string: This is a sentence; this is a second sentence.        
    
    Private Sub UseMutableBuffer()
        Dim original = "This is a sentence. This is a second sentence."
        Dim sb = new StringBuilder(original)
        Dim index = original.IndexOf(".")
        sb(index) = ";"
        sb(index + 2) = Char.ToLower(sb(index + 2))
        Console.WriteLine($"Original string: {original}")
        Console.WriteLine($"Modified string: {sb.ToString()}")
    End Sub
    ' The example displays the following output:
    '    Original string: This is a sentence. This is a second sentence.
    '    Modified string: This is a sentence; this is a second sentence.        
    
  • Si desea crear una copia modificable de la cadena de modo que puede usar código no seguro para modificar el contenido de cadena, use Marshal.StringToHGlobalUni método.If you want to create a mutable copy of the string so that you can use unsafe code to modify the string contents, use Marshal.StringToHGlobalUni method. En el ejemplo siguiente se usa el Marshal.StringToHGlobalUni método para obtener un puntero a la ubicación de una cadena copiada en memoria no administrada, el punto de código Unicode de cada carácter de la cadena se incrementa en uno y la copia de la cadena resultante a una cadena administrada.The following example uses the Marshal.StringToHGlobalUni method to get a pointer to the location of an copied string in unmanaged memory, increments the Unicode code point of each character in the string by one, and copies the resulting string back to a managed string.

    private static void UseUnmanaged()
    {
        var original = "This is a single sentence.";
        var len = original.Length; 
        var ptr = Marshal.StringToHGlobalUni(original);
        string result;
        unsafe 
        {
            char *ch = (char *) ptr.ToPointer();
            while (len-- > 0)
            {
                char c = Convert.ToChar(Convert.ToUInt16(*ch) + 1);
                *ch++ = c;
            } 
            result = Marshal.PtrToStringUni(ptr);
            Marshal.FreeHGlobal(ptr);
        }
        Console.WriteLine($"Original string: {original}");
        Console.WriteLine($"String from interop: '{result}'");
    }
    // The example displays the following output:
    //    Original string: This is a single sentence.
    //    String from interop: 'Uijt!jt!b!tjohmf!tfoufodf/'      
    

Se aplica a