string di C# adalah urutan karakter UTF-16 (nilai char). Ia adalah reference type, tetapi berperilaku seperti nilai dalam hal-hal yang penting: ia immutable, dan == membandingkan teksnya, bukan identitas object-nya. string adalah kata kunci C# untuk tipe .NET System.String; keduanya bisa dipakai bergantian.
Output:
Porto
5
0
*****
hi
Porto has 5 letters
String bersifat immutable
Tidak ada method yang mengubah string secara langsung. ToUpper, Replace, Trim, dan semua method lainnya mengembalikan string baru dan membiarkan string aslinya tidak tersentuh. Lupa memakai nilai kembaliannya adalah bug string yang sangat umum:
Output:
[ maya ]
[MAYA]
tea
tea and cake
Sifat immutable membuat string aman dipakai bersama di banyak thread dan dipakai sebagai key dictionary. Konsekuensinya, membangun string sepotong demi sepotong di dalam perulangan akan membuat string baru di setiap langkah; untuk itu, pakai StringBuilder.
Length dan indeks
Length adalah property (tanpa tanda kurung). Indexer s[i] mengembalikan char di posisi i, dihitung mulai dari 0, dan bersifat read-only:
Output:
7
A
1
IndexOutOfRangeException
XB-2931
C# 8 dan sesudahnya juga menerima indeks dari ujung: code[^1] adalah karakter terakhir, sama dengan code[code.Length - 1]. Untuk mengambil beberapa karakter sekaligus, lihat substring.
Length menghitung code unit UTF-16, bukan karakter seperti yang dilihat pembaca. Kebanyakan huruf di kebanyakan bahasa hanya satu unit, tetapi emoji dan beberapa aksara langka memakai dua (sebuah surrogate pair), jadi "👍".Length bernilai 2.
Membandingkan string
== dan != membandingkan karakternya dengan peka huruf besar kecil. Untuk perbandingan lain, berikan nilai StringComparison yang menyatakan cara membandingkannya:
Output:
False
False
True
True
apple first
True
False
False
True
Perbandingan mana yang dipakai:
Ordinalmembandingkan kode numerik karakternya. Cepat, bisa diprediksi, dan sama di setiap komputer. Pakai untuk identifier, nama file, key, nilai protokol, dan apa pun yang tidak ditampilkan ke orang.OrdinalIgnoreCasesama, tetapi mengabaikan huruf besar kecil. Pilihan yang tepat untuk pengecekan yang tidak peka huruf besar kecil seperti ekstensi file atau header HTTP.CurrentCulture(danCurrentCultureIgnoreCase) mengikuti aturan bahasa pengguna, jadi mengurutkan kata seperti kamus dalam bahasa itu. Pakai untuk mengurutkan daftar yang ditampilkan ke pengguna.InvariantCulturememakai aturan yang peka culture, tetapi tidak bergantung pada pengaturan bahasa pengguna. Hasilnya tetap bergantung pada library globalisasi: .NET modern memakai ICU, .NET Framework memakai NLS dari Windows, dan keduanya bisa mengurutkan beberapa string secara berbeda.
string.Compare(a, b) dan a.CompareTo(b) tanpa StringComparison memakai culture yang sedang aktif, sehingga hasilnya bisa berbeda di setiap komputer. Hindari membandingkan dengan a.ToLower() == b.ToLower(): cara ini membuat dua string baru, dan memberi jawaban yang salah di beberapa culture (huruf i bertitik dan tanpa titik di bahasa Turki adalah contoh klasiknya).
Memanggil a.Equals(b) saat a bernilai null melempar NullReferenceException, sedangkan a == b dan string.Equals(a, b) yang static menangani null dengan aman.
Escape character
Di dalam string literal biasa, backslash memulai sebuah escape sequence:
| Escape | Arti |
|---|---|
\n | Baris baru (line feed) |
\r | Carriage return |
\t | Tab |
\\ | Backslash |
\" | Tanda kutip ganda |
\' | Tanda kutip tunggal (hanya dibutuhkan di literal char) |
\0 | Karakter null |
\uXXXX | Karakter UTF-16 berdasarkan kode heksadesimal 4 digit, misalnya \u00e9 |
\U0001F44D | Karakter berdasarkan kode heksadesimal 8 digit; di atas U+FFFF menjadi dua nilai char |
\xH sampai \xHHHH | Karakter berdasarkan 1 sampai 4 digit heksadesimal (hindari: panjangnya ambigu) |
\a, \b, \f, \v | Alert, backspace, form feed, vertical tab |
\e | Karakter escape, U+001B (C# 13) |
Output:
Name: Ana
City: Porto
She said "hi"
C:\temp\report.txt
cafe = cafe
' is a quote char
Sequence yang tidak dikenal seperti "\d" adalah error kompilasi (CS1009, escape sequence tidak dikenal), dan itulah yang terjadi saat path Windows atau regular expression ditulis sebagai string biasa.
String verbatim dan string multiline
Memberi awalan @ pada literal membuatnya verbatim: backslash menjadi karakter literal, dan string-nya boleh terdiri dari beberapa baris. Satu-satunya escape yang tersisa adalah "", yang menghasilkan satu tanda kutip ganda.
Output:
C:\Users\ana\Documents\notes.txt
\d{3}-\d{4}
He said "ready" and left.
Rua das Flores 12
4050-262 Porto
Portugal
first line
second line
String multiline verbatim mencakup semua yang ada di antara tanda kutipnya, termasuk indentasi baris lanjutannya, itulah sebabnya string seperti ini biasanya ditulis rapat ke margin seperti di atas. Baris baru di dalamnya adalah baris baru dari file source, jadi file yang disimpan dengan akhir baris Windows menghasilkan \r\n.
C# 11 menambahkan raw string literal, yang menyelesaikan kedua masalah itu. Literal ini dimulai dan diakhiri dengan tiga tanda kutip ganda atau lebih, sama sekali tidak butuh escape, dan membuang indentasi sesuai indentasi tanda kutip penutupnya:
// C# 11 and later
string json = """
{
"name": "Ana",
"path": "C:\temp"
}
""";
// The 4 spaces before the closing """ are removed from every line.
Jika isinya sendiri mengandung """, mulai dan akhiri dengan empat tanda kutip. Raw literal juga bisa digabung dengan interpolation ($"""..."""); lihat string interpolation.
Null, kosong, dan whitespace
Variabel string bisa bernilai null (sama sekali tidak ada string), kosong ("", panjangnya 0), atau hanya berisi whitespace. Dua helper static memeriksa kasus-kasus ini tanpa risiko NullReferenceException:
Output:
null empty: True blank: True
"" empty: True blank: True
" " empty: False blank: True
"Ana" empty: False blank: False
True
Untuk memvalidasi input pengguna, string.IsNullOrWhiteSpace hampir selalu menjadi yang kamu butuhkan. string.Empty dan "" adalah nilai yang sama; memilih salah satunya hanya soal gaya.
Perulangan pada setiap karakter
String bisa dienumerasi, jadi foreach mengunjungi setiap char. Tipe char punya method static untuk mengelompokkan karakter:
Output:
letters=6 digits=4 upper=1 symbols=1
!6202tesnuS
Menggabungkan string
+ menggabungkan string, dan bisa dipakai dengan tipe apa pun di sisi lainnya (ia memanggil ToString()). Untuk menggabungkan banyak nilai, lebih baik pakai interpolation atau string.Join:
Output:
Ana Silva, 31
Ana Silva, 31
AnaSilva
tea | coffee | juice
Total: 23
Total: 5
Dua baris terakhir menunjukkan jebakan urutan operasi: + dievaluasi dari kiri ke kanan, jadi begitu sisi kirinya berupa string, setiap + berikutnya adalah penggabungan. Beri tanda kurung pada operasi aritmetika di dalam penggabungan.
Pertanyaan yang sering diajukan
Bagaimana cara mendapatkan panjang string di C#?
Pakai property Length: "hello".Length bernilai 5. Ini property, bukan method, jadi tidak pakai tanda kurung. Length menghitung code unit UTF-16, jadi emoji atau karakter lain di luar Basic Multilingual Plane dihitung 2. Memanggilnya pada string null melempar NullReferenceException.
Bagaimana cara membandingkan string di C#?
a == b membandingkan teksnya dan peka huruf besar kecil. Untuk kesamaan yang tidak peka huruf besar kecil, pakai string.Equals(a, b, StringComparison.OrdinalIgnoreCase). Untuk mengurutkan string, pakai string.Compare(a, b, StringComparison.Ordinal) atau perbandingan yang peka culture, yang mengembalikan angka negatif, nol, atau angka positif.
Bagaimana cara menulis string multiline di C#?
Beri awalan @ pada literal agar menjadi verbatim: string itu bisa terdiri dari beberapa baris, backslash dianggap literal, dan tanda kutip ganda ditulis sebagai "". Di C# 11 dan sesudahnya, raw string literal yang dibatasi """ juga bisa terdiri dari beberapa baris, membuang indentasi yang sama di setiap baris, dan sama sekali tidak butuh escape. Kamu juga bisa menggabungkan baris dengan \n atau Environment.NewLine.
Apa itu string verbatim di C#?
String literal yang diberi awalan @, seperti @"C:\Users\ana". Escape sequence tidak diproses, jadi backslash hanyalah backslash, dan itulah sebabnya bentuk ini cocok untuk path Windows dan regular expression. Satu-satunya escape di dalamnya adalah "" untuk tanda kutip ganda.
Apa perbedaan string dan String di C#?
Tidak ada. string adalah alias kata kunci C# untuk tipe .NET System.String, sama seperti int adalah alias untuk System.Int32. Konvensinya, pakai string untuk deklarasi dan string.IsNullOrEmpty(...) untuk pemanggilan static, tetapi keduanya dikompilasi menjadi hal yang persis sama.
Escape character apa saja yang didukung C#?
\n baris baru, \r carriage return, \t tab, \\ backslash, \" tanda kutip ganda, \' tanda kutip tunggal, \0 karakter null, \uXXXX karakter UTF-16 berdasarkan kode heksadesimal, \U0001F600 karakter berdasarkan kode 8 digit (menjadi surrogate pair), \a alert, \b backspace, \f form feed, \v vertical tab, dan \e (C# 13) escape. Sequence yang tidak dikenal seperti \d adalah error kompilasi (CS1009), itulah sebabnya regular expression biasanya ditulis sebagai string verbatim.