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

C# 9.0 – Module Initializers

Merhaba,

Bu içeriğimizde C# 9.0’ın son sürümünde göze çarpan bir özellik olan Module Initializer’ı inceliyor olacağız. Hiç vakit kaybetmeden gelin direkt konuya sorularla giriş yapalım..

Module Initializer Nedir?

Module Initializer, esasında .NET için yeni bir özellik değildir. CLR(Common Language Runtime – Ortak Dil Çalışma Zamanı)’de mevcut olan ancak C# geliştiricileri tarafından C# 9.0 versiyonunun son sürümüne kadar doğrudan kullanılamayan bir özelliktir. Module Initializer, uygulama başlama fırsatı bulmadan önce değişkenlerin ve uygulama durumunun tetiklenmesini sağlayan ve bu tetiklenme neticesinde gerekli ön tanımların ya da belirli işlemlerin gerçekleştirilmesine imkan veren ve hatta daha da önemlisi debugging süreçlerinde yaşanan kilitlenme gibi durumlardan kaçınmamızı sağlayan bir özelliktir.

Ayrıca Module Initializer uygulama ayağa kaldırılırken belli başlı rutin kontrollerin yapılabileceği ideal bir zemin sunmaktadır.

Module Initializer Nasıl Kullanılır?

Module Initializer, özünde System.Runtime.CompilerServices namespace’i altında bulunan bir attribute’dur.

public sealed class ModuleInitializerAttribute : Attribute

Kullanımı ise aşağıdaki gibidir:

    class Program
    {
        static void Main(string[] args)
        {
            Console.WriteLine(text);
        }

        static string text;

        [ModuleInitializer]
        public static void Initializers()
        {
            text = "doldur be meyhaneci...";
        }
    }

Yukarıdaki kod bloğunu derleyip, çalıştırdığımızda ekrana ‘doldur be meyhaneci…’ çıktısı gelecektir. Dikkat ederseniz ‘ModuleInitializer’ attribute’u ile uygulamanın herhangi bir yerinde ‘Initializers’ isimli metodu çağırmaya gerek kalmaksızın tetikleyebilmiş ve içerisinde gerekli öncelikli tanımlamaları ve operasyonları gerçekleştirebilmiş olduk.

Peki Bu Module Initializer’ın Espirisi Nedir? Constructor veya Static Constructor’dan Farkı Nedir?

Module Initializer, derlenmiş bir program ilk ayağa kaldırılırken çalıştırılacak fonksiyonu/fonksiyonları belirlememizi sağlayan bir özelliktir. Constructor veya static constructor’dan temel farkı nesne üretim süreçlerinde ya da ilgili sınıf üzerinden static bir member’ın kullanılması esnasında bir sınıfa ait metodun tetiklenmesinden ziyade derlemedeki tüm sınıflara uygulanmasını sağlamaktadır. Yani uzun lafın kısası, bir uygulamayı derleyip ardından ayağa kaldırırken herhangi bir nesne oluşumuna, metot çağrımına yahut static bir operasyon talebine gerek kalmaksızın belirli amaçlar doğrultusunda(yukarıdaki paragraflarda değinilmiştir) tetiklenecek metotları Module Initializer sayesinde belirleyebilmekte ve tetikleyebilmekteyiz.

Yapının çalışma mantığını daha net anlayabilmek için aşağıdaki ekran görüntüsünü incelemeniz yeterli olacaktır.

C# 9.0 - Module Initializers

Dikkat edilirse eğer ‘A’, ‘B’ ve ‘C’ sınıfları içlerinde ‘ModuleInitializer’ attribute’u ile işaretlenmiş metotlar barındırmaktadırlar. Uygulama çalıştırıldığında(derlenip, ayağa kaldırıldığında) bu işaretlenmiş metotlar anlık olarak tetiklenmektedir. Ayrıca bir uygulamada kaç tane ‘ModuleInitializer’ ile işaretlenmiş metodun olabileceği konusunda herhangi bir sınırın olmadığını görmektesiniz. Sadece uygulamanın ayağa kalkma sürecinde hangi ‘ModuleInitializer’ı tetikleyeceği(sırası) derleyicinin keyfine bağlıdır.

Module Initializer Kullanılırken Nelere Dikkat Edilmelidir?
Module Initializer özelliği öyle lalettayin her metot tarafından kullanılabilir bir özellik değildir. Module Initializer’ı kullanabilmek için ilgili attribute ile işaretlenecek metot aşağıdaki özellikleri barındırmalıdır:

  • Static olmalıdır.
  • Parametresiz olmalıdır.
  • Geriye değer döndürmeyen(void) olmalıdır. Asenkron operasyonlarda ise async void olmalıdır!
  • Generic olmamalıdır.
  • Public veya internal olmalıdır.
  • Local function olmamalıdır.

Ayrıca ‘ModuleInitializer’ attribute’u ile işaretlenerek Module Initializer haline getirilen bir metot, geliştirici tarafından açıkça çağrılmadıkça herhangi bir modül için tam olarak bir kez çalışacaktır. Bunun dışında, Module Initializer tarafından doğrudan ya da dolaylı olarak çağrılanlar dışında hiçbir metot, Module Initializer işlevini tamamlamadan herhangi bir modüldeki property’lere, metotlara yahut verilere erişemez!

Module Initializer’ı Main’de Kullanırsak Ne Olur?
Hemen deneyelim 🙂 Tabi bunun için default olarak private ve parametreli gelen ‘Main’i biraz dekore etmemiz gerekecektir.

    class Program
    {
        static int count = 0;

        [ModuleInitializer]
        public static void Main()
        {
            Console.WriteLine($"{++count}. tetikleme");
        }
    }

Yukarıdaki kodu derleyip, çalıştırdığımızda ‘ModuleInitializer’ attribute’u ‘Main’ metodunu ilginç bir şekilde iki kez tetikleyecek ve böylece ekrana aşağıdaki sonucu basacaktır.
C# 9.0 - Module Initializers

Nihai olarak .NET, Module Initializer ile geliştiricilere uygulama ayağa kaldırılırken herhangi bir kodu çalıştırma yeteneği vermektedir. Böylece, muhtemeldir ki daha fazla kullanım durumu ve katkısı olsa da şahsen benim öngörebildiğim doğrultuda çalışma zamanı performans ve güvenlik açısından avantajlara sahip olabilmemizi desteklemektedir.

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

Bunlar da hoşunuza gidebilir...

1 Cevap

  1. Mehmed Emre dedi ki:

    Great job!

Bir cevap yazın

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