String.Copy(String) Yöntem

Tanım

Dikkat

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

Belirtilen Stringile aynı değere sahip yeni bir örneği String oluşturur.

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

Parametreler

str
String

Kopyalanacak dize.

Döndürülenler

ile aynı değere strsahip yeni bir dize.

Öznitelikler

Özel durumlar

str, null'e eşittir.

Açıklamalar

yöntemi, Copy özgün dizeyle aynı değere sahip olan ancak farklı bir nesne başvuruyu temsil eden bir nesne döndürür String . Ek bir nesne değişkenine var olan bir dize başvurusu atayan atama işleminden farklıdır.

Important

.NET Core 3.0'dan başlayarak bu yöntem kullanım dışıdır. Ancak, herhangi bir .NET uygulamasında kullanılmasını önermeyiz. Özellikle, .NET Core 3.0'da dize interningindeki değişiklikler nedeniyle, bazı durumlarda Copy yöntemi yeni bir dize oluşturmaz, ancak var olan bir interned dizeye başvuru döndürür.

yöntemini neden çağırmak istediğinize Copy bağlı olarak, bir dizi alternatif vardır:

  • Dizeyi değiştiren bir işlemde farklı bir dize örneğinin kullanılmasını istiyorsanız, özgün dize örneğini kullanın. Dizeler sabit olduğundan, dize işlemi yeni bir dize örneği oluşturur ve özgün dize etkilenmez. Bu durumda, özgün dize değişkenine yeni dize başvurusu atamamalısınız. Aşağıdaki örnek, bir gösterim sağlar.

    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.
    

    Bu durumda, yöntemini çağırmadan Copy önce yeni bir dize oluşturmak için yöntemini çağırmak Substring gereksiz yere yeni bir dize örneği oluşturur.

  • Özgün dizeyle aynı içerikle değiştirilebilir bir arabellek oluşturmak istiyorsanız veya String.ToCharArray oluşturucuyu çağırınStringBuilder.StringBuilder(String). Örneğin:

    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.
    
  • Dize içeriğini değiştirmek için güvenli olmayan kod kullanabilmek için dizenin değiştirilebilir bir kopyasını oluşturmak istiyorsanız yöntemini kullanın Marshal.StringToHGlobalUni . Aşağıdaki örnek, kopyalanan dizenin yönetilmeyen bellekteki konumuna bir işaretçi almak için yöntemini kullanır Marshal.StringToHGlobalUni , dizedeki her karakterin Unicode kod noktasını bir artırır ve sonuçta elde edilen dizeyi yönetilen dizeye geri kopyalar.

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

Şunlara uygulanır