Preprocessor directives
Preprocessor directives เป็นคำสั่งของโปรแกรมที่ประมวลผลในตอนที่คอมไพเลอร์เริ่มต้นทำงาน ซึ่งมันทำงานโดย preprocessor และก่อนที่โปรแกรมจะสร้าง executable file ที่ใช้ในการรันโปรแกรม preprocessor directives นั้นเริ่มต้นด้วยเครื่องหมาย hash (#) และมันใช้บรรทัดใหม่ในการสิ้นสุดคำสั่ง
นี่เป็นตารางของ Preprocessor directives ที่มีในภาษา C#
Directives | Descriptions |
---|---|
#if | ตรวจสอบถ้าหาก symbol ได้ถูกกำหนด |
#else | คำสั่งถ้าหากเงื่อนไขจาก #if ไม่ได้ถูกกำหนด |
#elif | ตรวจสอบถ้าหากมีการกำหนด symbol แบบหลายตัวเลือก |
#endif | ใช้ควบคู่กับ #if เพื่อปิดบล็อคคำสั่ง |
#define | ใช้เพื่อกำหนด symbol ในโปรแกรม |
#undef | ใช้เพื่อยกเลิก symbol ในโปรแกรม |
#warning | ใช้เพื่อให้คอมไพเลอร์สร้างการแจ้งเตือน |
#error | ใช้เพื่อให้คอมไพเลอร์สร้างข้อผิดพลาด |
#line | แก้ไขหมายเลขบรรทัดของคอมไพเลอร์ |
#region | ใช้ในการกำหนดขอบเขตหรือส่วนของโค้ด |
#endregion | ใช้ควบคู่กับ #region เพื่อสิ้นสุดบล็อคคำสั่ง |
#pragma | ใช้คำสั่งสร้างคำสั่ง preprocessing แบบกำหนดเอง |
ในภาษา C# สนับสนุน proprocessor directives รูปแบบต่างๆ เพื่อใช้ในวัตถุประสงค์ที่แตกต่างกันออกไป ต่อไปมาดูตัวอย่างในการใช้งาน
Macro definitions (#define, #undef)
Macro definitions เป็น directive ที่ใช้กำหนดหรือยกเลิก symbol ที่ใช้ในขอบเขตของโปรแกรม โดยมันมีรูปแบบการประกาศดังนี้
#define SYMBOL_NAME
#undef SYMBOL_NAME
ในการประกาศ symbol ใช้ directive #define
ตามด้วยชื่อของ symbol ที่ต้องการประกาศ และการยกเลิกใช้ directive #undef
ตามด้วยชื่อของ symbol ที่ต้องการยกเลิก
#define DEBUG
using System;
...
ในตัวอย่าง เราได้ประกาศ symbol DEBUG
ในการใช้ directive #define และ #undef นั้น คุณจะต้องทำก่อนคำสั่งปกติของโปรแกรมทั้งหมด
Conditional inclusions (#if, #elif , #else and #endif)
Conditional inclusions เป็น directives เพื่อใช้สำหรับตรวจสอบว่า symbol ว่าได้ถูกกำหนดโดย directive #define หรือไม่ ถ้าคำสั่งถูกกำหนด คอมไพเลอร์จะทำงานในบล็อคของ directive #if ที่สิ้นสุดด้วย directive #endif
#if
เป็น directive ที่ใช้สำหรับตรวจสอบถ้าหากว่า symbol ได้ถูกกำหนด คอมไพลเลอร์จะประมวลผลในบล็อคของคำสั่งที่จบด้วย directive #endif
สำหรับ directive#elif
และ #else
เป็นทางเลือกในกรณีที่การเปรียบเทียบแบบหลายตัวเลือก มาดูตัวอย่างในการใช้งาน
#define DEBUG
using System;
class PreprocessorDirectives
{
static void Main(string[] args)
{
#if DEBUG
Console.WriteLine("Program run in debug mode.");
#endif
}
}
ในตัวอย่างด้านบน เราได้ประกาศ symbol DEBUG
และใช้ directive #if ในการตรวจสอบ ใน expression #if DEBUG
โดยถ้าหาก DEBUG ถูกประกาศ คอมไพลเลอร์จะประมวลผลในบล็อคของ directive #if
ต่อไปมาดูตัวอย่างเพิ่มเติมในการใช้คำสั่งที่เหลือ
#define DEBUG
#define VERSION_2
using System;
class PreprocessorDirectives
{
static void Main(string[] args)
{
#if VERSION_1 && DEBUG
Console.WriteLine("Version 1 and debug mode is enabled.");
#elif VERSION_2 && DEBUG
Console.WriteLine("Version 2 and debug mode is enabled.");
#else
Console.WriteLine("Unknown version.");
#endif
}
}
ในตัวอย่าง เราได้ประกาศสอง symbol คือ DEBUG
และ VERSION_2
เราสามารถใช้ตัวดำเนินการตรรกศาสตร์ !
&&
และ ||
ในการสร้าง expression ย่อยได้ และเราได้ใช้ directive #elif และ #else ในการตรวจสอบสำหรับการมีหลายตัวเลือกเพื่อให้คอมไพเลอร์ตรวจสอบ
#warning and #error directives
ในภาษา C# ให้เราสามารถสั่งให้คอมไพลเลอร์สร้างการแจ้งเตือนได้โดยใช้ directive #warning
และสร้างข้อผิดพลาดโดยใช้ directive #error
ซึ่งมีประโยชน์ในการเตือนโปรแกรมเมอร์ในการเขียนโปรแกรม เพื่อบอกหรือเตือนบางอย่าง
ข้างล่างเป็นตัวอย่างในการใช้ #wringing และ #error ในภาษา C#
using System;
class PreprocessorDirectives
{
static void Main(string[] args)
{
Divide(3, 2);
DeprecatedMethod();
}
static float Divide (int a, int b)
{
#warning Divide two integers may cause of precision loss.
return a / b;
}
static void DeprecatedMethod ()
{
#error This method is deprecated.
}
}
ในตัวอย่าง เราได้ใช้ directive #warning ในการแจ้งเตือนถ้าหากมีการใช้เมธอด Divide()
ซึ่งเป็นเมธอดในการหารตัวเลข integer สองจำนวนซึ่งอาจจะทำให้เกิดข้อมูลสูญหาย และ directive #error ในการแจ้งเตือนถ้าหากมีการใช้เมธอดที่ยกเลิกการใช้งานแล้ว สำหรับการแจ้งเตือนที่เกิดโดย #error โปรแกรมจะไม่สามารถรันได้
นี่เป็นรูปผลลัพธ์ของ Error List Windows ใน Visual Studio เมื่อเราคอมไพล์โปรแกรม จะเกิดข้อความแจ้งเตือนและผิดพลาดเกิดขึ้น เพราะเราเรียกใช้เมธอดดังกล่าว ในการที่จะคอมไพล์โปรแกรมได้ ต้องนำโค้ดคำสั่งบรรทัดที่เรียกใช้เมธอด DeprecatedMethod()
ในเมธอด Main() ออกไป
#region and #endregion directives
ในภาษา C# ยังมี directive ที่ใช้สำหรับกำหนดกลุ่มของคำสั่งไว้ด้วยกัน คือ directive #region และสิ้นสุดด้วย directive #endregion มันมักจะถูกใช้สำหรับคอมเมนต์และแบ่งแยกส่วนต่างๆ ของโค้ดเพื่อให้ง่ายต่อการดูและตรวจสอบ มาดูตัวอย่างการใช้งาน
class RegionExample
{
#region variables declareations
int a;
float b;
#endregion
#region methods declaration
static void Method1 (string s)
{
}
static void Method2()
{
}
#endregion
}
ในตัวอย่าง เราได้สร้างสอง #region ในคลาส RegionExample
เพื่อใช้สำหรับแบ่งกลุ่มการประกาศสมาชิกของคลาสที่เป็นตัวแปรและเมธอด โดยในแต่ละบล็อกของ #region จะจบด้วย directive #endregion
ในบทนี้ คุณได้เรียนรู้เกี่ยวกับ preprocessor directives ประเภทต่างๆ ในภาษา C# และประโยชน์ในการนำไปใช้งานกับการเขียนโปรแกรม และคุณทราบว่า directive เหล่านี้ประมวลผลโดย preprocessor ในตอนคอมไพล์โปรแกรม