iT邦幫忙

2017 iT 邦幫忙鐵人賽
DAY 23
0
Modern Web

從Asp.Net MVC5的起跑點認識現代網站系列 第 23

Day23_NET Framework提供的診斷處理方式

前置處理器(Preprocessor Directive)

是在程式指示編譯器如何執行程式碼

規則

  • Preprocessor Directive以**#**符號開頭
  • 不需要「;」做結尾
  • 允許行尾註解,但內容不允許有「&」符號
#define Version
#define Version //註解

目前自己最常使用的是#region結尾#endregion,主要是方便自己清楚的瀏覽cs檔包含了哪些功能區塊

    #region 加入購物車
    程式區塊...
    #endregion

以符號當運算式傳給至#if的時候,可以用undef代表false和define代表true。
條件:必須放於C#程式碼最上面的位置和不能指定值給符號

#undef Version1
#define Version2

using..

static void Main(string[] args)
        {
#if (Version1)
            Console.WriteLine("Version1 code");
#endif
#if (Version2)
            Console.WriteLine("Version2 code");
#endif
            Console.Read();
        }

像上述程式就只會跑Version2

那這件事情可以用在哪裡呢?例如我們在做金流串接的時候,在沒用這個方法之前,我們要偵錯都必須先註解正式機的金流API,改用測試機的API來Debug,那現在知道這個方法後,我們就可以不用一值去註解發行跟偵測的兩種狀況了。

#if (!DEBUG)
            Console.WriteLine("Debug");
#else
            Console.WriteLine("Release");
#endif

從下圖可以看到把執行環境改成Debug狀態會跑Debug,程式碼不會執行區塊會以灰色字體呈現
http://ithelp.ithome.com.tw/upload/images/20170107/20103808ZLXQO6ThIM.png
把狀態改Release,可以執行else的動作
http://ithelp.ithome.com.tw/upload/images/20170107/20103808wPXR5TxSOs.png

但如果每個地方都要寫#if的判斷,反而會造成視覺上的凌亂,因此我們可以藉由Conditional來解決這個問題,這樣我們只要把他抽出來以function的方式,就不需要加一堆#if,更好讀出整個程式的邏輯

        [Conditional("DEBUG")]
        static void LogStatus(String msg)
        {
            Console.WriteLine("DEBUG GET MSG:"+msg);
            Trace.WriteLine(msg);
        }

這樣我們在很多地方就可以針對情境不同讓程式可以更好讀懂,也不用每次都跑去下註解,雖然上次看到專案裡面還是用原本針對情境註解調程式碼的方式,但我覺得這樣如果沒註明清楚,會導致後面維護的人,不懂為何同樣的程式碼會寫兩次,或是保留註解程式碼的用意適用不到還是在什麼情況下需要用到。

msdn:https://msdn.microsoft.com/zh-tw/library/ed8yd1ha.aspx
https://msdn.microsoft.com/en-us/library/3sxhs2ty.aspx
搜尋關鍵字:Conditional、Preprocessor directive


上一篇
Day22_Async Programming
下一篇
Day24_Controller之ActionResult(1)
系列文
從Asp.Net MVC5的起跑點認識現代網站30

尚未有邦友留言

立即登入留言