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

Строка для копирования.

Возвращаемое значение

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.
    

    В этом случае вызов Copy метода для создания новой строки перед вызовом Substring метода необязательно создает новый экземпляр строки.

  • Если вы хотите создать изменяемый буфер с тем же содержимым, что и исходная строка, вызовите String.ToCharArray StringBuilder.StringBuilder(String) конструктор или. Пример:

    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.
    
  • Если необходимо создать изменяемую копию строки, чтобы можно было использовать ненадежный код для изменения содержимого строки, используйте 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/'
    

Применяется к