Ana Sayfa

Bilgisayar Eğitim CD

Bilgisayar Kitapları

 
 
Adım Adım Web Eğitim Seti Adobe Flash Eğitim Seti


C# Char ve String Veri Türleri

Char ve String Veri Türleri

C programlama dilinde string adında bir veri türü yoktur. C dili string veri türü yerine char adında bir veri türüne sahiptir. char veri türü ile meselâ B, x veya * gibi tek karakter ifade edilir. Eğer bir yazıyı değişkende saklamak gerekirse char türünden bir dizi oluşturmak gerekir. Karakterlerin bir dizisi olarak yazı ifade edilir.

C# programlama dilinde de char veri türü vardır ( .net Framework içerisindeki String.Char yapısının bir aliası olarak ). Fakat C dilindeki char ile C# dilindeki char arasındaki benzerlik sadece isim benzerliğidir. İşlevleri ve yapıları farklıdır. C# dilinde bir karakter dizisini string ifadeye, string ifadeyi de karakter dizisine dönüştürmek mümkündür; fakat “string veri türü yalnızca bir karakter dizisidir” demek doğru değil, çünkü string kendi başına bir veri türüdür.

Diğer bir farklılık: Tüm programlama dilleri karakterleri temsil etmek için sayıları kullanırlar, fakat C dilinde char veri tipi int, long ve short gibi nümerik bir veri tipidir. Ayrıca C dilinde karakter türü değişkenleri, signed char (işaretli karakter) veya unsigned char (işaretsiz karakter) olarak bildirebiliriz.

C dilinde char türündeki veri 8 bit uzunluğunda ve bir ASCII karakteri temsil etmektedir. C# dilinde ise char türündeki veri 16 bit uzunluğunda ve Unicode karakteri temsil etmektedir.

C# dilinde karakterleri ve sayıları birbirine karşılıklı dönüştürebilmenize rağmen char veri tipindeki değerler sayı değildir.

Unicode karakterler ve nümerik karşılıklarını şu adreste görebilirsiniz: http://www.unicode.org /charts

srting bir ifade, çift tırnaklar arasında yazılır, 0 ya da daha fazla karakterden oluşur. Tek bir karakteri ise tek tırnak arasında yazmak gerekir. Aşağıdaki örnekte char türü bir değişken tanımlaması yapılmıştır ve tanımlanırken de ilk değer ataması yapılmıştır.

char ch = 'Z';

C# dilinde karakterden nümerik tiplere dönüştürme işlemini casting yaparak gerçekleştirebilirsiniz.

int i=10;
i = (int) '7';

i değişkeninin yeni değeri 7 değil de 55 olur. Niçin böyle oldu? 7 karakterinin ASCII ve Unicode karşılığı 55 olduğu için casting işlemi sonucu i değişkeni 55 değerini aldı.

Şimdi de casting yaparak bir karakterin ascii değerini ifade eden tamsayıyı karakter türü bir değişkene atayalım.

char ch = ‘y’;
ch = (char) 97;

ch değişkeninin değeri ‘a’ harfi olacaktır. Çünkü a harfinin ascii ve Unicode karşılığı 97’dir.

Eğer, aritmetik işlemde sayı ve karakteri yan yana kullanırsak kapalı dönüşüm de kendiliğinden yapılır.

İnt i;
i = 'a' + 5;

Yukarıdaki işlemin sonucu da 102 olacaktır, çünkü a karakterinin ASCII ve Unicode karşılığı 97 dir. Dolayısıyla C#, karakteri kapalı dönüşüme tabi tutacaktır.

Yine aynı şekilde bir karakter ile bir string ifade birleştirme işlemine tabi tutulursa, karakter kapalı dönüşüm ile string ifadeye dönüşecektir.

string str;
str = "a" + 'b'

Yukarıdaki işlemin sonucu “ab” string ifadesi olacaktır.

Fakat aşağıdaki işlem sonucunda 195 sayısal ifadesi çıkar.

i = 'a' + 'b';

String sınıfının .net framework içerisindeki bir diğer özelliği de Chars özelliğidir. Bu özellik, C# dilindeki String sınıfında indeksleyici olarak temsil edilir. Bunun anlamı, C# dili içerisinde Chars adında bir özellik yoktur fakat dizilerde indislerle dizi elemanlarına ulaşmaya yarayan indeksleyiciler gibi string ifadeyi oluşturan karakterlere ulaşmaya yarayan bir indeksleyici vardır. Bu indeksleyici .net framework içerisinde tanımlı olan Chars özelliğine karşılık gelir.

Örneğin bir string ifade yazalım:

string str = "Csharp Öğreniyorum";

String türündeki str değişkenimizin karakterlerine teker teker indeksleyicilerle ulaşalım.

ch = str[0];

ch değişkenini ekrana yazdırdığımızda ilk harf olan ‘C’ karakterini göreceğiz. Yine aynı şekilde:

ch = str[18];

Şimdi ise ch değişkenimiz ‘m’ harfini içermektedir. Örneğimize göre 0 dan küçük ve 18 den büyük değerler çalışma zamanında hata verecektir. Şu şekilde indeksleyici için yapılan atama işlemi hatalı olacaktır.

str[0] = 'H'; // Derleme hatası..

String veri türü için olan indeksleyici sadece okunabilirdir, string ifadenin bir karakterini değiştirmek için onu kullanamazsınız. C# dilinde string değişkenler aslında değiştrilemez durumdadırlar denilebilir. Çünkü bir takım yöntemler yardımıyla sizin yaptığınız değişikliklerle birlikte yeni bir string ifade oluşur ve sizin değişkeninize atanır.

Bir string literal için de değişkene atamaksızın indeksleyici kullanabilirsiniz.

Char ch = “Csharpturk” [2];

Karakterler arasında döngü yapmak isterseniz şu tür bir ifade kullanabilirsiniz:

(char) ((int) 'A' + i)

Önce A harfinin Unicode değeri olan 65 ifadesi casting yapılarak tamsayıya dönüştü, sonra üzerine i ilave edildi, daha sonra da çıkan ifade karaktere casting yapılarak dönüştürüldü.

String ifadelerden bir dizi de oluşturabilirsiniz. Aşağıdaki örneği inceleyiniz.

string[] astr = { "Golf", "Audi", "Mercedes" };

astr[1] ifadesi bize “Audi” soncunu verecektir. Ayrıca string indeksleme ile astr[1][2] ifadesi ile ikici elemanın üçüncü harfi olan ‘d’ ye ulaşabiliriz. Burada indeksleme ile Length özelliğinin kullanımını karıştırmamalıyız. astr.Length() ifadesi 3 sonucunu verecektir. astr[1].Length ifadesi de 4 sonucunu vercektir çünkü “Audi” kelimesi uzunluğu dört karakterdir.

Bir int ifadeyi parametresiz yapıcı ile tanımlayabilirsiniz.

int i = new int();

Yukarıdaki ifade parametresiz bir yapıcı olduğu için hatasızdır. Ama aşağıda gördüğünüz string yapıcısı hatalıdır.

string str = new string(); // çalışmayacaktır.

Bunun sebebi, String sınıfı parametresiz yapıcıyı desteklememektedir. Değişken alan birkaç yapı var ve bu yapılar sayesinde karakterlerden string değişkenler oluşturabilirsiniz.

String bir değişkenin karakterler dizisine dönüştürülmesini inceleyelim. Karakterler dizisini string’ e dönüştürmek için kullanacağımız string yapıcı ifadesi aşağıdaki şekilde olacaktır.

char[] ach = { 'm', 'e', 'r', 'h', 'a', 'b', 'a' };
string str = new string(ach);

String sınıfı içerisinde, string değişkeni karakterler dizisi haline getiren bir yöntem yer almaktadır.

char[] ach2 = str.ToCharArray();

String türü bir değişken kullanmadan da bir yazıyı karakter dizisine dönüştürebiliriz.

char[] ach = "merhaba".ToCharArray();

Diyelim ki 21 tane ‘@’ sembolünden oluşan bir string değişken tanımlayacaksınız. Dikkatli bir sayım ile aşağıdaki gibi yapmanız gerekiyor.

string str = "@@@@@@@@@@@@@@@@@@@@@";

Aşağıdaki yöntem ise çok daha kolaydır.

string str = new string('@', 21);

Yapıcıların diğer bir avantajı da ikinci parametrenin değişken olarak tanımlanabilmesidir. Aşağıdaki örnek programı inceleyelim:

// ------------------------------------------------------
// PCWorld.cs PCWorld dergisi içerik sayfası örneği.
// ------------------------------------------------------
using System;

class Icindekiler
{
    
static string[] bolumler = { "Teknoloji",
                
"Donanım", "Yazılım",
                
"İnternet", "Oyunlar" };
    
static int[] sayfaNo = { 3, 10, 16, 24, 29 };

    
static void Main()
    {
        Sat\u305 ?r(0);
        Sat\u305 ?r(1);
        Sat\u305 ?r(2);
        Sat\u305 ?r(3);
        Sat\u305 ?r(4);
    }
    
static void Sat\u305 ?r(int i)
    {
        
const int genislik = 60;
        
string noktalar = new string('.',
            genislik - (i + 1).ToString().Length
                   - bolumler[i].Length
                   - sayfaNo[i].ToString().Length);

        
Console.WriteLine("{0}. {1}{2}{3}",
            i + 1, bolumler[i], noktalar, sayfaNo[i]);
    }
}

Programı çalıştırdığınızda içerik bilgileri ekranda üç kolon halinde görüntülenecektir. 5 bölümün adları, 5 bölümün sayfa numaraları ve ihtiyaç miktarınca noktalar. Buradaki nokta sayısının nasıl belirlendiğine dikkat etmeliyiz. İlk parametre periyot karakteridir. İkinci parametreyi ise gerekli toplam genişlik ile bölüm numaralarının karakter sayısının farkı ile elde ediyoruz. Ekran çıktısı aşağıdadır.

Ekran çıktısı

Satır metodu, ekrana yazılacak verilerin formatlanmasını ve yazdırılmasını sağlıyor. Sıfır tabanlı parametre ise bölüm numarası iki dizinin indeksini belirtmekte. Main yöntemi ile Satır metoduna gönderilen indeks ile yazdırma işlemi gerçekleştiriliyor.

Karakter ve string ifadeler insanların haberleşmesinin bir parçası gibidir. Char yapısı ve String sınıfı birçok metoda sahiptir, bunların içinden önemli diyebileceğimiz bazı yöntemleri inceleyelim.

Char yapısı içerisinde bazı static yöntemler Boolean türünde değer döndürerek karakterin kategorisine ulaşmamızı sağlar, Meselâ:

Char.IsDigit(ch)

Eğer dönen değer true ise ‘ch‘ değişkeni ‘0’ dan ‘9’ a kadar bir değerdir. Ayrıca belirli bir karakterin kategorisini de tespit edebiliriz:

Char.IsDigit(str, i)

Eğer dönen değer true ise string str[i] karakteri ‘0’ dan ‘9’ a kadar bir değerdir. IsDigit metodunun dışında IsLetter, IsLetterOrDigit, IsLower (küçük harf için), IsUpper, IsNumber , IsPunctuation, IsWhiteSpace gibi benzer metodlar da bulunmaktadır.

String değişkenini değiştiremezsiniz ancak yeni bir string oluşturup eskisini yerine koyarsınız. Bunun için String sınıfı içersinde birkaç yöntem yer almaktadır.

Meselâ string değişkeninizin tüm harflerini küçük karakterlerden oluşmasını istiyorsanız aşağıdaki yöntemi kullanabilirsiniz.

string str2 = str.ToLower();

ToLower yöntemi, var olan eski string ifadenin harflerini küçük karakterlere çevirir ve str2 içerisine atadığımız yeni bir string döndürür. Ayrıca orijinal değişkenin üstüne de yazdırabilirsiniz:

str = str.ToLower();

Bu kullanım da çalışacaktır. Orijinal string yerine yeni oluşturulan değer yazıldı.

Substring metodu da String sınıfının önemli yöntemlerindendir. Bu yöntem ile bir string’in belirli bir parçasını elde edebiliriz.

string str2 = str.SubString(BaşlangıçIndeksi, KarakterSayısı);

Meselâ str içerisinde “csharpturk” ifadesi olsun:

str.SubString(6, 4)

elde edilen string parçası “turk” ifadesidir.

Ayrıca string içeris,nde büyük küçük harf duyarlı aramalar yapabilirsiniz. AnyIndexOf metodu ile string içerisinde karakter kümesi arayabilirsiniz. Bunun yanında LastIndexOf ve LastIndexOfAny metodları ile de son karaktere ulaşabilirsiniz.

String sınıfının içerisinde iki farklı string’i karşılaştırmanızı sağlayan yöntemler bulunuyor. Bunlardan bazıları durağan diğerleri de türemiş yöntemlerdir. Bazıları bool türünde değer döndürürken bazıları int türünde değer döndürebilir. Bu yöntemleri aşağıdaki tabloda inceleyebilirsiniz.

Yöntem

Durağan / Türemiş

Dönen Değer

Karşılaştırma Türü

Equals

Her ikisi de

bool

Nümerik (Karakter Duyarlı)

Compare

Durağan

int

Metinsel (Seçimlik, Karakter Duyarsız)

CompareTo

Türemiş

int

Metinsel (Karakter Duyarsız)

CompareOrdinal

Durağan

int

Nümerik

Geri dönüş değer tipi int olan yöntemler string ifadeleri sıralamada çok faydalı olacaktır. Meselâ, aşağıdaki ifade basit bir karşılaştırma işini yapıyor.

i = String.Compare(str1, str2);

int tipindeki dönüş değeri:

  • str1 < str2 ise negatif

  • str1 = str2 ise sıfır

  • str1 > str2 ise pozitif değer alır.

Nasıl oluyor da iki string karşılaştırıldığında biri diğerinden büyük yada küçük olabiliyor ? Nümerik karşılaştırma nümerik karakter kodlarının sırasına bağlıdır. Bir örnek ile nümerik sıralamanın nasıl yapıldığını inceleyelim:

D < E < F < d < e < f < È < É < Ê < Ë < è < é < ê < ë

Eğer string’leri alfabetik olarak sıralamak istiyorsanız bu örnek işinize yaramayacak. Bunun için şu karşılaştırma kullanılmalıdır:

d < D < e < E < é < É < è < È < ê < Ê < ë < Ë < f < F

Dikkat ettiyseniz büyük küçük harf duyarlı olarak sıralama yapılıyor. Örneğin “Yeni Araba” string ifadesi “yeni Araba” dan küçüktür.Eğer iki string’in karakter sayısı eşit ise küçük harfle başlayan string diğerinden küçüktür.Örneğin “the” string’i “The” string ifadesinden küçüktür. Buna karşın “Them” ifadesi “then.” ifadesinden küçüktür.

Karşılaştırma işlemi için büyük küçük harf duyarlılığını eklemeyebilirsiniz:

i = String.Compare(str1, str2, true);

Buradaki üçüncü değer duyarlılık özelliğini aktif hale getirmektedir.

String sınıfı içerisindeki bir diğer yöntem ise String.Format yöntemidir. Bildiğiniz gibi bu yöntem ile string ifadelerin istenilen biçimde yazdırılmasını sağlayabiliriz. İlk değer değişken için yer tutucu özelliğini yapılandırmamızı sağlar. Console.Writeline biçimlendirme yapısı ile benzerdir.

str = String.Format("{0} + {1} = {2}", A, B, A + B);