Membuat string baru di .NET

.NET memungkinkan string dibuat menggunakan penugasan sederhana, dan juga membebani konstruktor kelas untuk mendukung pembuatan string menggunakan sejumlah parameter yang berbeda. .NET juga menyediakan beberapa metode di kelas System.String yang membuat objek string baru dengan menggabungkan beberapa string, array string, atau objek.

Membuat string menggunakan penugasan

Cara term mudah untuk membuat objek String baru hanyalah dengan menetapkan string harfiah ke objek String.

Membuat string menggunakan konstruktor kelas

Anda dapat menggunakan kelebihan beban konstruktor kelas String untuk membuat string dari array karakter. Anda juga dapat membuat string baru dengan menduplikasi karakter tertentu beberapa kali. Overload String(ReadOnlySpan<Char>) konstruktor menerima ReadOnlySpan<T> atau karakter yang dialokasikan di Span<T> tumpukan, dan menghindari alokasi array karakter perantara pada heap terkelola saat Anda membangun string kecil dengan ukuran tertentu, meskipun instance string yang dihasilkan masih dialokasikan pada heap terkelola.

Metode yang mengembalikan string

Tabel berikut ini mencantumkan beberapa metode berguna yang mengembalikan objek string baru.

Nama metode Gunakan
String.Format Membangun string yang diformat dari sekumpulan objek input.
String.Concat Membangun string dari dua string atau lebih.
String.Join Membuat string baru dengan menggabungkan array string.
String.Insert Membangun string baru dengan menyisipkan string ke dalam indeks yang ditentukan dari string yang ada.
String.CopyTo Menyalin karakter yang ditentukan dalam string ke dalam posisi tertentu dalam array karakter.
String.Create Membuat string baru dengan panjang tertentu, mengisi karakter melalui panggilan balik yang menerima Span<T> yang dapat ditulis dan objek status yang disediakan oleh pemanggil.

String.Format

Anda dapat menggunakan metode ini String.Format untuk membuat string yang diformat dan menggabungkan string yang mewakili beberapa objek. Metode ini secara otomatis mengonversi objek yang dilewatkan menjadi string. Misalnya, jika aplikasi Anda harus menampilkan Int32 nilai dan DateTime nilai kepada pengguna, Anda dapat dengan mudah membuat string untuk mewakili nilai-nilai ini menggunakan metode tersebut Format . Untuk informasi tentang konvensi pemformatan yang digunakan dengan metode ini, lihat bagian tentang pemformatan komposit.

Contoh berikut menggunakan metode untuk Format membuat string yang menggunakan variabel bilangan bulat.

int numberOfFleas = 12;
string miscInfo = String.Format("Your dog has {0} fleas. " +
                                "It is time to get a flea collar. " +
                                "The current universal date is: {1:u}.",
                                numberOfFleas, DateTime.Now);
Console.WriteLine(miscInfo);
// The example displays the following output:
//       Your dog has 12 fleas. It is time to get a flea collar.
//       The current universal date is: 2008-03-28 13:31:40Z.
Dim numberOfFleas As Integer = 12
Dim miscInfo As String = String.Format("Your dog has {0} fleas. " & _
                                       "It is time to get a flea collar. " & _
                                       "The current universal date is: {1:u}.", _
                                       numberOfFleas, Date.Now)
Console.WriteLine(miscInfo)
' The example displays the following output:
'       Your dog has 12 fleas. It is time to get a flea collar. 
'       The current universal date is: 2008-03-28 13:31:40Z.

Dalam contoh ini, DateTime.Now menampilkan tanggal dan waktu saat ini dengan cara yang ditentukan oleh budaya yang terkait dengan thread saat ini.

String.Concat

Metode ini String.Concat dapat digunakan untuk dengan mudah membuat objek string baru dari dua atau lebih objek yang ada. Ini menyediakan metode yang independen dari bahasa untuk menggabungkan string. Metode ini menerima kelas apa pun yang berasal dari System.Object. Contoh berikut membuat string dari dua objek string yang ada dan karakter pemisah.

string helloString1 = "Hello";
string helloString2 = "World!";
Console.WriteLine(String.Concat(helloString1, ' ', helloString2));
// The example displays the following output:
//      Hello World!
Dim helloString1 As String = "Hello"
Dim helloString2 As String = "World!"
Console.WriteLine(String.Concat(helloString1, " "c, helloString2))
' The example displays the following output:
'      Hello World!

String.Join

Metode String.Join ini membuat string baru dari sebuah array string dan string pemisah. Metode ini berguna jika Anda ingin menggabungkan beberapa string bersama-sama, membuat daftar mungkin dipisahkan oleh koma.

Contoh berikut menggunakan spasi untuk mengikat array string.

string[] words = {"Hello", "and", "welcome", "to", "my" , "world!"};
Console.WriteLine(String.Join(" ", words));
// The example displays the following output:
//      Hello and welcome to my world!
Dim words() As String = {"Hello", "and", "welcome", "to", "my", "world!"}
Console.WriteLine(String.Join(" ", words))
' The example displays the following output:
'      Hello and welcome to my world!

String.Insert

Metode ini String.Insert membuat string baru dengan menyisipkan string ke posisi tertentu di string lain. Metode ini menggunakan indeks berbasis nol. Contoh berikut menyisipkan string ke posisi indeks kelima MyString dan membuat string baru dengan nilai ini.

string sentence = "Once a time.";
 Console.WriteLine(sentence.Insert(4, " upon"));
 // The example displays the following output:
 //      Once upon a time.
Dim sentence As String = "Once a time."
Console.WriteLine(sentence.Insert(4, " upon"))
' The example displays the following output:
'      Once upon a time.

String.CopyTo

Metode String.CopyTo menyalin bagian dari string ke sebuah array karakter. Anda dapat menentukan indeks awal string dan jumlah karakter yang akan disalin. Metode ini mengambil indeks sumber, array karakter, indeks tujuan, dan jumlah karakter yang akan disalin. Semua indeks berbasis nol.

Contoh berikut menggunakan CopyTo metode untuk menyalin karakter kata "Halo" dari objek string ke posisi indeks pertama dari array karakter.

string greeting = "Hello World!";
char[] charArray = {'W','h','e','r','e'};
Console.WriteLine($"The original character array: {new string(charArray)}");
greeting.CopyTo(0, charArray,0 ,5);
Console.WriteLine($"The new character array: {new string(charArray)}");
// The example displays the following output:
//       The original character array: Where
//       The new character array: Hello
Dim greeting As String = "Hello World!"
Dim charArray() As Char = {"W"c, "h"c, "e"c, "r"c, "e"c}
Console.WriteLine("The original character array: {0}", New String(charArray))
greeting.CopyTo(0, charArray, 0, 5)
Console.WriteLine("The new character array: {0}", New String(charArray))
' The example displays the following output:
'       The original character array: Where
'       The new character array: Hello

String.Create

Metode String.Create memungkinkan Anda untuk mengisi karakter string baru secara terprogram dengan menggunakan panggilan balik. Panggilan balik menerima karakter yang dapat Span<T> ditulis dan objek status yang disediakan penelepon, sehingga Anda dapat membangun konten string tanpa mengalokasikan buffer karakter perantara. Callback itu sendiri mungkin masih mengalokasikan, misalnya jika menangkap variabel lokal atau memanggil API lain yang banyak menggunakan alokasi.

Contoh berikut menggunakan String.Create untuk membangun string lima karakter dari karakter alfabet berturut-turut:

string result = string.Create(5, 'a', (span, firstChar) =>
{
    for (int i = 0; i < span.Length; i++)
    {
        span[i] = (char)(firstChar + i);
    }
});

Console.WriteLine(result); // abcde
Module Program
    Sub Main()
        Dim result As String = String.Create(5, "a"c, Sub(span, firstChar)
                                                           For i As Integer = 0 To span.Length - 1
                                                               span(i) = ChrW(AscW(firstChar) + i)
                                                           Next
                                                       End Sub)

        Console.WriteLine(result) ' abcde
    End Sub
End Module

String.Create dirancang untuk skenario sensitif performa di mana Anda mengetahui panjang string akhir terlebih dahulu dan ingin menghindari alokasi buffer karakter menengah. Runtime mengalokasikan string baru, meneruskan buffer pencadangannya langsung ke panggilan balik Anda sebagai Span<char>, dan mengembalikan string yang tidak dapat diubah setelah panggilan balik kembali. Tidak ada salinan data terjadi setelah panggilan balik selesai.

String.Create Vs. new String(Span<char>)

Opsi lain untuk membangun string secara efisien adalah mengalokasikan buffer karakter dengan stackalloc, mengisinya, dan meneruskannya ke String(ReadOnlySpan<char>) konstruktor:

static string CreateStringFromSpan()
{
    Span<char> span = stackalloc char[5];
    for (int i = 0; i < 5; i++)
    {
        span[i] = (char)('a' + i);
    }
    return new string(span);
}

Console.WriteLine(CreateStringFromSpan()); // abcde

Kedua pendekatan mengalokasikan string akhir hanya sekali. Perbedaan utamanya adalah:

  • stackalloc + new string(span) menempatkan buffer kerja pada tumpukan. Ini tercepat untuk buffer kecil berukuran tetap , tetapi tumpukannya adalah sumber daya terbatas; alokasi besar atau berlapis dalam dapat menyebabkan StackOverflowException. Contoh ini menunjukkan pola C# stackalloc ; Visual Basic tidak mendukung stackalloc, tetapi masih dapat memanggil String(ReadOnlySpan<char>) konstruktor saat Anda memiliki ReadOnlySpan<char>.
  • String.Create mengalokasikan buffer kerja pada tumpukan sebagai bagian dari objek string itu sendiri, sehingga tidak ada tekanan tumpukan. Ini juga menerima parameter status yang diketik yang diteruskan oleh runtime ke fungsi balik Anda tanpa boxing, menghindari alokasi boxing ketika status adalah tipe referensi atau struct yang tidak ter-capture. Secara umum, lebih memilih stackalloc + new String(span) untuk string kecil (biasanya kurang dari beberapa ratus karakter) dengan ukuran yang diketahui dan terbatas. Gunakan String.Create ketika ukurannya mungkin besar, ketika Anda ingin menghindari tekanan tumpukan, atau saat meneruskan status ke panggilan balik tanpa tinju.

Lihat juga