Makale Özeti

C# iki çeşit yapılandırıcı method tipini destekler. Bunlar static ve non-static yapılandırıcılardır.

Makale

Site içerisinde yazılan tüm makalelerin yazım ve yayınlama hakkı aksi belirtilmediği sürece sadece yazarlara aittir.

v3.0 Geri Bildirim (Feedback) Yazgelistir.Com Ekibi - 2012 - Yazgelistir.com

STATIK YAPILANDIRICI METODLAR

C# iki çeşit yapılandırıcı method tipini destekler. Bunlar static ve non-static yapılandırıcılardır. Non-static yapılandırıcı methodlar genel olarak kullandıgımız yapılandırıcılardır. Bu yazımızda statik yapılandırıcı methodlar üzerinde duracağız. Statik yapılandırıcıların özeliklerinden bahsetmek gerekirse :
  • Bir class sadece bir statik yapılandırıcı içerebilir.
  • Parametre almazlar.
  • Erişim belirleyicisi almazlar. Yani "public static statikyapilandirici()" gibi bir method başlığı desteklenmez. "static statikyapilandirici()" tanımlaması doğru olacaktır.
  • Statik değişkenler değer aldıktan sonra çalışırlar.
  • Non-static yapılandırıcılardan önce çalışırlar.
  • Direkt olarak çağırılamazlar.
Statik yapılandırıcılar genel olarak statik değişkenlere ilk değerlerini vermek için kullanılırlar. Bildiğiniz gibi statik değişkenler sadece bir kez değer alırlar ve tüm nesnelerde ortak olarak kullanılırlar. Static yapılandırıcılarda static değişkenler gibi sadece bir kez çağırılırlar. Static yapılandırıcıya sahip bir class'tan ne kadar nesne türetirseniz türetin sadece ilk nesne türetildiğinde çalışacaktır. Dolayısıyla gerekli yerde kullanıldığında kullanınıcıya kolaylık sağlıyacaktır ve performansı arttıracaktır.

Static yapılandırıcıların nasıl kullanılacağını ve non-static yapılandırıcıya ne zaman alternatif olacağını gösteren bir örnek uygulama yapalım.Sistemdeki Com+ nesnelerinin isimlerini ArrayList tipinde veren bir sınıf yazalım. Ve bu sınıftan çok sayıda nesne türeteceğimizi varsayalım. Static ve non-static yapılandırıcıyla ArrayList'imizi doldurduğumuzda oluşacak performansa bakalım.
İlk olarak statik yapılandırıcımızla arraylist'imizi dolduralım. Add Reference> Com> Com + Admin 1.0 Type Library ile COMAdmin kütüphanesini import edelim.

using System;
using System.Collections;
using COMAdmin;
namespace ConsoleApp
{
 class TestClass
 {
     public static ArrayList comNames = new ArrayList();
  static TestClass()
  {
     ICOMAdminCatalog objAdmin = new COMAdmin.COMAdminCatalogClass();
     object objRoot = objAdmin.Connect("127.0.0.1");
     COMAdmin.COMAdminCatalogCollection objCollection;
     objCollection=(COMAdmin.COMAdminCatalogCollection)objAdmin.GetCollection("Applications");
     objCollection.Populate();
     foreach(COMAdmin.COMAdminCatalogObject objAppNames in objCollection)
     {
         comNames.Add(objAppNames.Name);
     }
     Console.WriteLine("Static Yapılandırıcı.");
  }
  public TestClass()
  {
     //Console.WriteLine("Static Olmayan Yapılandırıcı.");
  }
 }
 class Class1
 {
  [STAThread]
  static void Main(string[] args)
  {
     Console.WriteLine("Program Başladı.");
     Console.WriteLine(DateTime.Now.ToLongTimeString()+" "+DateTime.Now.Millisecond);
     for(int i=0;i<1000;i++)
     {
         new ConsoleApp.TestClass();
     }
     Console.WriteLine("Com+ Kataloğu Yüklendi.");
     Console.WriteLine(DateTime.Now.ToLongTimeString()+" "+DateTime.Now.Millisecond);
     Console.WriteLine("Program Sonlandı.");
     Console.ReadLine();
  }
 }
}
Yukarıdaki kodu çalıştırdığımdaki çıktı :
Program Başladı.
15:55:55 578
Static Yapılandırıcı.
Com+ Kataloğu Yüklendi.
15:55:58 812
Program Sonlandı.
TestClass clasındaki statik TestClass yapılandırıcısı ile Com+ kataloğuna eriştiğimiz yukarıdaki kodda 1000 nesne türetmemiz sadece 234 milisaniye sürdü.
Şimdi non-statik yapılandırıcı kullanarak aynı işlemi gerçekleştirelim.

using System;
using System.Collections;
using COMAdmin;
namespace ConsoleApp
{
 class TestClass
 {
      public static ArrayList comNames = new ArrayList();
  static TestClass()
  {
     //Console.WriteLine("Static Yapılandırıcı.");
  }
  public TestClass()
  {
     ICOMAdminCatalog objAdmin = new COMAdmin.COMAdminCatalogClass();
     object objRoot = objAdmin.Connect("127.0.0.1");
     COMAdmin.COMAdminCatalogCollection objCollection;
     objCollection=(COMAdmin.COMAdminCatalogCollection)objAdmin.GetCollection("Applications");
     objCollection.Populate();
     foreach(COMAdmin.COMAdminCatalogObject objAppNames in objCollection)
     {
         comNames.Add(objAppNames.Name);
     }
     //Console.WriteLine("Static Olmayan Yapılandırıcı.");
  }
 }
 class Class1
 {
  [STAThread]
  static void Main(string[] args)
  {
     Console.WriteLine("Program Başladı.");
     Console.WriteLine(DateTime.Now.ToLongTimeString()+" "+DateTime.Now.Millisecond);
     for(int i=0;i<1000;i++)
     {
         new ConsoleApp.TestClass();
     }
     Console.WriteLine("Com+ Kataloğu Yüklendi.");
     Console.WriteLine(DateTime.Now.ToLongTimeString()+" "+DateTime.Now.Millisecond);
     Console.WriteLine("Program Sonlandı.");
     Console.ReadLine();
  }
 }
}
Gördüğümüz gibi non-static yapılandırıcı kullandıgımız yukarıdaki kod aynı işlemi 34 saniye 203 milisaniyede yaptı. 1000 nesne için static yapılandırıcı diğerine nazaran 145 kat daha hızlı çalıştı.
Buradaki fark non-static classda Com+ kataloğuna gereksiz yere 999 kez erişmekten kaynaklanıyor. 1 kezde ulassanız 1000 kezde ulaşsanız elde edeceğiniz Com+ kataloğu aynı katalogdur. Bunu önüne geçmek için statik yapılandırıcı bize iyi bir çözüm sunmaktadır.

Zekeriya YOLCU
MCSD.Net

zekeriya.yolcu@gmail.com