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

정의

경고

이 API는 현재 사용되지 않습니다.

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

매개 변수

str
String String String String

복사할 문자열입니다.The string to copy.

반환

str과 동일한 값을 갖는 새 문자열입니다.A new string with the same value as str.

예외

설명

합니다 Copy 메서드가 반환 되는 String 개체는 원래 문자열과 같은 값을 가지는 다른 개체 참조를 나타냅니다.The Copy method returns a String object that has the same value as the original string but represents a different object reference. 기존 문자열 참조 추가 개체 변수에 할당 하는 할당 작업에서 달라 집니다.It differs from an assignment operation, which assigns an existing string reference to an additional object variable.

중요

.NET Core 3.0부터이 메서드는 사용 되지 않습니다.Starting with .NET Core 3.0, this method is obsolete. 그러나 .NET 구현에서는 사용 하지 않는 것이 좋습니다.However, we do not recommend its use in any .NET implementation. 특히 .net Core 3.0의 문자열 인턴 변경으로 인해 메서드는 Copy 새 문자열을 만들지 않지만 기존 인턴 문자열에 대 한 참조를 반환 하는 경우도 있습니다.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.

Copy 메서드를 호출 하려는 이유에 따라 다음과 같은 여러 가지 대안이 있습니다.Depending on Why you want to call the Copy method, there are a number of alternatives:

  • 문자열을 수정 하는 작업에서 다른 문자열 인스턴스를 사용 하려면 원래 문자열 인스턴스를 사용 합니다.If you want a different string instance to use in an operation that modifies the string, use the original string instance. 문자열은 변경할 수 없으므로 문자열 작업은 새 문자열 인스턴스를 만들며 원래 문자열은 영향을 받지 않습니다.Because strings are immutable, the string operation creates a new string instance, and the original string remains unaffected. 이 경우에는 원래 문자열 변수에 새 문자열 참조를 할당 하면 안 됩니다.In this case, you should not assign the new string reference to the original string variable. 다음 예제에서 이에 대해 설명합니다.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.            
    

    이 경우 Substring 메서드를 호출 하기 Copy 전에 메서드를 호출 하 여 새 문자열을 만드는 것은 불필요 하 게 새 문자열 인스턴스를 만듭니다.In this case, calling the Copy method to create a new string before calling the Substring method unnecessarily creates a new string instance.

  • 원래 문자열과 동일한 콘텐츠를 사용 하 여 변경할 수 있는 버퍼를 만들려는 경우 String.ToCharArray 또는 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. 예: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.        
    
  • 안전 하지 않은 코드를 사용 하 여 문자열 내용을 수정할 수 있도록 문자열의 변경할 수 있는 복사본을 만들려는 경우 메서드를 사용 Marshal.StringToHGlobalUni 합니다.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. 다음 예제에서는 Marshal.StringToHGlobalUni 메서드를 사용 하 여 관리 되지 않는 메모리에서 복사 된 문자열의 위치에 대 한 포인터를 가져오고, 문자열에 있는 각 문자의 유니코드 코드 포인트를 1 씩 증가 시키고, 결과 문자열을 관리 되는 문자열에 다시 복사 합니다.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/'      
    

적용 대상