C#預處理器指令

“預處理器指令”這些命令從來不會轉化爲可執行代碼的命令,但會影響編譯過程的各個方面。例如,使用預處理器指令可以禁止編譯代碼的某一部分。如果計劃發佈兩個版本的代碼,即基本版本和擁有更多功能的企業版本,就可以使用這些預處理器命令。在編譯軟件的基本版本時,使用預處理器指令可以禁止編譯器編譯與額外功能相關的代碼。另外,在編寫提供調試信息的代碼時,使用預處理指令可以禁止編譯器編譯與額外功能相關的代碼。另外,在編寫提供調試信息的代碼時,也可以使用預處理指令。實際上,在銷售軟件時,一般不希望編譯這部分代碼。

  1. #define和undef#defing用法: #define DebugDebug可以看做是聲明一個變量,但此變量沒有真正的值,只是存在而已。#define單獨用沒什麼意義,一般是和#if結合使用。
  2. #define用法: #undef Debug作用就是刪除Debug的定義。如果Debug符號不存在,這條指令就沒有任何作用。如果Debug符號存在,則之前的#define Debug則無效。#define與#undef申明必須放在C#源文件的開頭位置,即程序集引用的開頭。以下是一個示例:
    #define DEBUG1
    #define DEBUG2
    using System;
    using System.Collections.Generic;
    using System.ComponentModel;
    using System.Data;
    using System.Drawing;
    using System.Linq;
    using System.Text;
    using System.Threading.Tasks;
    using System.Windows.Forms;
     
    namespace WindowsFormsApplication1
    {
    
    
        public partial class Form1 : Form
        {
    
    
            public Form1()
            {
                InitializeComponent();
            }
    
            private void Form1_Load(object sender, EventArgs e)
            {
    #if DEBUG1
                MessageBox.Show("Debug version1");
    #elif DEBUG2
                 MessageBox.Show("Debug version2");
    #else
                MessageBox.Show("Debug version3");
    #endif
    #if DEBUG2
                MessageBox.Show("Debug version2");
    #endif
    
            }
        }
    }
    

    
    
    
    
    
    執行結果:注意:這裏需要注意的地方就是對於if語句,從上到下執行,在執行的過程中如果有一個條件滿足將終止整個if語句。這與Switch....case語句不同,只要條件滿足就可以執行。#elif(=else
    if)與其含義相同。這裏Debug只是一個名稱,不是關鍵字。
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
  3. #warning和#error當編譯器遇到這兩條指令時,會分別產生警告和錯誤。如果編譯器遇到#warning指令,會顯示該指令後的文本,之後繼續編譯。如果遇見#error指令,也會顯示指令後面的文本,但會立刻退出編譯,不會產生IL代碼。(其實和編譯器的警告和錯誤意義相同)以下是一個示例:
    using System;
    using System.Collections.Generic;
    using System.ComponentModel;
    using System.Data;
    using System.Drawing;
    using System.Linq;
    using System.Text;
    using System.Threading.Tasks;
    using System.Windows.Forms;
     
    namespace WindowsFormsApplication1
    {
    
    
        public partial class Form1 : Form
        {
    
    
            public Form1()
            {
                InitializeComponent();
            }
    
            private void Form1_Load(object sender, EventArgs e)
            {
    #warning "ALL RIGHT?"
                { MessageBox.Show("Debug version1"); }
    #error "ALL RIGHT?"
                MessageBox.Show("Debug version1");
            }
        }
    }

    注意:當代碼編譯的過程中遇到error指令時,是無法編譯的。
  4. #region和#endregion將代碼進行收縮。
  5. #line使您可以修改編譯器的行號以及(可選)錯誤和警告的文件名輸出。其實功能類似於更改行號。
    class MainClass
    {
        static void Main()
        {
    #line 200 "Special"
            int i;    // CS0168 on line 200
            int j;    // CS0168 on line 201
    #line default
            char c;   // CS0168 on line 9
            float f;  // CS0168 on line 10
    #line hidden // numbering not affected
            string s; 
            double d; // CS0168 on line 13
        }
    }
  6. #pragma爲編譯器提供特殊的指令,以說明如何編譯包含帶有雜注的文件,這些指令必須是編譯器支持的指令。也就是說,不能使用#pragma創建自定義預處理指令。有以下兩個指令。(1)#pragma warning 可禁用或啓用某些警告。語法如下:#pragma warning disable warning-list#pragma warning restore warning-list以下爲示例:
    // pragma_warning.cs  
    using System;  
      
    #pragma warning disable 414, 3021  
    [CLSCompliant(false)]  
    public class C  
    {  
        int i = 1;  
        static void Main()  
        {  
        }  
    }  
    #pragma warning restore 3021  
    [CLSCompliant(false)]  // CS3021  
    public class D  
    {  
        int i = 1;  
        public static void F()  
        {  
        }  
    }  
    注意:當沒有指定警告編號時,disable禁用所有警告,而restore啓用所有警告。
    (2)#pargma checksum語法:#pragma checksum "filename" "{guid}" "check bytes"參數“filename”要求監視更改或更新新的文件名稱。參數“{guid}”文件的全局唯一標識符(GUID)。參數“checksum_byte”十六進制數的字符串,表示校驗和的字節。必須是偶數位的十六進制數。奇數編譯會導致編譯警告,發生錯誤。注意:目前不適合ASP.NET項目
    class TestClass  
    {  
        static int Main()  
        {  
            #pragma checksum "file.cs" "{3673e4ca-6098-4ec1-890f-8fceb2a794a2}" "{012345678AB}" // New checksum  
        }  
    }  



發佈了2 篇原創文章 · 獲贊 9 · 訪問量 5萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章