Derinlemesine yazılım eğitimleri için kanalımı takip edebilirsiniz...

C# 10 – Global Using Directive

Merhaba,

Son zamanlarda .NET 6 ve C# 10 ile gelen yeniliklerde, kodun sadeliğine ve teknik açıdan doğrudan doğruya işlevsel amacını gerçekleştirmeye odaklanıldığı dikkatinizi çekmiştir! Buna en güzel örnek, Asp.NET Core 6’da gelen sadeleştirilmiş konfigürasyon yapılanması olabilir. Artık namespace blokları, metot scope’ları vs. gibi basmakalıp kod yığınları arasında çalışmaktan ziyade, sadeleştirilmiş ve direkt işleve odaklanmış konfigürasyonları barındıran yeni yaklaşımla temeller atılmakta ve .NET açısından olması gereken çağdaşlık sergilenmektedir. Bu içeriğimizde bu çağdaşlaşma adımlarından biri olan ve C# 10 ile gelen global using directive özelliğini inceleyecek ve lüzumsuz kodlardan arındırılmış bir yapıya geçişin küçük ama anlamlı bir adımını atmış olacağız.

C# 10 Öncesi…

Global using directive özelliğine değinmeden önce kodun sadeliğine odaklanan C# 10’un bu konuda nasıl bir yaklaşım sergilediğini ortaya koyabilmek için önceki sürümlerden net bir örnek sunmakta fayda görmekteyim…

Her yazılımcı tarafından aşikardır ki, bir programlama dilinin en sade hali ‘merhaba dünya’ çıktısını verecek programı inşa edebilmekten geçmektedir. Haliyle C# programlama dilinin 10. versiyonundan önceki haliyle ilgili programı nasıl bir yığınla inşa ettiğimizi inceleyelim…

using System;

namespace MerhabaDunya
{
    class Program
    {
        static void Main(string[] args)
        {
            Console.WriteLine("Merhaba dünya...");
        }
    }
}

Sizce de, bir ‘merhaba dünya’ çıktısı için bunca zahmete değer mi? Evet, bendeniz dahil binlerce yazılımcı yıllarca bu zahmete katlanmış olabiliriz. Ama bu lüzumsuz kod yığınıyla haşır neşir olmadığımız anlamına gelmemektedir. Bilenleri geçtim, yazılıma dair hiç bilgisi olmayan ve sıfırdan programlama dilini öğrenmeye çalışan yeni adaylara ‘merhaba dünya’ çıktısını yazdırabilmek için ‘namespace’, ‘class’, ‘scope’ ve daha birçok yapıyı tanıtmamız gerekmekte ya da bunları sonradan tanıtmak üzere gözardı ederek, direkt olarak
Console.WriteLine("Merhaba dünya..."); kodunu yaz, geç…’
dememiz gerekmektedir. Nihayetinde programlama dünyasıyla yeni tanışan bir çocuğun dahi kod yazmaya odaklanması C# ile ilk etapta oldukça zor ve zahmetli olabilmekte ve ister istemez göz korkusu ya da önyargıya sebebiyet verebilmektedir. Misal olarak Python dilinin, gücünü performansından ziyade sade ve işleve odaklı yapısından aldığını ve bu sebepten dolayı popülaritesinin gün geçtikçe hızlıca arttığını söyleyebiliriz. O yüzden programlamaya yeni başlayanlara C# ya da Java’dan ziyade haklı olarak Python önerilmektedir.

İşte bu duruma C#, 9.0 versiyonu ile uyanmakta ve büyük farkı yaratabilmek için Top-Level Statements özelliğiyle sadeleştirme devriminin ilk adımını atmaktadır.

C# 10 ile gelinen son noktada ilgili kod aşağıdaki gibi yazılmaktadır;

Console.WriteLine("Merhaba dünya...");

Nasıl ama? Harika değil mi? Artık basit kodlarımızı inşa ederken lüzumsuz yere ‘namespace’ tanımlarına ve scope’lara boğulmaktan ziyade, direkt sade bir şekilde amaca odaklanabilmekteyiz.

Evet, şimdi C#’ın radikal bir sadeleştirme politikası güttüğü konusunda mutabıksak eğer esas konumuza gelebilir ve Global Using Directive‘in bu politikada nasıl bir rol oynadığını inceleyebiliriz.

Global Using Directive

C# programlama dilinde using direktifi birçok amaca hizmet etmektedir. (bknz : using Bloğu, Static Using, Using Declarations)

Bu amaçlar arasından en çok kullanıldığı nokta ‘namespace’ bildirisidir diyebiliriz.

Nihayetinde bir kodu inşa ederken farklı namespace’lerdeki sınıflardan istifade etmek icap edecektir ve her bir sınıf çağrımında aşağıdaki şekilde tam adlarıyla atıfta bulunmaktan ziyade,C# 10 - Global Using Directivebu kodları using sayesinde kısaltarak aşağıdaki gibi kullanmayı tercih etmekteyiz.C# 10 - Global Using Directive

Bu durumda da yüzlerce kod dosyasında aynı namespace’lerin tekrar tekrar using ile bildirildiğini görmekteyiz. C# 10 ile gelen global using directive özelliği sayesinde genel anlamda kullanılan namespace bildirimlerini merkezi bir dosya üzerinde tanımlayarak uygulama bazlı bir hale getirebilmekteyiz. Böylece kodun okunabilirliği rahatlamakta ve uygulama açısından da her kod dosyası aynı basmakalıp ifadelerden arındırılmaktadır.

Global Using Directive Özelliği Nasıl Kullanılır?

Global using directive özelliğini kullanabilmek için; biri .csproj dosyasından bir diğer ise kendi irademizle global using tanımlarını oluşturduğumuz .cs dosyasından olmak üzere iki farklı yöntem mevcuttur. Şimdi gelin bu iki yöntemi ayrı ayrı inceleyelim.

  1. .csproj Dosyasından Global Using
    Global using özelliği için uygulamanın .csproj dosyasında <ItemGroup>...</ItemGroup> etiketi arasına aşağıdaki gibi Using tanımlamalarının yazılması yeterlidir.

    <Project Sdk="Microsoft.NET.Sdk">
    
    	<PropertyGroup>
    		<OutputType>Exe</OutputType>
    		<TargetFramework>net6.0</TargetFramework>
    		<Nullable>enable</Nullable>
    		<ImplicitUsings>enable</ImplicitUsings>
    	</PropertyGroup>
    
    	<ItemGroup>
    		<Using Include = "System.Data.SqlTypes" />
    		<Using Include = "System.Reflection" />
    	</ItemGroup>
    
    </Project>
    

    C# 10 - Global Using DirectiveBu tanımlama yapıldığında uygulamanın ‘obj’ -> ‘Debug’ -> ‘net6.0’ dizininde ‘{project-name}.GlobalUsings.g.cs’ isimli bir dosyanın oluşturulduğunu göreceksiniz. İlgili dosyaya göz atarsanız eğer tanımlaması yapılan tüm namespace’lerin buraya global olarak eklendiğini göreceksiniz. Yandaki görselde de olduğu gibi tanımlaması yapılmayan namespace’lerinde geldiği görülmektedir. Bunun nedeni <PropertyGroup>...</PropertyGroup> etiket içerisinde tanımlanmış olan ImplicitUsings özelliğidir. Bu özellik enable olduğu taktirde bir uygulama için genel geçer namespace’ler buradaki otomatik generate edilen global using sınıfı içerisine default olarak eklenmektedir. Yok eğer disable yapılırsa, bizlerin tanımladıkları dışındakilerin silindiği görülecektir. Bunu anlayabilmek için en iyisi aşağıdaki ekran görüntüsünü incelemenizdir;
    C# 10 - Global Using Directive
    Görüldüğü üzere .csproj dosyasında Using tanımlaması yapılır yapılmaz global using dosyası derlenmektedir. Bu işlem tanımlamanın kaydedilmesi ile eşzamanlı gerçekleşeceğinden dolayı ekstradan bir derleme gibi işleme gerek duyulmamaktadır.

  2. Herhangi Bir .cs Dosyasından Global Using’lerin Tanımlanması
    Global using’leri tanımlamanın bir başka yöntemi ise herhangi bir .cs dosyasının bu iş amaçlı kullanılmasıdır. Uygulamada oluşturulan ve genellikle uygulama ile aynı isimde olan bir .cs dosyası içerisinde aşağıdaki gibi global using tanımlamalarının yapılması yeterlidir.

    – global-using.cs

    global using System.Reflection;
    global using System.Runtime.CompilerServices;
    

Haliyle her iki durumda da global using ile tanımlanan namespace’ler altındaki sınıflara rahatça ve herhangi bir kod kirliliğine sebebiyet vermeksizin direkt ulaşılabilmektedir.

Nihai olarak;
Her geçen gün C# programlama dili, gücüne güç kattığı gibi kendini lüzumsuz fazlalıklardan da arındırmakta ve yarınlara olabilecek en çağdaş semantikle hitap edebilmek için bu tarz çabalarıyla niyetini ortaya koymaktadır.

İlgilenenlerin faydalanması dileğiyle…
Sonraki yazılarımda görüşmek üzere…
İyi çalışmalar…

Bunlar da hoşunuza gidebilir...

Bir cevap yazın

E-posta hesabınız yayımlanmayacak.