String.Copy(String) 메서드

정의

주의

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

지정된 String과 동일한 값을 갖는 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

매개 변수

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

적용 대상