String.Copy(String) Methode
Definition
Wichtig
Einige Informationen beziehen sich auf Vorabversionen, die vor dem Release ggf. grundlegend überarbeitet werden. Microsoft übernimmt hinsichtlich der hier bereitgestellten Informationen keine Gewährleistungen, seien sie ausdrücklich oder konkludent.
Achtung
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
Parameter
- str
- String
Die zu kopierende Zeichenfolge.
Gibt zurück
Eine neue Zeichenfolge mit demselben Wert wie str.
- Attribute
Ausnahmen
str ist null.
Hinweise
Die Copy Methode gibt ein String Objekt zurück, das denselben Wert wie die ursprüngliche Zeichenfolge aufweist, aber einen anderen Objektverweis darstellt. Sie unterscheidet sich von einem Zuordnungsvorgang, der einer zusätzlichen Objektvariablen einen vorhandenen Zeichenfolgenverweis zuweist.
Important
Ab .NET Core 3.0 ist diese Methode veraltet. Wir empfehlen jedoch die Verwendung in keiner .NET Implementierung. Insbesondere aufgrund von Änderungen der Zeichenfolgen internierung in .NET Core 3.0 erstellt die methode Copy keine neue Zeichenfolge, sondern gibt einfach einen Verweis auf eine vorhandene interne Zeichenfolge zurück.
Je nachdem , warum Sie die Copy Methode aufrufen möchten, gibt es eine Reihe von Alternativen:
Wenn Sie eine andere Zeichenfolgeninstanz in einem Vorgang verwenden möchten, der die Zeichenfolge ändert, verwenden Sie die ursprüngliche Zeichenfolgeninstanz. Da Zeichenfolgen unveränderlich sind, erstellt der Zeichenfolgenvorgang eine neue Zeichenfolgeninstanz, und die ursprüngliche Zeichenfolge bleibt unberührt. In diesem Fall sollten Sie der ursprünglichen Zeichenfolgenvariablen keinen neuen Zeichenfolgenverweis zuweisen. Dies wird im folgenden Beispiel veranschaulicht.
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 diesem Fall wird durch Aufrufen der
CopyMethode eine neue Zeichenfolge erstellt, bevor die Substring Methode unnötigerweise eine neue Zeichenfolgeninstanz aufruft.Wenn Sie einen veränderbaren Puffer mit demselben Inhalt wie die ursprüngliche Zeichenfolge erstellen möchten, rufen Sie den String.ToCharArray Konstruktor auf StringBuilder.StringBuilder(String) . Beispiel:
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.Wenn Sie eine veränderbare Kopie der Zeichenfolge erstellen möchten, damit Sie unsicheren Code verwenden können, um den Zeichenfolgeninhalt zu ändern, verwenden Marshal.StringToHGlobalUni Sie die Methode. Im folgenden Beispiel wird die Marshal.StringToHGlobalUni Methode verwendet, um einen Zeiger auf die Position einer kopierten Zeichenfolge im nicht verwalteten Speicher abzurufen, erhöht den Unicode-Codepunkt jedes Zeichens in der Zeichenfolge um eins und kopiert die resultierende Zeichenfolge wieder in eine verwaltete Zeichenfolge.
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/'