C# string sınıfı ve özellikleri

.Net string sınıfı uygulamalarımızda sıklıkla kullandığımız sınıflardan biridir.

.Net 1.1 versiyonundan itibaren gelişme göstermesine rağmen, hala bazı fonksiyonlarının eksik olduğunu veya tam anlamıyla kullanılmadığını düşünüyoum.

Bu makalemde, string sınıfının çok bilinmeyen veya çok kullanılmayan özelliklerine ve methodlarına değinmeye çalışacağım.

String değişkeni tekrar eden karakterler ile doldurmak

String değişkeni tekrar eden karakterler ile doldurmak için, String sınıfının constructor’ını kullanmak gerekir.

Örneğin, bir string değişkeni 50 adet nokta (.) karakteri ile doldurmak istiyorsak;

string degisken = new string(‘.’, 50);</pre>

String değişkenin boş olduğunu kontrol etmek

String değişkenin değer içerip içermediğini belirlemek için string.Empty ve boş tırnaklar (“”) ile karşılaştırmamız gerekir.

if (degisken != null && degisken != "")
{
}

Alternatif olarak bu iki karşılaştırmayı yapmak yerine, .Net 2.0 ile gelen string.IsNullOrEmpty static fonksiyonunu kullanabiliriz;

if (!string.IsNullOrEmpty(degisken))
{
}

String.Empty ve boş tırnaklar (“”) arasındaki fark

İnternette çeşitli sitelerde, string.Empty ve boş tırnaklar (“”) arasında seçim yapmak için yazılmış makalelere rastlayabilirsiniz.

Aslında yapılan onlarca test gösteriyor ki, performans açısından bakıldığında string.Empty ve boş tırnaklar (“”) arasında önemsenmeyecek kadar küçük bir fark vardır.

Yapılan testler milyarlarca string değişken üzerinde yapılmasına rağmen ortaya çıkan fark göz ardı edilebilecek kadar düşük seviyededir.

String değişkenin içeriğini ters çevirmek

Bir string değişkenin içeriğini ters çevirmek için çeşitli algoritmalara internet üzerinden ulaşabilir veya kendi algoritmanızı geliştirebilirsiniz.

Kodun temizliği, hız, Unicode karakter setleri ile sorunsuz çalışabilmesi açısından benim en çok kullandığım yöntem şudur;

public static string Reverse(this string s)
{
    char[] charArray = s.ToCharArray();
    Array.Reverse(charArray);
    return new string(charArray);
}

String karşılaştırma

String değişkenin değeri null olabileceği için, karşılaştırma operatörünü (==) kullanmaktan kaçınmamız gerekir.

Bunun yerine String sınıfının static Compare method’unu kullanmamız daha doğrudur.

Static Compare method’u sayesinde null referans’ları doğru şekilde karşılaştırabilir, büyük-küçük harf duyarlılığını yoksayabilir, farklı Culture’daki değerleri karşılaştırabiliriz.

if (String.Compare(degisken1, degisken2, true) == 0)
{
}

Büyük-Küçük harf duyarlılığı olmayan IndexOf

String sınıfının IndexOf method’u büyük-küçük harf duyarlıdır. Büyük-Küçük harf duyarlılığı olmadan IndexOf method’unu kullanmak istiyorsak, System.Globalization namespace’inde yeralan CompareInfo sınıfı’nın IndexOf method’unu kullanabiliriz;

using System.Globalization;

string degisken1 = "Uygulamalarımızın olmazsa olmaz unsurları değişkenlerdir";
string degisken2 = "OLMAZ";

CompareInfo karsilastirma = CultureInfo.InvariantCulture.CompareInfo;
int i = karsilastirma.IndexOf(degisken1, degisken2, CompareOptions.IgnoreCase);


**string ve String farkı**

MSDN'deki String sınıfı ile alakalı bir sayfadan alıntı;

*"The keyword string is simply an alias for the predefined class System.String." – C# Language Specification 4.2.3*

Türkçesi;

*"string anahtar kelimesi basitçe, System.String sınıfının takma adıdır." – C# Language Specification 4.2.3*

Euler - 4

Euler serisinin dördüncü yazısında, Project Euler’in 4. sorusunu çözeceğiz;

*Orijinal soru; *A palindromic number reads the same both ways. The largest palindrome made from the product of two 2-digit numbers is 9009 = 91 99. Find the largest palindrome made from the product of two 3-digit numbers.

*Türkçesi; *Palindromik sayı, düz ve tersten aynı şekilde okunan sayıdır. 2 haneli rakamlar ile oluşturulabilecek en büyük palindromik sayı 9009’dur (91 ve 99 kullanılarak) 3 haneli rakamlar ile oluşturulabilecek en büyük palindromik sayıyı bulunuz.

Önce siz çözmeyi deneyin, çözemezseniz ;

using System; using System.Linq; using System.Collections.Generic;

class Program { static void Main(string[] args) { var Palindromlar = from x in Enumerable.Range(100, 900) from y in Enumerable.Range(100, 900) let carpim = x * y let carpim_duz = carpim.ToString() let carpim_ters = new string(carpim_duz.Reverse().ToArray()) where carpim_duz == carpim_ters select carpim;

    Console.WriteLine("En Büyük Palindrom: {0}", Palindromlar.Max());

    Console.ReadLine();
} }

C# Bir Windows Service'in Durumunu Belirlemek

Bir Windows Service‘ine bağımlı uygulama geliştirdiğiniz zaman, ilgili Windows Service‘in durumunu belirlemek kritik öneme sahip oluyor. Service, uygulamamızı destekleyen, kendi geliştirdiğimiz bir service olabileceği gibi, Windows ile birlikte gelen service’lerden biri de olabilir.

ServiceController Sınıfı

ServiceController sınıfı, System.ServiceProcess namespace’inde yer alır. Lokal makinadaki veya Uzak makinadaki bir windows service‘ini temsil eder, ilgili service’in sorgulanmasına ve çeşitli özelliklerinin değiştirilmesine izin verir.

ServiceController Sınıfının Kullanımı

ServiceController sınıfını projelerimizde kullanabilmek için, projemize System.ServiceProcess.dll dosyasını referans olarak eklemeliyiz.

Daha sonra, kodumuzun using kısmına System.ServiceProcess eklemeliyiz;

using System.ServiceProcess;</pre>

Lokal makinadaki bir service’in durumunu belirleme Lokal makinadaki bir service’in durumunu belirlemek için, öncelikle ServiceController sınıfından yeni bir örnek oluşturmamız lazım.

Sordulamak istediğimiz windows servis’i ile değişkenimizi ilişkilendirmek için kullanabileceğimiz üç yöntem var.

  • ServiceName özelliği
  • DisplayName özelliği
  • ServiceController constructor‘ı

Örnek olarak Print Spooler servisini sorgulamak için;

ServiceController ServiceByServiceName = new ServiceController();
ServiceByServiceName.ServiceName = "Spooler";

ServiceController ServiceByDisplayName = new ServiceController();
ServiceByDisplayName.DisplayName = "Print Spooler";

ServiceController ServiceByConstructor = new ServiceController("Spooler");

Yukarıdaki kodda görebileceğiniz gibi ServiceController sınıfımızı tanımladıktan sonra, Status özelliğini kullanarak, servis’in durum bilgisini sorgulayabiliriz.

Status özelliği ServiceControllerStatus enum tipinde değer döndürür;

  • **ContinuePending: **Servis durdurulmuş ve başlatılıyor
  • **Paused: **Servis durdurulmuş
  • **PausePending: **Servis durduruluyor
  • **Running: **Servis çalışıyor
  • **StartPending: **Servis başlatılıyor
  • **Stopped: **Servis çalışmıyor
  • **StopPending: **Servis durduruluyor

Servis’in çalıştığı durumu kontrol etmek için kodumuzu aşağıdaki gibi yazabiliriz;

ServiceController sc = new ServiceController("Spooler");

if (sc.Status == ServiceControllerStatus.Running)
{
    MessageBox.Show("Servis çalışıyor");
}

Not: Servis durumunu sorgulayan uygulamayı çalıştıran kullanıcının yeterli yetkisi bulunmalıdır. Aksi taktirde bir hata fırlatılacaktır.

Uzak makinadaki bir service’in durumunu belirleme

Uzak makinadaki bir service’in durumunu belirleme, lokal makinadaki service’in durumunu belirlemek kadar kolaydır. Tek yapmamız gereken MachineName özelliğine uzak makinanın adresini girmek.

Uzak makinadaki Print Spooler servisini sorgulamak istediğimizde;

ServiceController sc = new ServiceController("Spooler", "UzakSunucu");

if (sc.Status == ServiceControllerStatus.Running)
{
    MessageBox.Show("Servis çalışıyor");
}


Euler - 3

Euler serisinin üçüncü yazısında, Project Euler’in 3. sorusunu çözeceğiz;

Orijinal soru; The prime factors of 13195 are 5, 7, 13 and 29. What is the largest prime factor of the number 600851475143 ?

Türkçesi; 13195 rakamının asal çarpanları 5, 7, 13 ve 29’dur. 600851475143 rakamının en büyük asal çarpanı kaçtır?

Önce siz çözmeyi deneyin, çözemezseniz

using System; using System.Linq; using System.Collections.Generic;

class Program { static long EnBuyukBolen = 0;

static bool BolenleriBul(long Rakam)
{
    for (int iLoop = 2; iLoop < = int.MaxValue; iLoop++)
    {
        if (Rakam % iLoop == 0)
        {
            if (iLoop > EnBuyukBolen)
                EnBuyukBolen = iLoop;

            if (Rakam / iLoop == 1)
                return true;

            if (BolenleriBul(Rakam / iLoop))
                return true;
        }
    }
    return false;
}

static void Main(string[] args)
{
    BolenleriBul(600851475143);

    Console.WriteLine(EnBuyukBolen);

    Console.ReadLine();
} }

Kısa Sınav - 16

Windows Forms uygulaması geliştiriyorsunuz, uygulamanın final versiyonunun performansından memnun değilsiniz.

Öngörülerinize göre performans problemi kötü hafıza kullanımı kaynaklı.

Sorunlu kodu tespit etmek ve hafıza kaçaklarını düzeltmek istiyorsunuz.

Aşağıdaki araçlardan hangisini tercih etmelisiniz?

  • CLR Profiler
  • Event Viewer
  • Application Center Test Tool
  • Perfmon.exe

Sorunun doğru cevabı için;

Doğru cevap CLR Profiler olmalı.

CLR Profiler sayesinde, uygulamanızın Managed Heap kullanımını izleyebilir, Garbage Collector‘ün davranış biçimini gözlemleyebilirsiniz.

Event Viewer sayesinde, Windows’un Event Log‘una bakabilirsiniz.

Application Center Test Tool sayesinde, Web uygulamanıza stress testi yapabilir, performans ve ölçeklenebilirlik problemlerini tespit edebilirsiniz.

Perfmon.exe sayesinde, Performance Counter‘ları takip edebilir, bilgisayarın belirli anahtar kriterler için zaman içindeki değişimlerini gözleyebilirsiniz.

Engin Polat hakkında

Senior Software Engineer, @Microsoft

Ada ve Ege'nin babası ;)

Kategoriler

İstatistik

Makale Adedi: 484

Creative Commons Lisansı