Condividi tramite


String.Copy(String) Metodo

Definizione

Attenzione

This API should not be used to create mutable strings. See https://go.microsoft.com/fwlink/?linkid=2084035 for alternatives.

Crea una nuova istanza dell'oggetto String con lo stesso valore di un'istanza dell'oggetto String specificata.

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

Parametri

str
String

Stringa da copiare.

Restituisce

String

Nuova stringa con lo stesso valore di str.

Attributi

Eccezioni

str è null.

Commenti

Il Copy metodo restituisce un oggetto con lo stesso valore della stringa String originale, ma che rappresenta un riferimento a un oggetto diverso. Differisce da un'operazione di assegnazione, che assegna un riferimento di stringa esistente a una variabile oggetto aggiuntiva.

Importante

A partire da .NET Core 3.0, questo metodo è obsoleto. Tuttavia, non è consigliabile usarlo in alcuna implementazione di .NET. In particolare, a causa di modifiche nell'interning di stringhe in .NET Core 3.0, in alcuni casi il metodo non creerà una nuova stringa, ma restituirà semplicemente un riferimento a una stringa interna Copy esistente.

A seconda del motivo per cui si vuole chiamare Copy il metodo , esistono diverse alternative:

  • Se si vuole usare un'istanza di stringa diversa in un'operazione che modifica la stringa, usare l'istanza di stringa originale. Poiché le stringhe non sono modificabili, l'operazione di stringa crea una nuova istanza di stringa e la stringa originale rimane invariata. In questo caso, non è consigliabile assegnare il nuovo riferimento di stringa alla variabile stringa originale. Nell'esempio seguente viene illustrato questo concetto.

    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.
    

    In questo caso, la chiamata al metodo per creare una nuova stringa prima di chiamare il metodo crea Copy Substring inutilmente una nuova istanza di stringa.

  • Se si vuole creare un buffer modificabile con lo stesso contenuto della stringa originale, chiamare il String.ToCharArray costruttore StringBuilder.StringBuilder(String) o . Ad esempio:

    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.
    
  • Se si desidera creare una copia modificabile della stringa in modo che sia possibile usare codice unsafe per modificare il contenuto della stringa, usare Marshal.StringToHGlobalUni il metodo . Nell'esempio seguente viene utilizzato il metodo per ottenere un puntatore alla posizione di una stringa copiata nella memoria non gestita, incrementa di uno il punto di codice Unicode di ogni carattere nella stringa e copia di nuovo la stringa risultante in una Marshal.StringToHGlobalUni stringa gestita.

    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/'
    

Si applica a