C#'ta bir string, UTF-16 karakterlerinden (char değerleri) oluşan bir dizidir. Bir referans tipidir, ama önemli açılardan bir değer gibi davranır: değiştirilemezdir ve == nesne kimliğini değil metni karşılaştırır. string, .NET tipi System.String için C# anahtar kelimesidir; ikisi birbirinin yerine kullanılabilir.
Çıktı:
Porto
5
0
*****
hi
Porto has 5 letters
String'ler değiştirilemez
Hiçbir metot bir string'i yerinde değiştirmez. ToUpper, Replace, Trim ve diğer tüm metotlar yeni bir string döndürür ve orijinaline dokunmaz. Dönüş değerini kullanmayı unutmak çok yaygın bir string hatasıdır:
Çıktı:
[ maya ]
[MAYA]
tea
tea and cake
Değiştirilemezlik, string'lerin thread'ler arasında paylaşılmasını ve dictionary anahtarı olarak kullanılmasını güvenli kılar. Bedeli, bir döngüde bir string'i parça parça oluşturmanın her adımda yeni bir string yaratmasıdır; bunun için StringBuilder kullanın.
Uzunluk ve indeksleme
Length bir property'dir (parantez yok). s[i] indeksleyicisi, 0'dan saymaya başlayarak i konumundaki char'ı döndürür ve salt okunurdur:
Çıktı:
7
A
1
IndexOutOfRangeException
XB-2931
C# 8 ve sonrası sondan bir indeksi de kabul eder: code[^1] son karakterdir, code[code.Length - 1] ile aynıdır. Birkaç karakteri birden almak için substring sayfasına bakın.
Length bir okuyucunun karakter olarak gördüğünü değil, UTF-16 kod birimlerini sayar. Çoğu dildeki çoğu harf tek birimdir, ama emoji ve bazı nadir yazı sistemleri iki birim kullanır (bir surrogate çifti), bu yüzden "👍".Length 2'dir.
String'leri karşılaştırmak
== ve != karakterleri büyük/küçük harfe duyarlı olarak karşılaştırır. Diğer her şey için nasıl karşılaştırılacağını söyleyen bir StringComparison değeri verin:
Çıktı:
False
False
True
True
apple first
True
False
False
True
Hangi karşılaştırmayı kullanmalı:
Ordinalsayısal karakter kodlarını karşılaştırır. Hızlıdır, öngörülebilirdir ve her makinede aynıdır. Tanımlayıcılar, dosya adları, anahtarlar, protokol değerleri ve bir insana gösterilmeyen her şey için kullanın.OrdinalIgnoreCaseaynısıdır, harf büyüklüğünü yok sayar. Dosya uzantıları ya da HTTP başlıkları gibi harf duyarsız kontroller için doğru seçimdir.CurrentCulture(veCurrentCultureIgnoreCase) kullanıcının dilinin kurallarını izler, böylece kelimeleri o dildeki bir sözlüğün sıralayacağı gibi sıralar. Kullanıcılara gösterilen listeleri sıralamak için kullanın.InvariantCulturekullanıcının dil ayarlarına bağlı olmayan kültüre duyarlı kurallar kullanır. Yine de globalleştirme kütüphanesine bağlıdır: modern .NET ICU kullanır, .NET Framework Windows'un NLS'ini kullanır ve ikisi bazı string'leri farklı sıralayabilir.
StringComparison olmadan string.Compare(a, b) ve a.CompareTo(b) geçerli kültürü kullanır; bu da sonuçlarının makineden makineye değişmesine yol açar. a.ToLower() == b.ToLower() ile karşılaştırmaktan kaçının: iki yeni string ayırır ve bazı kültürlerde yanlış cevaplar verir (Türkçedeki noktalı ve noktasız i klasik örnektir).
a null iken a.Equals(b) çağırmak bir NullReferenceException fırlatır; a == b ve statik string.Equals(a, b) ise null'ı güvenle ele alır.
Kaçış karakterleri
Normal bir string literal'inin içinde ters eğik çizgi bir kaçış dizisi başlatır:
| Kaçış | Anlamı |
|---|---|
\n | Yeni satır (line feed) |
\r | Satır başı (carriage return) |
\t | Sekme |
\\ | Ters eğik çizgi |
\" | Çift tırnak |
\' | Tek tırnak (yalnızca bir char literal'inde gerekir) |
\0 | Null karakter |
\uXXXX | 4 basamaklı onaltılık koduyla UTF-16 karakter, ör. \u00e9 |
\U0001F44D | 8 basamaklı onaltılık koduyla karakter; U+FFFF'in üstünde iki char değerine dönüşür |
\xH ile \xHHHH arası | 1 ile 4 onaltılık basamakla karakter (kaçının: uzunluk belirsizdir) |
\a, \b, \f, \v | Uyarı, geri silme, sayfa besleme, dikey sekme |
\e | Escape karakteri, U+001B (C# 13) |
Çıktı:
Name: Ana
City: Porto
She said "hi"
C:\temp\report.txt
cafe = cafe
' is a quote char
"\d" gibi tanınmayan bir dizi derleme hatasıdır (CS1009, unrecognized escape sequence); bir Windows yolu ya da bir düzenli ifade normal string olarak yazıldığında olan budur.
Verbatim string'ler ve çok satırlı string'ler
Bir literal'in önüne @ koymak onu verbatim yapar: ters eğik çizgiler olduğu gibi karakterlerdir ve string birkaç satıra yayılabilir. Geriye kalan tek kaçış, tek bir çift tırnak üreten ""'dir.
Çıktı:
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
Verbatim çok satırlı bir string, devam satırlarının girintisi dahil tırnaklar arasındaki her şeyi içerir; bu yüzden genellikle yukarıdaki gibi kenar boşluğuna yaslanarak yazılır. İçerdiği satır sonları kaynak dosyadakilerdir, yani Windows satır sonlarıyla kaydedilmiş bir dosya \r\n üretir.
C# 11, iki sorunu da çözen ham string literal'lerini ekledi. Üç ya da daha fazla çift tırnakla başlayıp biterler, hiç kaçış gerektirmezler ve kapanış tırnaklarının girintisi kadar girintiyi kaldırırlar:
// C# 11 and later
string json = """
{
"name": "Ana",
"path": "C:\temp"
}
""";
// The 4 spaces before the closing """ are removed from every line.
İçeriğin kendisi """ içeriyorsa bunun yerine dört tırnakla başlayıp bitirin. Ham literal'ler interpolation ile de birleşir ($"""..."""); bkz. string interpolation.
Null, boş ve boşluk
Bir string değişkeni null (hiç string yok), boş ("", uzunluk 0) olabilir ya da yalnızca boşluk karakterleri içerebilir. İki statik yardımcı bu durumları NullReferenceException riski olmadan kontrol eder:
Çıktı:
null empty: True blank: True
"" empty: True blank: True
" " empty: False blank: True
"Ana" empty: False blank: False
True
Kullanıcı girdisini doğrulamak için neredeyse her zaman istediğiniz string.IsNullOrWhiteSpace'tir. string.Empty ve "" aynı değerdir; hangisinin yazılacağı stil meselesidir.
Karakterler üzerinde döngü
Bir string numaralandırılabilirdir, bu yüzden foreach her char'ı ziyaret eder. char tipinin karakterleri sınıflandıran statik metotları vardır:
Çıktı:
letters=6 digits=4 upper=1 symbols=1
!6202tesnuS
String'leri birleştirmek
+ birleştirir ve diğer tarafta her tiple çalışır (ToString() çağırır). Birçok değeri birleştirmek için interpolation ya da string.Join'i tercih edin:
Çıktı:
Ana Silva, 31
Ana Silva, 31
AnaSilva
tea | coffee | juice
Total: 23
Total: 5
Son iki satır bir öncelik tuzağını gösterir: + soldan sağa değerlendirilir, bu yüzden sol taraf bir string olduğu anda sonraki her + birleştirmedir. Birleştirme içindeki aritmetiği parantez içine alın.
Sıkça Sorulan Sorular
C#'ta bir string'in uzunluğu nasıl alınır?
Length property'sini kullanın: "hello".Length 5'tir. Metot değil property'dir, bu yüzden parantez yoktur. Length UTF-16 kod birimlerini sayar, bu yüzden bir emoji ya da Temel Çok Dilli Düzlem dışındaki başka bir karakter 2 sayılır. Onu null bir string üzerinde çağırmak bir NullReferenceException fırlatır.
C#'ta string'ler nasıl karşılaştırılır?
a == b metni karşılaştırır ve büyük/küçük harfe duyarlıdır. Harf duyarsız eşitlik için string.Equals(a, b, StringComparison.OrdinalIgnoreCase) kullanın. String'leri sıralamak için string.Compare(a, b, StringComparison.Ordinal) ya da kültüre duyarlı bir karşılaştırma kullanın; bunlar negatif bir sayı, sıfır ya da pozitif bir sayı döndürür.
C#'ta çok satırlı bir string nasıl yazılır?
Literal'in önüne @ koyarak onu verbatim yapın: birkaç satıra yayılabilir, ters eğik çizgiler olduğu gibi kalır ve çift tırnak "" olarak yazılır. C# 11 ve sonrasında """ ile sınırlanan ham string literal'leri de satırlara yayılır, ortak girintiyi atar ve hiç kaçış gerektirmez. Satırları \n ya da Environment.NewLine ile de birleştirebilirsiniz.
C#'ta verbatim string nedir?
@"C:\Users\ana" gibi önüne @ konmuş bir string literal'idir. Kaçış dizileri işlenmez, yani ters eğik çizgi sadece ters eğik çizgidir; bu da onu Windows yolları ve düzenli ifadeler için doğal seçim yapar. İçindeki tek kaçış, çift tırnak için ""'dir.
C#'ta string ile String arasındaki fark nedir?
Hiçbiri. string, .NET tipi System.String için C# anahtar kelime takma adıdır; tıpkı int'in System.Int32 için takma ad olması gibi. Gelenek, bildirimler için string, statik çağrılar için string.IsNullOrEmpty(...) kullanmaktır, ama ikisi de tam olarak aynı şeye derlenir.
C# hangi kaçış karakterlerini destekler?
\n yeni satır, \r satır başı, \t sekme, \\ ters eğik çizgi, \" çift tırnak, \' tek tırnak, \0 null karakter, \uXXXX onaltılık koduyla bir UTF-16 karakter, \U0001F600 8 basamaklı koduyla bir karakter (bir surrogate çiftine dönüşür), \a uyarı, \b geri silme, \f sayfa besleme, \v dikey sekme ve \e (C# 13) escape. \d gibi bilinmeyen bir dizi derleme hatasıdır (CS1009); düzenli ifadelerin genellikle verbatim string olarak yazılmasının nedeni budur.