String.Copy(String) Метод
Определение
Важно!
Некоторые сведения относятся к предварительной версии продукта, в которую до выпуска могут быть внесены существенные изменения. Майкрософт не предоставляет никаких гарантий, явных или подразумеваемых, относительно приведенных здесь сведений.
Внимание!
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.
В этом случае вызов
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/'