String.Copy(String) Metoda
Definice
Důležité
Některé informace platí pro předběžně vydaný produkt, který se může zásadně změnit, než ho výrobce nebo autor vydá. Microsoft neposkytuje žádné záruky, výslovné ani předpokládané, týkající se zde uváděných informací.
Upozornění
This API should not be used to create mutable strings. See https://go.microsoft.com/fwlink/?linkid=2084035 for alternatives.
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
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/'