String.Copy(String) 메서드
정의
중요
일부 정보는 릴리스되기 전에 상당 부분 수정될 수 있는 시험판 제품과 관련이 있습니다. Microsoft는 여기에 제공된 정보에 대해 어떠한 명시적이거나 묵시적인 보증도 하지 않습니다.
주의
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
매개 변수
- str
- String
복사할 문자열입니다.
반환
str
과 동일한 값을 갖는 새 문자열입니다.
- 특성
예외
str
이(가) null
인 경우
설명
메서드는 Copy
원래 문자열과 값이 같지만 다른 개체 참조를 나타내는 개체를 반환 String 합니다. 기존 문자열 참조를 추가 개체 변수에 할당하는 할당 작업과 다릅니다.
중요
.NET Core 3.0부터 이 메서드는 사용되지 않습니다. 그러나 .NET 구현에서는 사용하지 않는 것이 좋습니다. 특히 .NET Core 3.0의 문자열 인턴링 변경으로 인해 메서드가 새 문자열을 만들지 않고 기존 인턴된 문자열에 대한 참조를 반환하는 경우도 Copy
있습니다.
메서드를 호출 Copy
하려는 이유에 따라 다음과 같은 여러 가지 대안이 있습니다.
문자열을 수정하는 작업에 다른 문자열 인스턴스를 사용하려면 원래 문자열 인스턴스를 사용합니다. 문자열은 변경할 수 없으므로 문자열 작업은 새 문자열 인스턴스를 만들고 원래 문자열은 영향을 받지 않습니다. 이 경우 원래 문자열 변수에 새 문자열 참조를 할당하면 안 됩니다. 다음 예제에서 이에 대해 설명합니다.
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.
이 경우 메서드를
Copy
호출하기 전에 메서드를 호출하면 새 문자열 인스턴스가 Substring 불필요하게 만들어집니다.원래 문자열과 동일한 내용으로 변경 가능한 버퍼를 만들려면 또는 StringBuilder.StringBuilder(String) 생성자를 호출 String.ToCharArray 합니다. 예를 들면 다음과 같습니다.
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.
안전하지 않은 코드를 사용하여 문자열 내용을 수정할 수 있도록 문자열의 변경 가능한 복사본을 만들려면 메서드를 사용합니다 Marshal.StringToHGlobalUni . 다음 예제에서는 메서드를 사용하여 Marshal.StringToHGlobalUni 관리되지 않는 메모리에서 복사된 문자열의 위치에 대한 포인터를 가져오고, 문자열에 있는 각 문자의 유니코드 코드 지점을 하나씩 증가시키고, 결과 문자열을 관리되는 문자열에 다시 복사합니다.
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/'
적용 대상
.NET