İlkay İlknur

just a developer...

C# 6.0 String Interpolation

Bu makaleye Github üzerinden katkıda bulunabilirsiniz.

C# 6.0'ın en önde gelen teması bizim kod yazmamızı kolaylaştırmak ve mümkün olduğu kadar az hata yapmamızı sağlamak. nameof operatorü, ?. null propogation operatorü gibi yenilikleri hep bu belirlenen temanın birer ürünü olarak düşünebiliriz.

C# 6.0 içerisinde bizim kod yazmamızı kolaylaştıran en önemli yeniliklerden biri de string interpolation özelliği. String interpolationla beraber string içerisinde belirli yerlere istediğimiz değerleri çok daha kolay ve hata yapma olasılığımız daha az olacak şekilde yazabiliyoruz.

Örneğin aşağıdaki gibi bir kod olduğunu düşünelim.

class Program
{
    static void Main(string[] args)
    {
        int id = 12;
        string name = "Mahmut";
        string summary = string.Format("Musteri adi:{0},Musteri Id:{1}", name, id);
    }
}

C# 6.0 öncesinde yukarıda gördüğümüz şekilde bir string içerisindeki belirli alanlara string.format metodunu kullanarak istediğimiz değerleri basabiliyorduk. Buradaki en önemli sıkıntılardan biri değer basacağımız alanları numara ile belirlememiz. Yani eğer ileride bu string üzerinde bir değişiklik yapmamız gerekirse manuel bir şekilde string içerisine yeni bir alan ekleyeceğiz. Belki bundan sonra bazı alanları da string içerisinden kaldıracağız. Tabi insanlık hali bunları yaparken hata yapma olasılığımız da var. Tüm bu işlemler sonucunda belki aşağıdaki gibi hatalı bir kod yazma olasılığımız da yüksek.

class Program
{
    static void Main(string[] args)
    {
        int id = 12;
        string name = "Mahmut";
        string surname = "Gates";
        string summary = string.Format("Musteri adi:{0},Musteri Soyadı:{2}", name, surname);
    }
}

Sanıyorum ki çoğunuz hatayı zaten hemen farketmişsinizdir :) Ancak böyle bir durumla karşılaştığımızda bu hatayı maalesef derleme zamanında yakalamamız imkansız. İşte string interpolation bizim bu hatalara düşmemizi bir nebze olsun azaltıyor. Peki gelelim string interpolation'ı nasıl kullanacağımıza.

Öncelikle string interpolation özelliğini kullanacağımız string'in başına $ işareti koymamız gerekiyor. $ işareti koyduğumuzu anlayan compiler ve IDE yazdığımız string içerisinde bize gerekli olacak olan intellisense'i de sağlıyor.

String interpolationda daha önce string format içerisinde numara ile sıraladığımız alanlara artık doğrudan yazacağımız değerin kendisini yazıyoruz. Yani aşağıdaki 2 kullanım da aslında aynı çıktıyı veriyor.

string name = "Mahmut";
string surname = "Gates";
string summary = string.Format("Musteri adi:{0},Musteri Soyadı:{1}", name, surname);
string summary2 = $"Musteri adi:{name},Musteri Soyadı:{surname}";

Aynı zamanda çeşitli formatlamaları da aynı string.format içerisinde kullandığımız gibi string interpolation içerisinde de kullanmamız mümkün.

class Program
{
    static void Main(string[] args)
    {
        double d = 10.3123113;
        string s = $"Value is {d:00.00}";
    }
}

Arka Planda Neler Oluyor ?

String interpolation özelliği aslında derleme zamanı çalışan bir özellik. Yani kodunuzun derlenmesi sırasında compiler sizin string interpolation kullandığınız yeri algılayıp oradaki kodu string.formatlı versiyona çeviriyor. Örnek olarak yukarıda yazdığımız kodu derleyip ILSpy ile açarsak aşağıdaki gibi bir kodla karşılaşıyoruz.

namespace ConsoleApplication2
{
    internal class Program
    {
        private static void Main(string[] args)
        {
            string arg = "Mahmut";
            string arg2 = "Gates";
            string text = string.Format("Musteri adi:{0},Musteri Soyadı:{1}", arg, arg2);
        }
    }
}

Gördüğünüz gibi derleme zamanında string interpolation kullandığımız bölüm compiler tarafından değiştirilerek string.formatlı hale çevrildi.

string.format vs string interpolation

String interpolationı şu ana kadar hep string.format ile karşılaştırdık. Peki string.format kullanımını tamamen bırakıyor muyuz diye aklınıza bir soru gelebilir. String.Format'ın en önemli kullanım alanlarından biri de localization senaryoları. string interpolation içerisinde şu anda localization mekanizmasını sağlayacak bir yapı bulunmuyor. Yani eğer localize içeriklerinizi C# dosyası dışında bir yerde(resource file vs..) saklıyorsanız string interpolation özelliğini kullanmanız şu an için mümkün değil. Burada yine string.format ile ilerlemek gerekiyor.

String interpolationı kullanırken dikkat etmemiz gereken notalardan biri de string interpolationın Culture olarak CurrentCulture'ı kullanması. Eğer Invariant Culture kullanmak isterseniz küçük bir helper metot yazıp ilerleyebilirsiniz.

class Program
{
    static void Main(string[] args)
    {
        string name = "Mahmut";
        string surname = "Gates";
        string summary2 = ToInvariant($"Musteri adi:{name},Musteri Soyadı:{surname}");
    }

    static string ToInvariant(FormattableString str)
    {
        return str.ToString(CultureInfo.InvariantCulture);
    }
}

Yukarıdaki koddan da anlayabileceğiniz üzere stringi interpolation kullanarak yarattığımız herhangi bir string FormattableString'e implicit olarak çevirebiliyoruz. FormattableString sınıfı içerisinde ise string interpolation kullanarak yarattığımız stringle ilgili çeşitli bilgiler yer alıyor. Bunlar string interpolation kullanarak yazığımız ifadenin string.format karşılığı ve string içerisinde belirli alanlara yerleştirdiğimiz değerler. C# Interactive Window içerisinde aşağıdaki gibi FormattableString içerisindeki değerleri görebilirsiniz.

Gördüğünüz gibi string interpolation belirli çerçevelerde de olsa bizim string yaratma işlemlerimizi bir nebze kolaylaştırıyor.

Bir sonraki yazıda görüşmek üzere.



Yorum Gönder


Yorumlar

  • profile

    İlkay İlknur

    • 17
    • 12
    • 2015

    @Mahmut Kendim yazdım :)

  • profile

    Mahmut gundogdu

    • 17
    • 12
    • 2015

    Hocam blog sisteminiz jekyll e benziyor ama değilde gibi. Tam nedir ?