Makale Özeti

C# ile program geliştirirken önişlemci direktifi (Preprocessor Directives) denen kod parçaları programcıya çeşitli konularda yardımcı olmaktadır. C#’ta kullanılacan önişlemci direktifleri C++’dan alınmıştır.Bu makale C#'ta önişlemci direktiflerini anlatmaktadır.

Makale

C# ile program geliştirirken önişlemci direktifi (Preprocessor Directives) denen kod parçaları programcıya çeşitli konularda yardımcı olmaktadır. C#’ta kullanılacan önişlemci direktifleri C++’dan alınmıştır. İsmi ise C++’da derleme çeşidine göre konulmuştur. C++’da derleme işlemi, önişlemciler için farklı yapılırdı, C#’da ise böyle bir durum söz konusu değil fakat ismi değiştirilmemiş ve aynen kullanılmaktadır.

 C#’da önişlemci direktifleri # işareti ile başlatılır ve harfe duyarlılardır. En sık kullanılanı ise şüphesiz #Region  önişlemci direktifidir.

 Önişlemci direktiflerini sıralayacak olursak :

#if
#else
#elif
#endif
#define
#undef
#warning
#error
#line
#region
#endregion

#define , #if , #else, #elif, #endif

 Define önişlemci direktifi programda sembol tanımlamamızı sağlar. Yazım yeri ise using ifadesinden önce yani kodun en üst kısmıdır.

 Örneğin #define DenemeSurumu

            #define TamSurum

 Daha önceden belirtilen bir sembol değerini kontrol etmeyi sağlar. Yukarıda örnek olarak iki tane önişlemci belirtildi. Onislemci direktifine göre ekrana çıktı alalım :

#define DenemeSurumu

using System;

using System.Collections.Generic;

using System.Text;

namespace Onislemciler

{

    class Program

    {

        static void Main(string[] args)

        {

            #if TamSurum

            Console.WriteLine("Tam Surumu");

            #endif

            Console.WriteLine("Normal Uygulama");

        }

    }

}

Bu örnekte program’da using ifadesinden önce DenemeSurumu adında bir önişlemci direktifi belirlenmiştir. Main methodu içerisinde ise program modu eğer TamSurum ise ekrana “Tam Sürüm” yazısı eklenecek.

Aynı anda birden fazla önişlemci direktifini kontrol ettirebilirsiniz. Kullanacağınız operatörler &&, &, ||, ! gibi operatorler olabilir.

#define DenemeSurumu

using System;

using System.Collections.Generic;

using System.Text;

namespace Onislemciler

{

    class Program

    {

        static void Main(string[] args)

        {

            #if ! TamSurum

            Console.WriteLine("Kısıtlı kullanım");

#else

            Console.WriteLine("Tam Surum");

#endif

            }

    }

}

Eğer kontrolünü yapacağınız şartlar birden fazla ise c#’ta if- elseif- else – endif olarak yaptığımız kontrolü önişlemci direktifinde #if, #elif, #else, #endif olarak yapılır. Yani #Elif = ElseIf anlamındadır.

#define DenemeSurumu

using System;

using System.Collections.Generic;

using System.Text;

namespace Onislemciler

{

    class Program

    {

        static void Main(string[] args)

        {

            #if ! TamSurum

                Console.WriteLine("Kısıtlı kullanım");

                #elif ! Trial

                   Console.WriteLine("Zamanlı Kullanım");

                #else

                    Console.WriteLine("Tam Kullanım");

                #endif

            }

    }

}

#define, #if, #endif önişlemci direktiflerini , örnek trial ya da demo uygulaması yapmak için kullanabilirsiniz. Dikkat ettiyseniz Visual Studio ekranda gösterilecek olan satırın renklerini normak olarak gösterirken, gösterilmeyecek yerleri gri olarak göstermektedir.

#undef

#undef önişlemci direktifi daha önceden #define olarak tanımlanmış olan tanımlamayı sınıflar ve durumu ortadan kaldırır.

#define DenemeSurumu

#undef DenemeSurumu

 

#warning, #error , #line

 

#error direktifi yazıldığı yerde hata verdirmeyi sağlar. Bu noktada program derlenmez ve hata verir.

using System;

using System.Collections.Generic;

using System.Text;

namespace Onislemciler

{

    class Program

    {

        static void Main(string[] args)

        {

            #if !DenemeSurumu

             #error Hata Var Burada

            #endif

          }  

    }

}

Yukarıda kodda  #if !DenemeSurumu koşulunu #if DenemeSurumu şeklinde değiştirdiğiniz taktirde program hata verecektir.

  

#warning direktifi ise hata yerine sadece uyarı verdirip programcının dikkatin çeiklmesi sağlar.

using System;

using System.Collections.Generic;

using System.Text;

namespace Onislemciler

{

    class Program

    {

        static void Main(string[] args)

        {

            #if DenemeSurumu

                #warning Burada Programciyi Uyar

            #endif

         }

    }

}

 

#line direktifi bu direktifin bulunduğu dosyanın satır sayısını ve dosyanın adını ayarlamayı sağlar. Örneğin :

  #line 100

Yazıdıktan sonra bir sonraki satır 100. satır olarak yazılacaktır. Bir örnek ile açıklayacak olursak;

using System;

using System.Collections.Generic;

using System.Text;

 

namespace Onislemciler

{

    class Program

    {  

        static void Main(string[] args)

        {

                #line 100

                intt sayi;

         }

    }

}

Yukarıdaki kodda hata veren yer normal şartlar altında 16. satır olmalı fakat #line kullanıdığı için hata 100.satırda olarak görünmektedir.

 

#region, #endregion

C# ile program geliştirken en fazla kullanılan önişlemcidir. Yazılan kodları gruplandırmayı sağlar. #region ve #endregion arasına yazılan kodlar Visual Studio tarafından gruplanıp paketlenebilir. Örneğin ;

using System;

using System.Collections.Generic;

using System.Text;

namespace Onislemciler

{

    class Program

    { 

        static void Main(string[] args)

        {

            #region Burası Gruplanıyor

 

            #endregion

        }  

    }

} 

Yukarıdaki kodda belirtilen #region, #endregion önişlemcisi aşağıdaki gibi paket haline getirilebilir. Çok satır kod ile çalışırken büyük kolaylık sağlamaktadır.

 

C# dilinin güzelliklerini anlatacağımız bir başka makalede görüşmek üzere

Okan Tekeli

okan.tekeli@bilgeadam.com

okan@okantekeli.com