String.Copy(String) Metoda

Definice

Upozornění

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

Vytvoří novou instanci se String stejnou hodnotou jako zadaná hodnota 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

Parametry

str
String

Řetězec, který chcete zkopírovat.

Návraty

String

Nový řetězec se stejnou hodnotou jako str .

Atributy

Výjimky

str je null.

Poznámky

Metoda Copy vrátí String objekt, který má stejnou hodnotu jako původní řetězec, ale představuje jiný odkaz na objekt. Liší se od operace přiřazení, která přiřadí existující řetězcový odkaz na další objektovou proměnnou.

Důležité

Počínaje .NET Core 3.0 je tato metoda zastaralá. Nedoporučujeme ale jeho použití v žádné implementaci .NET. Konkrétně kvůli změnám v stáži řetězců v .NET Core 3.0 metoda v některých případech nevytváří nový řetězec, ale jednoduše vrátí odkaz na existující Copy stěžovaný řetězec.

V závislosti na tom, proč chcete Copy metodu volat, existuje několik alternativ:

  • Pokud chcete, aby v operaci, která upravuje řetězec, používat jinou instanci řetězce, použijte původní instanci řetězce. Vzhledem k tomu, že řetězce jsou neměnné, operace řetězce vytvoří novou instanci řetězce a původní řetězec zůstane nezměněný. V takovém případě byste neměli nový odkaz na řetězec přiřazovat k původní řetězcové proměnné. V následujícím příkladu je uvedena ukázka.

    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.
    

    V tomto případě volání metody pro vytvoření nového řetězce před voláním metody zbytečně vytvoří Copy Substring novou instanci řetězce.

  • Pokud chcete vytvořit změnitelná vyrovnávací paměť se stejným obsahem jako původní řetězec, zavolejte String.ToCharArray konstruktor nebo StringBuilder.StringBuilder(String) . Například:

    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.
    
  • Pokud chcete vytvořit měnitelná kopie řetězce, abyste mohli použít nebezpečný kód k úpravě obsahu řetězce, použijte Marshal.StringToHGlobalUni metodu . Následující příklad používá metodu k získání ukazatele na umístění zkopírovaného řetězce v nespravované paměti, zvýší bod kódu Unicode každého znaku v řetězci o jeden znak a zkopíruje výsledný řetězec zpět do Marshal.StringToHGlobalUni spravovaného řetězce.

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

Platí pro