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

Definice

Varování

Toto rozhraní API je teď zastaralé.

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

Parametry

str
String String String String

Řetězec, který má být zkopírován.The string to copy.

Návraty

Nový řetězec se stejnou hodnotou jako str.A new string with the same value as str.

Výjimky

Poznámky

Copy MetodaString vrátí objekt, který má stejnou hodnotu jako původní řetězec, ale představuje jiný odkaz na objekt.The Copy method returns a String object that has the same value as the original string but represents a different object reference. Liší se od operace přiřazení, která přiřadí existující odkaz na řetězec na další objektovou proměnnou.It differs from an assignment operation, which assigns an existing string reference to an additional object variable.

Důležité

Počínaje rozhraním .NET Core 3,0 je tato metoda zastaralá.Starting with .NET Core 3.0, this method is obsolete. Nedoporučujeme však použití v žádné implementaci rozhraní .NET.However, we do not recommend its use in any .NET implementation. Konkrétně kvůli změnám v rozhraní .NET Core 3,0, v některých případech Copy , metoda nevytvoří nový řetězec, ale jednoduše vrátí odkaz na existující interně řetězec.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.

V závislosti na tom, proč chcete zavolat Copy metodu, existuje několik alternativ:Depending on Why you want to call the Copy method, there are a number of alternatives:

  • Pokud chcete použít jinou instanci řetězce v operaci, která upravuje řetězec, použijte původní instanci řetězce.If you want a different string instance to use in an operation that modifies the string, use the original string instance. Vzhledem k tomu, že řetězce jsou neměnné, operace řetězce vytvoří novou instanci řetězce a původní řetězec zůstane neovlivněný.Because strings are immutable, the string operation creates a new string instance, and the original string remains unaffected. V takovém případě byste neměli přiřazovat odkaz na nový řetězec do původní řetězcové proměnné.In this case, you should not assign the new string reference to the original string variable. V následujícím příkladu je uvedena ukázka.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.            
    

    V tomto případě volání Copy metody pro vytvoření nového řetězce před Substring voláním metody zbytečně vytvoří novou instanci řetězce.In this case, calling the Copy method to create a new string before calling the Substring method unnecessarily creates a new string instance.

  • Chcete-li vytvořit proměnlivou vyrovnávací paměť se stejným obsahem jako původní řetězec, zavolejte String.ToCharArray konstruktor or. StringBuilder.StringBuilder(String)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. Příklad: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.        
    
  • Pokud chcete vytvořit proměnlivou kopii řetězce, abyste mohli použít nezabezpečený kód pro úpravu obsahu řetězce, použijte Marshal.StringToHGlobalUni metodu.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. Následující příklad používá Marshal.StringToHGlobalUni metodu k získání ukazatele na umístění zkopírovaného řetězce v nespravované paměti, zvyšuje bod kódu Unicode každého znaku v řetězci o jeden a zkopíruje výsledný řetězec zpět do spravovaného řetězce.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/'      
    

Platí pro