C# String Veri Türü
Yıllardır bilgisayarlar kullanıcılarla iletişim kurmak için
yazıyı kullanırlar. Programlama dillerinde karakter kelimesi, bir
harf, sayı, noktalama işareti ya da bir sembol anlamına gelir.
String kelimesi ise karakterlerin yan yana gelerek oluşturdukları
dizi anlamına gelir. C# Dilinde string bir anahtar kelimedir. String
türünde bir değişken tanımlarken aşağıdaki gibi yazarız.
string Yazi;
Burada Yazi adında, string türünde bir değişken tanımlaması
yapılmıştır ya da başka bir deyişle, Yazi string bir değişkendir.
C#taki string veri türü .net Framework içerisindeki System.String
sınıfının bir aliasıdır yani string yazmakla System.String yazmak
aynı şeydir.
Yani aşağıdaki gibi de string değişken tanımlaması yapılabilir.
System.String Yazi;
Eğer programımızın üst kısmında using direktifi ile
using System;
yazmışsak, başındaki System. ifadesini yazmayabiliriz. Bunu zaten
daha önceki yazılardan biliyorsunuz.
String Yazi;
Şimdi burada bir karışıklık oldu. Eğer usnig direktifi ile System
isim uzayı direktifi yazılmışsa büyük harfle yazılan String
yeterlidir ama C#ta bir veri türü olan ve küçük harfle yazılan
string kelimesi de kendi başına System.String anlamına gelen bir
alias olduğundan aşağıdaki gibi bir ifadeyi yazmak yanlış olur.
System.string Yazi; //Yanlış oldu.
Çünkü string kelimesinin karşılığı olan System.String ifadesini
yukarıdaki ifadede yerine yazarsak
System.System.String Yazi; //Yanlış oldu.
yazmış oluruz. Tabi ki böyle bir ifade yoktur, çalışmaz.
Şimdi string türünde bir değişken nasıl tanımlanır öğrendiğimize
göre değer ataması yapalım.
Yazi = "C#Türkü çok seviyorum.";
Yukarıdaki ifadenin sağındaki değere string literal denir. Bir
string literal sıfır ya da daha fazla karakterden oluşur. Karakterin
tanımını yukarıda yaptığımıza göre içinde neler bulunabileceği de
açıktır: Harf, rakam, noktalama işareti ayda sembol. Dikkat
ederseniz bir string literal çift tırnak arasına yazılır. Bu durumda
string literali başlatan ve bitiren çift tırnak işaretleri string
ifadenin kendisine dâhil değildir.
Yazı dilinde noktalı virgül, soru işareti gibi işaretler çift
tırnakların içine yazılır. Ama C#ta noktalı virgül atama işlemini
bitiren işarettir ve en sona yazılır. Karıştırmamak gerekir.
Bir string literal tek satır olmak zorundadır. Aşağıdaki atama
işlemi çalışmayacaktır.
Yazi = "C#Türkü çok
seviyorum."; // Yanlış oldu.
Tamsayılar yazısında da anlattığımız gibi, string türü değişkenlere
de tanımlama esnasında ilk değer ataması yapabiliriz.
string Yazi = "C#Türkü çok seviyorum.";
Bir stringi ekranda göstermek için daha önceden de bildiğimiz
Console.Write ya da Console.WriteLine yöntemlerini kullanabiliriz.
Console.WriteLine(Yazi);
Bu ifade konsolda aşağıdaki gibi bir çıktı verecektir.
Çift tırnak işaretleri, ekranda görünmedi. Çünkü onlar string
ifademizin bir parçası değildir. Bir değişken tanımlaması yapmadan
da bir string ifadeyi direkt Console.Write ya da Console.WriteLine
yöntemlerine geçebilirsiniz.
Console.WriteLine("C#Türkü çok çok seviyorum");
Console.WriteLine ile tamsayıları gösterebildiğimiz öğrenmiştik.
Şimdi de string ifadeleri gösterebildiğini öğrendik. Bunu yapması
mümkündür, çünkü Console.WriteLine yönteminin aynı isimde birden çok
sürümü vardır. Aynı yöntemin birden çok sürümleri olmasına
yöntemlerin aşırı yüklenmesi denir. Başka bir yazıda bu meseleyi
anlatacağız.
Aşağıdaki ilginç örneği dikkatle inceleyelim.
using System;
class stringler
{
static void Main()
{
string A, B, C;
A = "Merhaba, ";
B = "Dünya";
C = A + B;
Console.WriteLine(C);
Console.ReadLine();
}
}
Ekran çıktısını incelersek çok temel bir örnek, ama programda ilginç
bir yer var. 3 tane değişken tanımladık. İlk 2 tanesine değer
ataması yapma işlemi daha öncekilerle aynı, sadece sayı değil de
yazı kullandık. 3. değişkene değer ataması yapma işlemi biraz ilginç
görünüyor. Çünkü iki tane yazı arasında toplama işlemi yapmaya
çalışyıoruz.
Bu ne anlama geliyor? Artı işareti iki tane string ifadeyi
birleştirir. Programı çalıştırdığımızda aşağıdaki çıktıyı görürüz.
Merhaba dünya cümlesi çok meşhur bir programcı selamıdır. 1978
yılında C Programlama Dili kitabının yazarları Brian W. Kernighan ve
Dennis M. Ritchie tarafından ilk defa kullanılan bu ilk yazılan
programın dünyaya merhaba demesi olayı gelenek haline geldi.
Ama Kernighan ve Ritchie string birleştirme örneğini yapamadılar,
çünkü standart C dilinde string birleştirme yoktur, hatta string
yoktur.
Değişik işlemler için aynı operatörün kullanılması, mesela toplama
operatörü, operatörlerin aşırı yüklenmesi olarak bilinir. Bu meseyi
de yine başka bir yazıda anlatacağız.
Dikkat ederseniz A değişkenine bir string literal ataması yaptık ama
virgülden sonra bir boşluk bıraktık. Çünkü 2 tane stringi
birleştirdiğimizde arasına kendisi boşluk koymaz bunu bizim
belirtmemiz lazım.
Stringlerle de yine artı eşittir operatörünü kullanabilirsiniz.
string Yazi = "Bu bir yazıdır.";
Yazi += "Bu da bir yazıdır.";
Artı eşit operatörü, ilk string ifadenin sonuna ikinci string
ifadeyi ekler. Bunlardan başka diğer operatörler stringlerle
kullanılmaz.
String birleştirme işlemi, eğer çok uzun bir string ifadeyi bir
değişkene atayacaksak çok işlevseldir.
string Kavgam =
"Kader beni, iki Alman devletinin tam sınırları üzerinde bir
kasabada," +
"Braunau am Inn'de dünyaya getirdi. Alman olan Avusturya, büyük
Alman vatanına" +
"tekrar dönmelidir. Hem bu birleşme, iktisadi sebeplerin sonucu
olmamalıdır. " +
"Bu birleşme, iktisadi bakımdan zararlı olsa bile, mutlaka
olmalıdır." +
"Aynı kan, aynı imparatorluğa aittir. ";
Aynı zamanda string literaller ile string değişkenlerin bir
kombinasyonu olarak string birleştirmeyi kullanabilirsiniz.
string programlama_dili = "C# ";
Console.WriteLine("Ben " + programlama_dili + " programlamayı çok
seviyorum." + " Ya sen?");
Yukarıdaki birleştirilmiş ifade aslında aşağıdaki şekilde ayrı ayrı
da yazılabilir.
string programlama_dili = "C# ";
Console.Write("Ben");
Console.Write(programlama_dili);
Console.Write(" programlamayı çok seviyorum.");
Console.WriteLine(" Ya sen?");
Dikkat ederseniz ilk dört ifadede Console.Write kullanırken
sonuncusunda Console.WriteLine kullandık. Çünkü Console.Write
yöntemi imleci alt satıra geçirmez.
Yukarıda yazdığımız her iki örneğin de ekran çıktısı aşağıdaki
şekildedir.
System.String sınıfının Length diye bir özelliği vardır. Yöntem ve
alan gibi özellik de bu cümlede teknik terim olarak kullanıldı.
Özellikler de alanlar gibidir. Başka bir yazıda alanlar ve
özelliklerden bahsedeceğiz. Şimdilik sadece Length özelliğinin ne
işe yaradığını bilelim. Bir string ifadenin karakter sayısını bize
verir.
Kavgam.Length
ifadesi bize 327 sayısını verir.
C#ta stringleri çift tırnak arasına yazarız. Eğer string literalin
kendi içinde çift tırnak varsa onu nası yazabiliriz? Mesela
aşağıdaki gibi bir string literali ekranda göstermek istiyoruz.
Atalarımız boşuna söylememiş “sakla samanı, gelir zamanı” diye.
Bu tür özel karakterlerin kullanılması programlama dillerinde her
zaman problem olur. C# çözümü C ve C++ dillerinden almıştır. Bir
string literal çift tırnak içeriyorsa, çift tırnakların soluna bir
ters bölü işareti koymalıyız.
string Yazi = "Atalarımız boşuna söylelemiş \"sakla samanı, gelir
zamanı\" diye";
Bu ters bölü işareti burada kaçış karakteri olarak görev yaptı.
Kaçış karakteri sağındaki özel işaretin gerçek anlamında
kullanılmasını engeller.
Peki, ters bölü işaretinin kendisini yazı içerisinde nasıl
kullanırız? Yazı dilinde belki çok fazla kullanılmayan bir işaret
ama MS-DOS ya da Windows programlarında dizin isimlerini ayırmada
ters bölü işareti kullanılır. Bu ters bölü işaretinin çok acıklı bir
hikâyesi var. UNIX işletim sisteminde dizin isimleri normal bölü
işareti ile ayrılır, ters bölü işaretiyle değil. C dilinde de kaçış
karakteri olarak kullanılma sebebi hiçbir özel anlamı olmamasıdır.
MS-DOS 1.0 işletim sisteminde ise UNIX benzeri hiyerarşik bir dizin
yapısı olmadığından normal bölü işareti komut satırı argümanı olarak
kullanıldı.UNIX işetim sisteminde komut satırı argümanlarının
solunda çizgi vardır. MS-DOS 2.0 işletim sisteminde hiyerarşik dosya
yapısı gelince, C dilinde problem olacağı hiç akıllarına gelmedi ve
dizin isimlerini ayırmakta normal bölü işareti yerine ters bölü
işareti kullanıldı.
Bir string literal içerisinde eğer ters bölü işareti varsa yan yana
iki tane kullanırız.
string Dizin = "C:\\Makaleler\\String Makalesi\\Metin.doc";
Şimdi bunu ekrana yazdırıp çıktısına bakalım.
Artık MS-DOS ya da Windows programlarında ters bölü işareti kullanma
zorunluluğumuz yok, onun yerine normal bölü işareti de
kullanabilirsiniz.
string Dizin = "C:/Makaleler/String Makalesi/Metin.doc";
Bilgisayarın içerisinde bir string literalin karakterleri sayılarla
ve nihayetinde bitlerle saklanır. Uzun yıllar, bir çok bilgisayar
ASCII (American Standard Code for Information Interchange – Bilgi
Değişimi İçin Amerikan Kod Standardı) dediğimiz bir karakter
kodlaması kullandı. ASCII 7-bit kodlardan oluştuğu için toplam 128
(27) çeşit karakteri gösterebilir.
Eğer standart Amerikan İngilizcesi klavyesi kullanıyorsanız, Üst
Karakter Tuşuna (Shift Tuşu) bağlı olarak (harf, sayı ya da
sembollerden) 47 tane tuştan 94 tane karakter oluşturabilirsiniz.
Boşluk tuşu ayrı bir ASCII karakteri ile temsil edilir. ASCII
ayrıca, yazıda gösterilmeyen, yazının nasıl gösterileceğini kontrol
eden 33 tane kontrol karakteri sağlar. Bunlardan sadece bazıları
günümüzde kullanılıyor. Satır başı tuşu, Sonraki satıra geçme tuşu
(Bu ikisi imlecin bir sonraki satırın başına gitmesini sağlar), Geri
Al Tuşu, Tab Tuşu, ESC tuşu. Bütün ASCII karakterleri klavyeden Ctrl
tuşunu harf ve sembol kombinasyonları ile kullanarak
oluşturulabilir. Yani 128 tane ASCII kodunu klavyeden yazabiliriz.
Fonksiyon tuşları (F1,…, F12), yön tuşları ve imleç hareket tuşları
biraz farklıdır. Bunlar ASCII kodu üretmezler.
Pratikte kişisel bilgisayarlar ASCII tarafından sağlanan 128
karakteri de içeren yazı karakterlerini göstermek için 8-bit
kullanırlar. Bu 8-bit kodlamaya ise genişletilmiş ASCII karakter
kodlama seti denir.
Maalesef, genişletilmiş ASCII, tek standart değildir. Orijinal IBM
Bilgisayar çizgi çizmek ve basit matematik semboller için ek
rarakterler de kullandı. Windows ise Batı Avrupa dillerinde
kullanılan sembolleri göstermek için Latin 1 adlı bir kodlamayı da
destekler. Bir çok ülkede standart komiteleri kendi karakter
kodlamalarını oluşturdular. Tabi ki bunların içinde Latin olmayan
Arapça, İbranice, Yunanca, Kiril (Rusça) da var.
Sonuç karışıklık ve belirsizlik oldu. Eğer başka bir ülkeden ya da
Apple Machintosh gibi başka platformlardan gelen e-posta mesajları
almışsanız ve bunlarda anlamsız karakterler görmüşseniz bunların
sebebi iki değişik 8-bit karakter kodlamasıdır.
1980lerin başında bu problemlere bir çözüm bulmak için çalışmalar
yapıldı. Sonuç Unicode oldu. Unicode; Çince, Japonca ve Korece gibi
şekilsel alfabeler de dâhil, bilgisayar iletişiminde kullanılan
bütün dillerin karakterlerini gösterebilecek şekilde 65,536 (216)
tane karakter içeriyor, 16-bit kodlama kullanıyor. Unicode
karakterlerinin ilk 128 karakteri yine ASCII’nin aynısıdır. İkinci
128 tanesi ise Latin 1 karakterlerinin aynısıdır. Unicode hakkında
daha fazla bilgi http://www.unicode.org adresinde mevcuttur. Unicode
Standart Verison 3.0 adlı kitabın online sürümüne de yine bu siteden
ulaşabilirsiniz.
8-bit karakter kodlamalarının yerini 16-bit Unicode karakterlere
bırakması için uzun bir yol var. Ama bazı programlama dilleri,
mesela C#, stringleri 16-bit Unicode olarak tutuyor. Unicode ile
aşağıdaki gibi bir string ifadeyi rahatlıkla yazabilirsiniz.
Hem Yunan alfabesi hem de derece işareti ASCII karakter tablosunda
yoktur.
Yunan harflerini Yunanca klavye ile rahatlıkla yazarsınız, ama
derece işareti Yunan klavyeside yoktur. Genellikle, bir Unicode
karakteri string içerisinde kullanabilmek için karakteri Unicode
standardı sürüm 3.0 şekilde yazmak lazım ya da http://www.unicode.org/charts
adresindeki şekilde ve bir ters bölü şareti daha sonra küçük ya da
büyük harflerle U ya da X koyduktan sonra 4-basamak hex karakter
kodu yazarak gösterilir.
string Angle = "The angle \u03B1 equals 60\u00B0";
İlginçtir ama \u ve 4-basamak hex karakter kodlarını değişken
isimleri diğer belirteçlerde kullanabilirsiniz. bu konuda daha fazla
bilgi için C# Language Specification, 2.4.2 özellik dokümanına
bakabilirsiniz.
C# ayrıca C dilinden aşağıdaki kaçış durumlarını da miras almıştır.
Kaçış Karakterleri
Unicode Kodlaması
Karakter İsmi
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Örneğin aşağıdaki ifadede ekrana yazı gösterirken \a karakterine
gelince hoparlörden beep sesi çıkar ve devam eder. \a sadece
konsolda geçerlidir. \v ve \f ise sadece yazıcıda geçerlidir.
Console.WriteLine("Uyarı sinyali ver \a ve devam et.");
ASCII kodlamasının çıkış kaynağı daktiloda kullnılan karakterlerdir.
Mesela \r ve \n işlemini ancak daktilo ile anlayabiliriz. \r Satır
başı kodu, yazma kafasını satırın başına getirir. \n ise yazma
kafasını bir sonraki satıra geçirir. \n ve \r birlikte
kullanıldığında bir sonraki satırın başına gitmiş oluruz. Text
dosyalarda bu işlemler olmaz, platform uyumsuzluğu vardır. MS-DOS ve
Windows platformlarında text dosyalarda bütün satırlar satır başı ve
yeni satır kodlarıyla sonlanır. UNIX platformunda ise sadece yeni
satır koduyla sonlanır. Macintosh ortamında ise sadece satır başı
kodu satırı sonlandırır.
C# konsol programlamada, sadece yeni satır kodu bir sonraki satırın
başına geçmek için yeterlidir.
Aşağıdaki ifadelerden her ikisi de aynı işi yapar.
Console.Write("\n");
Console.WriteLine();
C# kaçış karakteri olarak ters bölü kullnmaya bir alternatif sunar.
Eğer bir string literalin önüne @ işareti koyarsak kaçış karakteri
kullanmaya gerek kalmaz.
string Dizin = @"C:\Makaleler\\String Makalesi\Metin.doc";
Buna verbatim string (harfi harfine – aynısı) de denir. Ters bölü
işareti de normal diğer karakterlerden biri olarak algılanır.
Tabi bu durumda çift tırnak için iki tane çift tırnak kullanmak
gerekiyor.
string Yazi = @"Atalarımız boşuna söylelemiş ""sakla samanı, gelir
zamanı"" diye";
Daha önce artı işaretinin string ifadeleri birleştirmek için
kullanıldığını göstermiştik. Artı işaretini string ifadeleri
sayılarla birlikte yazmak için de kullanabiliriz.
int toplamTutar = 100;
Console.WriteLine("Toplam tutar :" + toplamTutar + " YTL dir.");
Burada kural oldukça basittir. Eğer artı operandının bir tarafındaki
ifade string ise diğer tarafındaki ifade de string ifadeye
dönüştürülür ve daha sonra da string birleştirme işlemi gerçekleşir.
Aşağıdaki ilginç durumu inceleyelim.
int A = 12;
int B = 20;
Console.WriteLine(A + B + " toplamlarıdır.");
Console.WriteLine("Toplamları " + A + B);
Yukarıdaki program kodunun çıktısı aşağıdaki gibi olacaktır.
Peki neden ikisi farklı çıktı. Operatör önceliği kavramından
tamsayılar yazısında bahsetmiştik. Operatör önceliği kurallarına
göre toplama işlemlerinde öncelik soldan sağa doğrudur. İlk ifadede
soldan itibaren başlandığından önce A + B işlemi yapıldı daha sonra
da string ifadeye dönüştürülerek sonraki string ifade ile
birleştirildi. İkinci WriteLine çağrısında ise “Toplamları” string
ifadesi 12 ile birleştirildi. Daha sonra “Toplamları 12” string
literali 20 ile birleştirildi. “Toplamları 1220” ifadesi oluştu.
Bu problemi çözmek için aşağıdaki gibi bir çözüm bulabiliriz.
int A = 12;
int B = 20;
Console.WriteLine(A + B + " toplamlarıdır.");
Console.WriteLine("Toplamları " + (A + B));
Parantezlerin toplama işlemine göre önceliği olduğundan ilk önce
parantez içindeki işlem gerçekleşir ve sonuç aşağıdaki gibi olur.
Tamsayılar yazısında da ifade edildiği gibi bütün tamsayı türler
.net Framework içerisindeki yapılardan türetilir. string veri tipi
ise System.String sınıfından türetilir.
Sınıflar ve yapılar birbirlerine benzerler. Ama çok temel bir
farklılıkları var, yapılar değer tiptirler, sınıflar referans tip.
Daha fazla bilgiyi Değer Tip & Referans Tip adlı yazımızdan
öğrenebilirsiniz.
C# Dersleri
- C# Programlama Sanatı
- C# Atama İşlemleri
- C# Türlerin Tanımlanması
- C# İle İlk Program
- C# Yaz, Derle, Çalıştır
- C# Ekranda Yazı Yazdırmak
- C# Aritmetik İşlemler
- C# Yorum Cümleleri
- C# Tamsayılar
- C# String Veri Türü
- C# Değer Tip & Referans Tip
- C# Konsoldan Veri Girmek
- C# Sabitler
- C# Decimal Veri Tipi
- C# Kayar Nokta Veri Türleri
- C# Yazı Biçimlendirme
- C# Char ve String Veri Türleri
- C# While Döngüsü
- C# For ve Foreach Döngüleri
- C# İstisna ve Hata Yakalama
- C# Durumsal Operatörler
- C# Nedir?
- C# String Dönüşümleri