C# 6.0 – Static Using Cümlecikleri

   Hızla C#’ın bir sonraki sürümünde karışılacağımız yenilikleri sizlerle paylaşırken sırada görece basit; ama kod yazarken seveceğiniz bir yenilik var. Dil geliştiricilerin bu sürümde özellikle derleyiciye yoğunlaştığını düşünürsek bu makalemde detaylarını paylaşacağım static using cümleciği gibi sözdizimsel ‘şekerlemelerin’ de eklenmiş olmasına şaşırmamak lazım.

   Static using cümlecikleri ile birlikte kaynak kodumuzda using ifadesi ile belirttiğimiz statik sınıfların erişilebilir durumdaki tüm statik üyelerine doğrudan erişebilmemizi sağlamaktadır.

class Program{
    static void Main(){
        System.Console.WriteLine("Merhaba Dünya");
    }
}

Şeklindeki kodlarımız artık aşağıdaki şekilde de yazılabilir;

using System.Console;

class Program{
    static void Main(){
        WriteLine("Merhaba Dünya");
    }
}

   Örneğimizde System.Console sınıfını using ile belirtmemiz ardından içerindeki statik WriteLine fonksiyonunu doğrudan kullanabildiğimizi görebilirsiniz. Bu da özellikle çok sık kullandığınız fonksiyonlarda size kolaylık sağlayacaktır.

   Bu noktada aklınıza genişletme fonksiyonları (extension functions) gelebilir. Genişletme fonksiyonlarında durum biraz karışık. Statik bir sınıf içindeki statik fonksiyonlar olmaları kafamızı biraz karıştırabilir. Aşağıdaki örneğimizi inceleyelim;

namespace Com.Enterprisecoding.StaticUsingOrnek.Genisletmeler {
    static class StringEx {
        public static void YeniBirFonksiyonalite(this string stringIfade) {
            //İş mantığı kodları
        }
    }
}
using Com.Enterprisecoding.StaticUsingOrnek.Genisletmeler;
 
namespace Com.Enterprisecoding.StaticUsingOrnek {
    class Program {
        static void Main(string[] args) {
            var stringBirIfade = "";
 
            stringBirIfade.YeniBirFonksiyonalite();
        }
    }  
}

   Örneğimizde static StringEx sınıfı içerisinde oluşturduğumuz YeniBirFonksiyonalite fonksiyonu genişletme fonksiyonu olarak tanımlanmış durumda. Dolayısıyla da Main fonksiyonumuzda yer alan string türünden stringBirIfade değişkeni üzerinden bu fonksiyona ulaşabiliriz. Öte yandan static bir fonksiyon olması nedeniyle YeniBirFonksiyonalite fonksiyonumuzu aşağıdaki gibi doğrudan da kullanabiliriz.

using Com.Enterprisecoding.StaticUsingOrnek.Genisletmeler;
 
namespace Com.Enterprisecoding.StaticUsingOrnek {
    class Program {
        static void Main(string[] args) {
            var stringBirIfade = "";
 
            StringEx.YeniBirFonksiyonalite(stringBirIfade);
        }
    }  
}

Öte yandan static using ile StringEx tanımlayarak YeniBirFonksiyonalite fonksiyonunu aşağıdaki şekilde doğrudan kullanmamız mümkün değildir;

using Com.Enterprisecoding.StaticUsingOrnek.Genisletmeler.StringEx;
 
namespace Com.Enterprisecoding.StaticUsingOrnek {
    class Program {
        static void Main(string[] args) {
            var stringBirIfade = "";
 
            YeniBirFonksiyonalite(stringBirIfade);
        }
    }  
}

   Sizde kabul edersiniz ki, böylesi bir kodlama genişletme fonksiyonlarının mantığına da aykırı bir kullanım olacaktır.

   Bu bilgiler ışığında dikkat çekmek istediğim nokta ise yeni kazandığımız static using özelliği ile birlikte yazdığımız API’lerde dikkat etmemiz gereken bir geriye dönük uyumluluk problemi kazandığımızdır. Konuyu netleştirebilmek adına yukarıdaki örneğimizden devam edelim. Bu defa StringEx sınıfı içerisindeki YeniBirFonksiyonalite fonksiyonunu bir genişletme fonksiyonu olarak değil de standart statik bir fonksiyon olarka tanımladığımızı varsayalım;

namespace Com.Enterprisecoding.StaticUsingOrnek.Genisletmeler {
    static class StringEx {
        public static void YeniBirFonksiyonalite(string stringIfade) {
            //İş mantığı kodları
        }
    }
}

   Bu durumda, artık geliştiriciler bir önceki örneğimizdeki şekilde static using yardımıyla YeniBirFonksiyonalite fonksiyonumuzu doğrudan kullanabilirler. Uyumluluk problemi tam da bu noktada başlayacaktır. Şimdiye kadar ki C# sürümlerinde API’mizin bir sonraki sürümünde YeniBirFonksiyonalite fonksiyonunu genişletme fonksiyonu haline getirdiğimizde geliştiriciler hiç bir şekilde etkilenmeden eski kullanımlarına devam edebiliyor, kodları derlenebiliyordu. Öte yandan statik using’in sahne alması ile birlikte fonksiyonun bu şekilde kullanıldığı senaryolarıda göz önüne almanız gerekecektir. Aksi takdirde API’nizi kullanan uygulamalar yeni versiyonunu doğrudan kullanamaz durumda olacaklardır.

   Gördüğünüz gibi static using C# eklenen güzel(?) bir yenilik olsa da önemli yan etkileri beraberinde getiriyor. Dikkatli olmakta fayda var.

Fatih Boy

Ankara'da yaşayan Fatih, bir kamu kurumunda danışman olarak çalışmaktadır. ALM süreçleri, kurumsal veri yolu sistemleri, kurumsal altyapı ve yazılım geliştirme konularında destek vermektedir. Boş zamanlarında açık kaynak kodlu projeler geliştirmeyi ve bilgisini yazdığı makalelerle paylaşmayı seven Fatih, aynı zamanda Visual C# ve Visual Studio teknolojileri konusundan Microsoft tarafından altı yıl üst üste MVP (En Değerli Profesyonel) ödülüne layık görülmüştür. İş hayatı boyunca masaüstü uygulamaları, web teknolojileri, akıllı istemciler gibi konularda Asp.Net, Php, C#, Java programlama dilleri ve MySql, MsSql ve Oracle gibi veritabanı yönetim yazılımları ile çalışmıştır. İngilizce ve Türkçe olarak yayınlanan makalelerini gerek İngilizce bloğunda, gerekse de Türkçe bloğunda bulabileceğiniz gibi web sitesinden de açık kaynak kodlu geliştirdiği yazılımlarına ulaşabilirsiniz. vCard - Twitter - Facebook - Google+

Bir Cevap Yazın

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