String.Copy(String) Methode

Definitie

Let op

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

Hiermee maakt u een nieuw exemplaar van String met dezelfde waarde als een opgegeven 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);
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

Parameters

str
String

De tekenreeks die moet worden gekopieerd.

Retouren

Een nieuwe tekenreeks met dezelfde waarde als str.

Kenmerken

Uitzonderingen

str is null.

Opmerkingen

De Copy methode retourneert een String object met dezelfde waarde als de oorspronkelijke tekenreeks, maar vertegenwoordigt een andere objectverwijzing. Het verschilt van een toewijzingsbewerking, waarmee een bestaande tekenreeksverwijzing wordt toegewezen aan een extra objectvariabele.

Important

Vanaf .NET Core 3.0 is deze methode verouderd. We raden het gebruik echter niet aan in een .NET implementatie. In sommige gevallen maakt de methode Copy geen nieuwe tekenreeks, maar retourneert in sommige gevallen een verwijzing naar een bestaande interne tekenreeks vanwege wijzigingen in tekenreeksen die intern worden uitgevoerd in .NET Core 3.0.

Afhankelijk van waarom u de Copy methode wilt aanroepen, zijn er een aantal alternatieven:

  • Als u een ander tekenreeksexemplaren wilt gebruiken in een bewerking die de tekenreeks wijzigt, gebruikt u het oorspronkelijke tekenreeksexemplaren. Omdat tekenreeksen onveranderbaar zijn, maakt de tekenreeksbewerking een nieuw tekenreeksexemplaren en blijft de oorspronkelijke tekenreeks ongewijzigd. In dit geval moet u de nieuwe tekenreeksreferentie niet toewijzen aan de oorspronkelijke tekenreeksvariabele. In het volgende voorbeeld ziet u een afbeelding.

    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 dit geval roept u de Copy methode aan om een nieuwe tekenreeks te maken voordat u de Substring methode aanroept, onnodig een nieuw tekenreeksexemplaren maakt.

  • Als u een onveranderbare buffer wilt maken met dezelfde inhoud als de oorspronkelijke tekenreeks, roept u de String.ToCharArray of StringBuilder.StringBuilder(String) constructor aan. Voorbeeld:

    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.
    
  • Als u een onveranderbare kopie van de tekenreeks wilt maken, zodat u onveilige code kunt gebruiken om de inhoud van de tekenreeks te wijzigen, gebruikt u de Marshal.StringToHGlobalUni methode. In het volgende voorbeeld wordt de Marshal.StringToHGlobalUni methode gebruikt om een aanwijzer naar de locatie van een gekopieerde tekenreeks in onbeheerd geheugen op te halen, het Unicode-codepunt van elk teken in de tekenreeks met één te verhogen en de resulterende tekenreeks terug te kopiëren naar een beheerde tekenreeks.

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

Van toepassing op