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

C#, VB.NET, ASP.NET Add comments

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.

4 Responses to “C# & VB.NET’te String veri türü”

  1. Birgül Says:

    Hocam,

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

  2. Ahmet Kaymaz Says:

    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("<a href='http://www.ahmetkaymaz.com'>C# günlüÄŸü<b> için tıklayınız</b></a></br>")

  3. emre Says:

    çok yararlandım
    teşekkürler

  4. yasarunal Says:

    Hocam bu hizmetinizden dolayı teşekkür ederiz.

Leave a Reply


− 2 = 7

WP Theme & Icons by N.Design Studio
Entries RSS Comments RSS GiriÅŸ