C# & VB.NET’te String veri türü

Birçoğumuz için sadece bir veri türü olmakla sınırlı “string” tipini için özel bir başlık altında işlemek ilginç gelmiş olabilir. Bu başlığın amacı okuyucuda bir merak uyandırmak yerine programlarımızda en çok kullandığımız “string” veri türünün diğer veri türlerinden farklı bir konuma sahip olduğunu anlatmaktır. Özellikle string tabanlı ekleme, kesme, değişim, öteleme gibi işlemlerde string veri türünün karakterini bilmekte fayda vardır.
Bilindiği gibi .NET platformunda iki tür veri tipi kullanılabilir; değer veri türleri(value data type) ve referans veri türleri(reference data type). Bu iki veri türünü birbirinden ayıran özellik, değer türlerin sabit uzunluklu olduğu ve memory’nin stack alanı üzerinde depolanmaları, referans türlerinin de genellikle değişken büyüklüğe sahip olmaları ve kendilerinin memory’nin heap alanı, referanslarının ise stack üzerinde depolanmalarıdır. int, datetime, decimal gibi tipler, değer türü, class, array gibi nesne tabanlı tipler de referans türü olarak örneklendirilebilir. Bir çok yazılımcı tarafından string veri tipi de değer türüymüş gibi algılanmaktadır. Oysa string veri tipi, birçok yerde değer türleri gibi davransa da doğası itibariyle referans türü yapısını taşır ki bu tür veri tiplerine immutable type(sabit, değişmez türler) deniler.
String türünde bir değişken tanımladığımızda aslında arka tarafta System.String sınıfından bir örneklendirme yapmış oluruz. Nitekim string değişkenleri üzerinde uyguladığımız metod veya property’ler de bu sınıfın içindeki static üyelerdir. Böylece gerçek anlamda bu sınıftan bir instance yaratmamıza gerek kalmadan o üyeleri kullanabiliyoruz.
String tipinin, immutable yapılı bir tür olduğunu söyledik. Bu veri türleri, bir kere tanımlandıktan sonra değerleri, konumları bir daha değişmez. Yani string türünde bir değişken tanımladıktan sonra değişkenin aynı memory üzerinde konumundaki değerini değiştiremeyiz. Peki string işlemlerinde nasıl ekleme, çıkarma, değiştirme yapabiliyoruz. Aslında biz aynı değişken üzerinde yaptığımızı sanıyoruz oysa arka tarafta bu değişken yeni bir değişken olarak memory’nin farklı bir alanına kayıt edilir ve bundan sonra string değişkenimiz, yeni konumundan hizmet vermeye başlar. Aşağıdaki kodu inceleyelim;

Dim Str As String = "Merhaba Dünya !"
Str.Replace("Merhaba", "Selam")
string Str = "Merhaba Dünya !";
Str.Replace("Merhaba","Selam");

Bu işlemin sonucunda Str değişkenin değerinin replace olmasını bekleriz. Oysa işlemin sonucunda Str değişkeninin değerini okuduğumuzda yine aynı şekilde “Merhaba Dünya!” mesajı dönecektir. Şimdi kodumuzu aşağıdaki gibi düzenleyelim;

Dim Str As String = "Merhaba Dünya !"
Str = Str.Replace("Merhaba", "Selam")
string Str = "Merhaba Dünya !";
Str = Str.Replace("Merhaba","Selam");

Bu işlemin sonucunda Str değişkenini ekrana yazdırdığımızda “Selam Dünya !” mesajı döner. Burada yapılan işlem Str’nin kendisi üzerinde güncelleme yapmak değildir. Str değişkeninde tutulan değer alınır üzerine Replace uygulanır, çıkan sonuç heap üzerinde yeni bir alana kopyalanır ve Str’nin bundan sonra bu yeni konumdaki değere işaret etmesi sağlanır. Bu mantıktan dolayı string değişkenleri üzerinde her güncelleme memory üzerinde kirlilik yaratır ve performans kaybı yaşatır. Bu sorunu aşmak için .NET Framework, string işlemlerdeki bu sorunu aşmak için alternatif olarak mutable(değiştirilebilir) niteliğine sahip System.Text.StringBuilder sınıfının kullanılmasını tavsiye eder.
String denilen veri, temelde char veri tipindeki karakterlerin dizilişidir. Bu yönüyle bir çeşit karakter dizisi olarak tanımlanabilir. Char veri tipi, değer türü olup 0×0000 ile 0xFFFF hexadecimal aralığında bulunan unicode karakterlerden birini taşır. String değerini bir dizi gibi düşündüğümüzde her elemanı bu char karakterlerden birinde denk gelir. Bu yönüyle string sınıfının indexerini kullanarak istediğimiz elemanına erişebiliriz;

Dim Str As String = "Merhaba Dünya"
Dim Chr As Char = Str(1)
Console.WriteLine(Chr)
string Str = "Merhaba Dünya !";
char Chr = Str[1];
Console.WriteLine(Chr);

ifadesinin sonucunda “e” karakteri, ekrana yazdırılır. Buna karşılık Str(1)=”e” / Str[1] = “e” şeklinde string içerisindeki bir karakteri dışardan set edemeyiz. Çünkü string sınıfının indexer property’si read-only özelliğine sahiptir.
String ile char arasındaki bir diğer ilişki de string sınıfının ilgili constructörünü kullanarak ardışıl char elemanlarından string oluşturabiliyor olmamızdır. Yani string’in constructörü, char tipinde bir diziyi parametre olarak alabilir.

Dim ChrArr As Char() = New Char(4) {"D", "ü", "n", "y", "a"}
Dim Str As String = New String(ChrArr)
Console.WriteLine(Str) 'Dünya değeri döner
char[] ChrArr = new char[5] { 'D', 'ü', 'n', 'y', 'a' };
string Str = new string(ChrArr);
Console.WriteLine(Str);//Dünya değeri döner

String veri türüyle ilgili diğer konu da escape character olarak tanımlanan karakter listesinin destekleniyor olmasıdır. Bu simgeler, karakterlerin asıl anlam ve amaçlarını yitirmelerini, kod parçacığı olarak normal karakter olarak algılanmasını sağlar. C# tarafında 0(Null),\b(Backspace),\t(Tab) . . . VB.NET tarafında Chr(&H0)(Null),Chr(&H8)(Backspace),Chr(&H9)(Tab) . . . gibi ifadeler kullanılır.
.NET Framework, string işlemleri için geniş bir metod listesi sunar. Clone, CompareTo, CopyTo, EndsWith, Remove, Replace . . . metodlarla ilgili açıklamaları diğer metodları MSDN’de bulunabilir.

C# & VB.NET’te String veri türü” üzerine bir düşünce

  1. Birgül

    Hocam,Google’da fazla arama yaptım farklı öneriler buldum. bir metin içindeki html kodlarını nasıl temizleyebiliriz.

    Cevapla
  2. Ahmet Kaymaz Yazar

    En basit haliyle şu şekilde bir fonksiyon yazılabilir;
    string htmlTagTemizle(string str)
    {
    return Regex.Replace(str, @"< (.|\n)*?>", string.Empty);
    }
    Bu yordamı aşağıdaki gibi çağırdığımızda C# günlüğü için tıklayınız ifadesi dönecektir.htmlTagTemizle("C# günlüğü için tıklayınız
    ")

    Cevapla

Bir cevap yazın

E-posta hesabınız yayımlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir

Time limit is exhausted. Please reload CAPTCHA.