String.Copy(String) Metodo

Definizione

Crea una nuova istanza di con lo stesso valore di String un oggetto specificato String.

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

Parametri

str
String

Stringa da copiare.

Valori restituiti

Nuova stringa con lo stesso valore di str.

Eccezioni

str è null.

Commenti

Il Copy metodo restituisce un String oggetto con lo stesso valore della stringa originale, ma rappresenta un riferimento a un oggetto diverso. Differisce da un'operazione di assegnazione, che assegna un riferimento 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 .NET. In particolare, a causa delle modifiche apportate all'interno delle stringhe in .NET Core 3.0, in alcuni casi il metodo Copy non crea una nuova stringa ma restituisce semplicemente un riferimento a una stringa internata esistente.

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

  • Se si desidera utilizzare 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 stringa alla variabile stringa originale. Di seguito ne viene illustrato un esempio.

    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.
    
    let original = "This is a sentence. This is a second sentence."
    let sentence1 = original.Substring(0, original.IndexOf "." + 1)
    printfn $"{original}"
    printfn $"{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.
    

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

  • Se si desidera creare un buffer modificabile con lo stesso contenuto della stringa originale, chiamare il String.ToCharArray costruttore o StringBuilder.StringBuilder(String) . Per 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.
    
    let mergeSentence (span: Span<char>) =
        if span.Length = 0 then
            Span<char>.Empty
        else
            span[0] <- '\000'
            span[2] <- Char.ToLower span[2]
            span
    
    let useMutableBuffer () =
        let original = "This is a sentence. This is a second sentence."
        let chars = original.ToCharArray()
        let span = Span chars
        let slice = span.Slice(span.IndexOf '.', 3)
        let slice = mergeSentence slice
        let span = span.ToString()
        printfn $"Original string: {original}"
        printfn $"Modified string: {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.
    
  • Se si desidera creare una copia modificabile della stringa in modo che sia possibile usare codice non sicuro per modificare il contenuto della stringa, utilizzare il Marshal.StringToHGlobalUni metodo . Nell'esempio seguente viene utilizzato il Marshal.StringToHGlobalUni metodo per ottenere un puntatore alla posizione di una stringa copiata in memoria non gestita, incrementa il punto di codice Unicode di ogni carattere della stringa di uno e copia nuovamente la stringa risultante in una 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/'
    
    #nowarn "9"
    open FSharp.NativeInterop
    
    let useUnmanaged () =
        let original = "This is a single sentence."
        let mutable len = original.Length 
        let ptr = Marshal.StringToHGlobalUni original
        let mutable ch = ptr.ToPointer() |> NativePtr.ofVoidPtr<char> 
        while len > 0 do
            len <- len - 1
            Convert.ToUInt16(NativePtr.read ch) + 1us
            |> Convert.ToChar
            |> NativePtr.write (NativePtr.add ch 1)
            ch <- NativePtr.add ch 1
    
        let result = Marshal.PtrToStringUni ptr
        Marshal.FreeHGlobal ptr
        printfn $"Original string: {original}"
        printfn $"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