سه شنبه ۲۷ شهريور ۱۴۰۳
Tut24 آموزش برنامه نویسی و مجله تخصصی فناوری ورود/عضویت

آموزش سی شارپ - دستورالعمل‌های پیش‌پردازنده

دستورالعمل‌های پیش‌پردازنده دستوراتی هستند که به کامپایلر دستور می‌دهند که قبل از شروع کامپایل‌های واقعی، اطلاعات را پیش‌پردازش کند.

همهٔ دستورالعمل‌های پیش‌پردازنده با # شروع می‌شوند و فقط کاراکترهای فاصلهٔ سفید می‌توانند قبل از یک دستور پیش‌پردازنده در یک خط ظاهر شوند. دستورالعمل‌های پیش‌پردازنده دستورات نیستند، بنابراین با نقطه‌ویرگول (;) ختم نمی‌شوند.

کامپایلر C# پیش‌پردازندهٔ جداگانه‌ای ندارد؛ با این حال، دستورالعمل‌ها به طوری پردازش می‌شوند که وجود یک پیش‌پردازنده فرضی وجود دارد. در C#، دستورالعمل‌های پیش‌پردازنده برای کمک به کامپایل شرطی استفاده می‌شوند. به عکس دستورالعمل‌ها در C و C++ که برای ایجاد ماکروها استفاده می‌شوند، دستورالعمل‌های پیش‌پردازنده در C# استفاده نمی‌شوند. یک دستورالعمل‌های پیش‌پردازنده باید تنها دستور روی یک خط باشد.

دستورالعمل‌های پیش‌پردازنده در C#

جدول زیر دستورالعمل‌های پیش‌پردازنده موجود در C# را نشان می‌دهد −

ردیف دستورالعمل پیش‌پردازنده و توضیحات
1

#define

این دستور یک دنباله‌ای از کاراکترها، که سمبل نامیده می‌شود، تعریف می‌کند.

2

#undef

با استفاده از این دستور می‌توانید یک سمبل را ناتعریف کنید.

3

#if

این دستور امکان بررسی یک سمبل یا سمبل‌ها را برای دیدن اینکه آیا آن‌ها به صورت true ارزیابی می‌شوند یا خیر، فراهم می‌کند.

4

#else

این دستور امکان ایجاد یک دستور پیش‌پردازندهٔ شرطی ترکیبی را در کنار #if فراهم می‌کند.

5

#elif

این دستور امکان ایجاد یک دستور پیش‌پردازندهٔ شرطی ترکیبی را فراهم می‌کند.

6

#endif

این دستور نهایی یک دستور پیش‌پردازندهٔ شرطی را مشخص می‌کند.

7

#line

این دستور به شما اجازه می‌دهد شمارهٔ خط کامپایلر و (اختیاری) نام فایل خروجی را برای خطاها و هشدارها تغییر دهید.

8

#error

این دستور امکان ایجاد یک خطا از یک موقعیت خاص در کد شما را فراهم می‌کند.

9

#warning

این دستور امکان ایجاد یک هشدار سطح یک از یک موقعیت خاص در کد شما را فراهم می‌کند.

10

#region

این دستور به شما اجازه می‌دهد یک بلوک کد را تعیین کنید که در هنگام استفاده از ویژگی متن ویرایشگر کد Visual Studio قابل گسترش یا جمع‌بندی است.

11

#endregion

این دستور پایان یک بلوک #region را مشخص می‌کند.

پیش‌پردازندهٔ #define

دستورالعمل پیش‌پردازندهٔ #define ثابت‌های نمادین را ایجاد می‌کند.

با استفاده از #define می‌توانید یک سمبل را به گونه‌ای تعریف کنید که با استفاده از سمبل به عنوان عبارت ارسال شده به دستور #if، عبارت به true ارزیابی می‌شود. نحو آن به شرح زیر است −

#define symbol

برنامه زیر این را نشان می دهد -

#define PI 
using System;

namespace PreprocessorDAppl {
   class Program {
      static void Main(string[] args) {
         #if (PI)
            Console.WriteLine("PI is defined");
         #else
            Console.WriteLine("PI is not defined");
         #endif
         Console.ReadKey();
      }
   }
}

هنگامی که کد بالا کامپایل و اجرا می شود، نتیجه زیر را ایجاد می کند -

PI is defined

دستورالعمل‌های شرطی

می‌توانید از دستورالعمل #if برای ایجاد یک دستورالعمل شرطی استفاده کنید. دستورالعمل‌های شرطی برای بررسی یک سمبل یا سمبل‌ها و بررسی اینکه آیا آن‌ها به صورت true ارزیابی می‌شوند، مفید هستند. اگر آن‌ها به صورت true ارزیابی شوند، کامپایلر همهٔ کد بین #if و دستورالعمل بعدی را ارزیابی می‌کند.

نحو دستورالعمل شرطی به شرح زیر است −

#if symbol [operator symbol]...

که در آن، symbol نام سمبلی است که می‌خواهید آن را بررسی کنید. همچنین می‌توانید از true و false استفاده کنید یا سمبل را با عملگر منفی پیش‌نیاز کنید.

operator symbol عملگری است که برای ارزیابی سمبل استفاده می‌شود. عملگرها ممکن است شامل یکی از موارد زیر باشند −

  • == (برابری)
  • != (نابرابری)
  • && (و)
  • || (یا)

همچنین می‌توانید سمبل‌ها و عملگرها را با استفاده از پرانتزها گروه‌بندی کنید. دستورالعمل‌های شرطی برای کامپایل کد در یک نسخهٔ اشکال‌زدایی یا هنگام کامپایل کردن برای یک پیکربندی خاص استفاده می‌شوند. یک دستورالعمل شرطی که با یک دستورالعمل #if شروع شده است، باید به صورت صریح با یک دستورالعمل #endif خاتمه یابد.

برنامهٔ زیر استفاده از دستورالعمل‌های شرطی را نشان می‌دهد −

#define DEBUG
#define VC_V10
using System;

public class TestClass {
   public static void Main() {
      #if (DEBUG && !VC_V10)
         Console.WriteLine("DEBUG is defined");
      #elif (!DEBUG && VC_V10)
         Console.WriteLine("VC_V10 is defined");
      #elif (DEBUG && VC_V10)
         Console.WriteLine("DEBUG and VC_V10 are defined");
      #else
         Console.WriteLine("DEBUG and VC_V10 are not defined");
      #endif
      Console.ReadKey();
   }
}

هنگامی که کد بالا کامپایل و اجرا می شود، نتیجه زیر را ایجاد می کند -

DEBUG and VC_V10 are defined